chat.rkt 3.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. #lang racket
  2. (provide (all-defined-out))
  3. (require net/url
  4. net/rfc6455 ;; web sockets
  5. json
  6. "api.rkt")
  7. (ws-idle-timeout +inf.0)
  8. ;; Creates a new connection and spaws threads for handling incoming events
  9. ;; and for sending pings.
  10. ;; Returns an object that can be used with e.g. send-message
  11. (define (make-connection server-addr user-name
  12. #:on-chat on-chat ;;; called with (on-chat from message)
  13. #:on-response on-response ;;; called with (on-response message)
  14. #:on-users on-users ;;; called with (on-users users)
  15. #:on-notify on-notify ;;; called with (on-notify msg)
  16. #:on-join on-join ;;; called with (on-join user)
  17. #:on-leave on-leave ;;; called with (on-leave user)
  18. #:on-name-change on-name-change
  19. ;;; called with (on-name-change old-name new-name)
  20. )
  21. (define c (ws-connect (string->url server-addr)))
  22. (define user-color "#00FFAA")
  23. (define evt (ws-recv-evt c))
  24. (define (handle-evt)
  25. (let ([v (sync evt)])
  26. (cond
  27. [(eof-object? v)
  28. (printf "RIP socket\n")
  29. (ws-close! c)]
  30. [(string? v)
  31. (let ([js (string->jsexpr v)])
  32. (cond
  33. [(is-chat-message? js)
  34. (define msg (get-chat-message js))
  35. (match msg
  36. [(chat-message message from color type)
  37. (match type
  38. ['chat (on-chat from message)]
  39. ['response (on-response message)]
  40. [_
  41. (log-warning
  42. (format "chat.rkt/handl-evt: cannot handle message type in ~s" msg))])])]
  43. [(is-users-reply? js)
  44. (on-users (get-users-reply js))]
  45. [(is-notify? js)
  46. (log-info (format "MovieNight notification: ~a" js))
  47. (on-notify (get-notify js))]
  48. [(is-event? js)
  49. (log-info (format "got ~a" js))
  50. (define ed (get-event-data js))
  51. (match ed
  52. [(event-data type data)
  53. (match type
  54. ['join (on-join data)]
  55. ['leave (on-leave data)]
  56. [(or 'name-changed
  57. 'name-change-forced)
  58. (match (string-split data ":")
  59. [(list old-nick new-nick)
  60. (on-name-change old-nick new-nick)]
  61. [_ #f])]
  62. [_
  63. (log-warning
  64. (format "chat.rkt/handl-evt: cannot handle event type in ~s" ed))])])]
  65. [else
  66. (log-warning
  67. (format "chat.rkt/handle-evt: don't know how to handle ~a" (jsexpr->string js)))]))
  68. (handle-evt)]
  69. [else
  70. (printf "Unknown msg: ~a" v)
  71. (handle-evt)])))
  72. (define (do-ping)
  73. (sleep 10)
  74. (send-ping c)
  75. (do-ping))
  76. (void (thread handle-evt))
  77. (void (thread do-ping))
  78. (send-join c user-name user-color)
  79. (sleep 2)
  80. (send-users c)
  81. c)
  82. (define (nickname-check nick)
  83. (and (>= (string-length nick) 3)
  84. (<= (string-length nick) 10)
  85. ;; TODO other checks
  86. ))