code: def post_reply(self):
      if self.thread_ts is None:
          raise ValueError(
              "Can only post reply if a post has been made."
          )
  
      job_link = self.doc_test_results.pop("job_link")
      self.doc_test_results.pop("failures")
      self.doc_test_results.pop("success")
      self.doc_test_results.pop("time_spent")
  
      sorted_dict = sorted(
          self.doc_test_results.items(), key=lambda t: t[0]
      )
      for job, job_result in sorted_dict:
          if len(job_result["failures"]):
              text = f"*Num failures* :{len(job_result['failed'])} \n"
              failures = job_result["failures"]
              blocks = self.get_reply_blocks(
                  job, job_link, failures, text=text
              )
  
              print("Sending the following reply")
              print(json.dumps({"blocks": blocks}))
  
              client.chat_postMessage(
                  channel=os.environ["CI_SLACK_CHANNEL_ID_DAILY"],
                  text=f"Results for {job}",
                  blocks=blocks,
                  thread_ts=self.thread_ts["ts"],
              )
  
              time.sleep(1)
  
imports: import collections
  import json
  import math
  import os
  import re
  import time
  from fnmatch import fnmatch
  from typing import Dict, List
  import requests
  from slack_sdk import WebClient
label_desc: Use image node_id 11 for calling the Message obj's underlying member method code with example usage: obj.post_reply() without return types