Advertisement
Chatenium

Untitled

Dec 30th, 2023
30
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.09 KB | None | 0 0
  1. socket$ = webSocket(`${environment.websocket_url}/ws/dm`)
  2. userOnChat = signal<string>("");
  3.  
  4. joinChat(chatid: string, userid: string) {
  5. if (this.userOnChat() != "") {
  6. this.socket$.next({
  7. Action: "leaveChat",
  8. Value: JSON.stringify({
  9. chatid: chatid,
  10. userid: userid
  11. }),
  12. })
  13. }
  14.  
  15. this.socket$.next({
  16. Action: "joinChat",
  17. Value: JSON.stringify({
  18. chatid: chatid,
  19. userid: userid
  20. }),
  21. })
  22. }
  23.  
  24. getNewMessages() {
  25. return new Observable<message>((subscriber) => {
  26. const getMsg = this.socket$.subscribe(
  27. (message) => {
  28. let action = (message as websocketDef).action
  29. switch (action) {
  30. case "newMessage":
  31. subscriber.next(message as message)
  32. break
  33. }
  34. },
  35. (error) => {
  36. console.error('WebSocket error:', error);
  37. }
  38. )
  39. return () => {
  40. getMsg.unsubscribe()
  41. }
  42. })
  43. }
  44.  
  45.  
  46. /////////////// BACKEND
  47. package dm
  48.  
  49. import (
  50. "ChateniumAPI/config"
  51. "encoding/json"
  52. "fmt"
  53. "net/http"
  54. "sync"
  55.  
  56. "github.com/gin-gonic/gin"
  57. "github.com/gorilla/websocket"
  58. )
  59.  
  60. var (
  61. upgrader = websocket.Upgrader{
  62. CheckOrigin: func(r *http.Request) bool {
  63. return true
  64. },
  65. }
  66.  
  67. Rm = &roomManager{
  68. rooms: make(map[string]*Chat),
  69. mu: sync.Mutex{},
  70. }
  71. )
  72.  
  73. type roomManager struct {
  74. rooms map[string]*Chat
  75. mu sync.Mutex
  76. }
  77.  
  78. type Chat struct {
  79. users map[string]*User
  80. }
  81.  
  82. type User struct {
  83. Connection *websocket.Conn
  84. }
  85.  
  86. func (rm *roomManager) addUser(conn *websocket.Conn, chatid string, userid string) error {
  87. rm.mu.Lock()
  88. defer rm.mu.Unlock()
  89.  
  90. chat, chatExist := rm.rooms[chatid]
  91. if !chatExist {
  92. rm.rooms[chatid] = &Chat{make(map[string]*User)}
  93. chat = &Chat{make(map[string]*User)}
  94. }
  95.  
  96. _, userExist := chat.users[userid]
  97. if userExist {
  98. return fmt.Errorf("User %s already exists in chat %s", userid, chatid)
  99. }
  100.  
  101. chat.users[userid] = &User{Connection: conn}
  102. return nil
  103. }
  104.  
  105. func (rm *roomManager) deleteUser(chatid string, userid string) {
  106. rm.mu.Lock()
  107. defer rm.mu.Unlock()
  108.  
  109. chat, chatExist := rm.rooms[chatid]
  110. if chatExist {
  111. delete(chat.users, userid)
  112. }
  113. }
  114.  
  115. func (rm *roomManager) Broadcast(message interface{}, chatid string) {
  116. rm.mu.Lock()
  117. defer rm.mu.Unlock()
  118. fmt.Println(message)
  119.  
  120. chat, chatExist := rm.rooms[chatid]
  121. if chatExist {
  122. for _, userConn := range chat.users {
  123. fmt.Println(userConn)
  124. if userConn.Connection != nil {
  125. if err := userConn.Connection.WriteJSON(message); err != nil {
  126. fmt.Println("Error broadcasting:", err)
  127. }
  128. }
  129. }
  130. }
  131. }
  132.  
  133. func SetupDMWebsocket(c *gin.Context) {
  134. conn, err := upgrader.Upgrade(c.Writer, c.Request, nil)
  135. if err != nil {
  136. fmt.Println("WebSocket Upgrade Error:", err)
  137. return
  138. }
  139.  
  140. for {
  141. _, p, err := conn.ReadMessage()
  142. if err != nil {
  143. fmt.Println("WebSocket Read Error:", err)
  144. return
  145. }
  146.  
  147. var message config.Websocket_DefaultMessage
  148. if err := json.Unmarshal(p, &message); err != nil {
  149. fmt.Println("JSON Unmarshal Error:", err)
  150. return
  151. }
  152.  
  153. switch message.Action {
  154. case "joinChat":
  155. var data struct {
  156. Chatid string `json:"chatid"`
  157. Userid string `json:"userid"`
  158. }
  159.  
  160. if err := json.Unmarshal([]byte(message.Value), &data); err != nil {
  161. fmt.Println("JSON Unmarshal Error:", err)
  162. return
  163. }
  164.  
  165. if err := AuthorizationDM(c, data.Chatid, data.Userid); err != nil {
  166. fmt.Println("Authorization Error:", err)
  167. return
  168. }
  169.  
  170. if err := Rm.addUser(conn, data.Chatid, data.Userid); err != nil {
  171. fmt.Println("Add User Error:", err)
  172. }
  173.  
  174. case "leaveChat":
  175. var data struct {
  176. Chatid string `json:"chatid"`
  177. Userid string `json:"userid"`
  178. }
  179.  
  180. if err := json.Unmarshal([]byte(message.Value), &data); err != nil {
  181. fmt.Println("JSON Unmarshal Error:", err)
  182. return
  183. }
  184.  
  185. Rm.deleteUser(data.Chatid, data.Userid)
  186. }
  187. }
  188. }
  189.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement