chat.nim 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. import
  2. ../server_api/api,
  3. asyncdispatch,
  4. httpclient,
  5. nodesnim,
  6. json
  7. var
  8. thr: Thread[tuple[scene: ptr SceneRef, username: ptr string, timed_chat: ptr seq[JsonNode]]]
  9. gradient = GradientDrawable()
  10. gradient.setCornerColors(Color("#C9D6FF"), Color("#C9D6FF"), Color("#E2E2E2"), Color("#E2E2E2"))
  11. build:
  12. - Scene (chat_scene):
  13. - Control background:
  14. call:
  15. setBackground(gradient)
  16. setSizeAnchor(1, 1)
  17. - VBox vbox:
  18. call:
  19. setSizeAnchor(1, 0.8)
  20. - EditText message:
  21. call:
  22. setSizeAnchor(0.95, 0.15)
  23. setAnchor(0.5, 1, 0.5, 1.2)
  24. setStyle(style({
  25. border-radius: 8,
  26. border-detail: 8,
  27. background-color: rgba(50, 60, 70, 0.5)
  28. }))
  29. proc listenChat(arg: tuple[scene: ptr SceneRef, username: ptr string, timed_chat: ptr seq[JsonNode]]) {.thread.} =
  30. var client = newAsyncHttpClient()
  31. while true:
  32. var
  33. response = waitFor client.get("http://127.0.0.1:5000/getchat")
  34. tmp_chat = arg.timed_chat
  35. arg.timed_chat[] = parseJson(waitFor response.body())["data"].getElems
  36. {.cast(gcsafe).}:
  37. arg.scene[][0].removeChild(0)
  38. build:
  39. - VBox chat:
  40. separator: 8
  41. call:
  42. resize(arg.scene[].rect_size.x, 0)
  43. setSizeAnchor(1, 0.65)
  44. arg.scene[][0].insertChild(0, chat)
  45. var i = 0
  46. while i < arg.timed_chat[].len:
  47. if tmp_chat[][i].kind != JString:
  48. continue
  49. {.cast(gcsafe).}:
  50. build:
  51. - Control back:
  52. - Label label:
  53. call:
  54. setText(arg.timed_chat[][i].str & ": " & arg.timed_chat[][i+1].str)
  55. call:
  56. setSizeAnchor(1, 0)
  57. resize(0, label.rect_size.y)
  58. chat.addChild(back)
  59. if tmp_chat[][i].str == username:
  60. label.setStyle(style({
  61. border-radius: 10,
  62. border-detail: 8,
  63. background-color: "#ffc"
  64. }))
  65. label.setAnchor(1, 0, 1, 0)
  66. else:
  67. label.setStyle(style({
  68. border-radius: 10,
  69. border-detail: 8,
  70. background-color: "#dda"
  71. }))
  72. chat.calcPositionAnchor()
  73. back.calcPositionAnchor()
  74. label.calcPositionAnchor()
  75. inc i, 2
  76. waitFor sleepAsync(100)
  77. background@onEnter(self):
  78. createThread(thr, listenChat, (chat_scene.addr, username.addr, timed_chat.addr))
  79. background@onInput(self, event):
  80. if isActionJustPressed("send"):
  81. if message.getText().len > 0:
  82. sendMessage(message.getText())
  83. message.setText("")