drive_chatview2.py 2.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. #!/usr/bin/env python3
  2. # Drives the single-screen chatview2 cutover over netdebug:
  3. # set_channel, insert lines, switch channels, verify per-channel state.
  4. import sys
  5. sys.path.insert(0, "pydrk")
  6. from pydrk.api import Api
  7. from pydrk import serial as s
  8. CHATTY = "/window/content/chat/main_chat_layer/content/chatty"
  9. PRIV = CHATTY + "/privmsg"
  10. def enc_insert(ts, mid, nick, text):
  11. b = bytearray()
  12. s.write_u64(b, ts)
  13. b += mid
  14. s.encode_str(b, nick)
  15. s.encode_str(b, text)
  16. return bytes(b)
  17. def dec_line_ids(data):
  18. cur = s.Cursor(bytearray(data))
  19. out = []
  20. while cur.i < len(cur.by):
  21. ts = s.read_u64(cur)
  22. mid = bytes(cur.read(32))
  23. out.append((ts, mid[:4].hex()))
  24. return out
  25. api = Api()
  26. api.hello()
  27. print("== scene has chatview2:", api.get_children(CHATTY)[0][0] if api.get_children(CHATTY) else None)
  28. # Bind #dev and insert history
  29. api.call_method(CHATTY, "set_channel", s.encode_str(bytearray(), "#dev"))
  30. for i in range(5):
  31. api.call_method(
  32. PRIV, "insert_line",
  33. enc_insert(1_756_000_000_000 + i * 60_000, bytes([i]) + b"\x00" * 31, "alice", f"dev message {i}"),
  34. )
  35. res = api.call_method(CHATTY, "get_line_ids", b"")
  36. lines = dec_line_ids(res) if res else []
  37. print(f"== #dev lines: {len(lines)}")
  38. for ts, mid in lines:
  39. print(" ", ts, mid)
  40. # Switch to #random, insert 2 lines
  41. api.call_method(CHATTY, "set_channel", s.encode_str(bytearray(), "#random"))
  42. for i in range(2):
  43. api.call_method(
  44. PRIV, "insert_line",
  45. enc_insert(1_756_000_100_000 + i * 60_000, bytes([10 + i]) + b"\x00" * 31, "bob", f"random message {i}"),
  46. )
  47. res = api.call_method(CHATTY, "get_line_ids", b"")
  48. print(f"== #random lines: {len(dec_line_ids(res) if res else [])}")
  49. # Back to #dev: its lines must be back (buffer reload), newest first
  50. api.call_method(CHATTY, "set_channel", s.encode_str(bytearray(), "#dev"))
  51. res = api.call_method(CHATTY, "get_line_ids", b"")
  52. lines = dec_line_ids(res) if res else []
  53. print(f"== #dev lines after round-trip: {len(lines)} (expect 5)")
  54. assert len(lines) == 5, "channel state not restored"
  55. # is_at_bottom property readable
  56. v = api.get_property_value(CHATTY, "is_at_bottom")
  57. print("== is_at_bottom:", v)
  58. # delete_line removes one and it survives the next reload
  59. mid4 = bytes([4]) + b"\x00" * 31
  60. b = bytearray()
  61. b += mid4
  62. api.call_method(CHATTY, "delete_line", bytes(b))
  63. api.call_method(CHATTY, "set_channel", s.encode_str(bytearray(), "#dev"))
  64. res = api.call_method(CHATTY, "get_line_ids", b"")
  65. lines = dec_line_ids(res) if res else []
  66. print(f"== #dev lines after delete+reload: {len(lines)} (expect 4)")
  67. assert len(lines) == 4
  68. print("OK")