{"id":25171502,"url":"https://github.com/basemax/messengersocketws","last_synced_at":"2025-07-26T00:10:42.636Z","repository":{"id":38977604,"uuid":"405650782","full_name":"BaseMax/MessengerSocketWS","owner":"BaseMax","description":"Design own Messenger Chatroom: This project took more than ten hours to try to design a native messaging infrastructure. (Own messenger project using Pure Web Socket, not Socket.IO)","archived":false,"fork":false,"pushed_at":"2024-10-11T10:46:56.000Z","size":667,"stargazers_count":6,"open_issues_count":0,"forks_count":0,"subscribers_count":2,"default_branch":"main","last_synced_at":"2025-05-04T21:45:43.762Z","etag":null,"topics":["mysql","mysql-query","nodejs","socketio","sql","websocket","websocket-api","websocket-application","websocket-chat","websocket-client","websocket-server","ws","wss"],"latest_commit_sha":null,"homepage":"","language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/BaseMax.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2021-09-12T13:34:34.000Z","updated_at":"2024-10-11T10:46:52.000Z","dependencies_parsed_at":"2024-09-14T19:39:47.686Z","dependency_job_id":null,"html_url":"https://github.com/BaseMax/MessengerSocketWS","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/BaseMax%2FMessengerSocketWS","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/BaseMax%2FMessengerSocketWS/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/BaseMax%2FMessengerSocketWS/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/BaseMax%2FMessengerSocketWS/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/BaseMax","download_url":"https://codeload.github.com/BaseMax/MessengerSocketWS/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":252575898,"owners_count":21770649,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["mysql","mysql-query","nodejs","socketio","sql","websocket","websocket-api","websocket-application","websocket-chat","websocket-client","websocket-server","ws","wss"],"created_at":"2025-02-09T09:20:41.717Z","updated_at":"2025-05-05T20:50:30.379Z","avatar_url":"https://github.com/BaseMax.png","language":"JavaScript","readme":"# Messenger WS Socket (Old OnSystem Chat)\n\nThis project took more than ten hours to try to design a native messaging infrastructure.\nIts database is a bit complicated, you can check and view its queries.\n\nIt was a very interesting and good experience.\n\n## Features\n\n- [x] Pure websocket (Not socket.io)\n- [x] Auth/Login\n- [x] Chat\n- [x] Private Chat\n- [x] Group Chat\n- [x] Auto-reconnect\n- [x] Detect list of online users and active rooms\n\n## Preview client-side\n![](demo1.png)\n\n![](demo2.png)\n\n## Using\n\n```\nnode app.js\n```\nOpen the `http://localhost:5000/` in the browser.\n\nIf you easily want to test and debug, there are some test links:\n\n- `http://localhost:5000/?u=1`\n- `http://localhost:5000/?u=2`\n- `http://localhost:5000/?u=3`\n- `http://localhost:5000/?u=4`\n\n## Database\n\nMariadb, please import `onsystem.sql` file and put your database configuration details in `app.js` file.\n\n### Queries\n\n#### AUTH CONNECT\n```\nSELECT user.*\n\t\tFROM auth\n\t\tINNER JOIN user ON auth.user = user.id\n\t\tWHERE session = '...' AND secret = '...' AND status = 1\n\t\t;\n```\n\n#### Old version: PV CHAT LIST OF `user2`\n```\nSELECT\n\tMAX(message.id) as message_id,\n\t(case when (roomtype = 1) THEN 'GROUP' ELSE 'USER' END) as to_type,\n\tuser2.firstname as to_firstname,\n\tuser2.lastname as to_lastname,\n\tuser as from_id,\n\t(case when (message.type = 0) THEN 'MESSAGE' ELSE 'FILE' END) as message_type,\n\tcaption,\n\tuser.firstname as from_firstname,\n\tuser.lastname as from_lastname\n\tFROM\n\t\tmessage\n\tINNER JOIN\n\t\tuser\n\t\tON\n\t\t\tuser.id = message.user\n\tINNER JOIN\n\t\tuser as user2\n\t\tON\n\t\t\tuser2.id = message.room\n\tWHERE\n\troomtype=2\n\t\tAND (room = ${socket.info.id} OR user = ${socket.info.id})\n\tGROUP BY user\n\tORDER BY message_id DESC\n\t;\n```\n\n#### Old version: GROUP CHAT LIST OF `user2`\n\n```\nSELECT\n\t\tmessage.id as message_id,\n\t\t(case when (message.roomtype = 1) THEN 'GROUP' ELSE 'USER' END) as to_type,\n\t\troom.name as to_firstname, '' as to_lastname,\n\t\tmessage.user as from_id,\n\t\t(case when (message.type = 0) THEN 'MESSAGE' ELSE 'FILE' END) as message_type,\n\t\tmessage.caption,\n\t\tuser.firstname as from_firstname,\n\t\tuser.lastname as from_lastname\n\tFROM\n\t\tmessage\n\tINNER JOIN\n\t\troom_member\n\t\tON\n\t\t\tmessage.room = room_member.room\n\tINNER JOIN\n\t\tuser\n\t\tON\n\t\t\tuser.id = message.user\n\tINNER JOIN\n\t\troom\n\t\tON\n\t\t\troom.id = message.room\n\tWHERE\n\t\troom_member.user = ${socket.info.id}\n\t\tAND\n\t\tmessage.roomtype = 1\n\tORDER BY message_id DESC\n\t;\n```\n\n#### Old: ALL CHAT LIST OF `user2`\n```\n(\n\tSELECT\n\t\tMAX(message.id) as message_id,\n\t\t(case when (roomtype = 1) THEN 'GROUP' ELSE 'USER' END) as to_type,\n\t\tuser2.firstname as to_firstname,\n\t\tuser2.lastname as to_lastname,\n\t\tuser as from_id,\n\t\t(case when (message.type = 0) THEN 'MESSAGE' ELSE 'FILE' END) as message_type,\n\t\tcaption,\n\t\tuser.firstname as from_firstname,\n\t\tuser.lastname as from_lastname\n\t\tFROM\n\t\t\tmessage\n\t\tINNER JOIN\n\t\t\tuser\n\t\t\tON\n\t\t\t\tuser.id = message.user\n\t\tINNER JOIN\n\t\t\tuser as user2\n\t\t\tON\n\t\t\t\tuser2.id = message.room\n\t\tWHERE\n\t\troomtype=2\n\t\t\tAND (room = ${socket.info.id} OR user = ${socket.info.id})\n\t\tGROUP BY user\n\t)\n\tUNION\n\t(\n\t\tSELECT\n\t\t\tmessage.id as message_id,\n\t\t\t(case when (message.roomtype = 1) THEN 'GROUP' ELSE 'USER' END) as to_type,\n\t\t\troom.name as to_firstname, '' as to_lastname,\n\t\t\tmessage.user as from_id,\n\t\t\t(case when (message.type = 0) THEN 'MESSAGE' ELSE 'FILE' END) as message_type,\n\t\t\tmessage.caption,\n\t\t\tuser.firstname as from_firstname,\n\t\t\tuser.lastname as from_lastname\n\t\tFROM\n\t\t\tmessage\n\t\tINNER JOIN\n\t\t\troom_member\n\t\t\tON\n\t\t\t\tmessage.room = room_member.room\n\t\tINNER JOIN\n\t\t\tuser\n\t\t\tON\n\t\t\t\tuser.id = message.user\n\t\tINNER JOIN\n\t\t\troom\n\t\t\tON\n\t\t\t\troom.id = message.room\n\t\tWHERE\n\t\t\troom_member.user = ${socket.info.id}\n\t\t\tAND\n\t\t\tmessage.roomtype = 1\n\t)\n\tORDER BY message_id DESC\n\t;\n```\n\n### Query\n\n```\nSELECT\n\t    message.id as message_id,\n\t    message.caption as message_caption,\n\t    message.type as message_type,\n\t    message.filename as message_filename,\n\t    (SELECT CONCAT(user.firstname, \" \", user.lastname) as name FROM user as a WHERE id = message.user) as message_sender,\n\t    room.id as room_id,\n\t    (CASE WHEN room.name IS NULL THEN 'USER' ELSE 'GROUP' END) as room_type,\n\t    IFNULL(room.name, (SELECT CONCAT(u.firstname, \" \", u.lastname) AS u FROM room_member as r INNER\n\t           JOIN user as u ON r.user = u.id WHERE r.room = room.id AND u.id != 1\n\t\t)) as room_name\n\tFROM\n\t\troom_member\n\tINNER JOIN\n\t\troom\n\t\tON\n\t\t\troom_member.room = room.id\n\tINNER JOIN\n\t\tmessage\n\t\tON\n\t\t\tmessage.room = room.id\n\tINNER JOIN\n\t\tuser\n\t\tON\n\t\t\tuser.id = message.user\n\tWHERE\n\t\troom_member.user = 1\n\t#    AND\n\t#    room.id = 3\n\tGROUP BY\n\t\troom.id\n\tORDER BY\n\t\tmessage_id DESC\n\t;\n```\n\n#### SELECT NUMBER OF PERSONAL ROOM WITH OTHER ACCOUNTS YOU HAVE ('1' user)\n\n```\nSELECT\n\t\tCOUNT(*)\n\t    AS\n\t    \tcount\n\tFROM\n\t(\n\t\tSELECT\n\t        #COUNT(room.id) as count\n\t        room.id\n\t        #CONCAT(user.firstname, ' ', user.lastname) as name,\n\t        #(SELECT COUNT(r.id) FROM room_member as r WHERE room = room.id) as members,\n\t        #(SELECT COUNT(rm.user) FROM room_member as rm WHERE rm.room = room.id AND rm.user = 1) as my_at\n\t    FROM\n\t        room\n\t    INNER JOIN\n\t        room_member\n\t        ON\n\t            room_member.room = room.id\n\t    INNER JOIN\n\t        user\n\t        ON\n\t            user.id = room_member.user\n\t    WHERE\n\t        user.id != 1\n\t    #\t(\n\t    #        room_member.user = 4\n\t    #        OR\n\t    #        room_member.user = 1\n\t    #    )\n\t        AND\n\t        room.isgroup = 0\n\t    GROUP BY\n\t        room.id\n\t    HAVING\n\t        (SELECT COUNT(rm.user) FROM room_member as rm WHERE rm.room = room.id AND rm.user = 1) = 1\n\t    #    AND\n\t    #    (SELECT COUNT(rm.user) FROM room_member as rm WHERE rm.room = room.id AND rm.user != 1) = 2\n\t        AND\n\t        (SELECT COUNT(r.id) FROM room_member as r WHERE room = room.id) = 2\n\n\t    #(SELECT COUNT(id) FROM `room_member` WHERE user = 4;\n\t    #SELECT COUNT(id) FROM `room_member` WHERE user = 1;\n\t)\n\tas count\n\t;\n```\n\n\n#### DOES USER `1' has a private room with user '3'? if count is 0 mean no, if that is 1, so yes they have a private room\n```\nSELECT\n\t\t3\n\tIN\n\t(\n\t\tSELECT\n\t    \tuser.id\n\t    FROM\n\t        room\n\t    INNER JOIN\n\t        room_member\n\t        ON\n\t            room_member.room = room.id\n\t    INNER JOIN\n\t        user\n\t        ON\n\t            user.id = room_member.user\n\t    WHERE\n\t        user.id != 1\n\t        AND\n\t        room.isgroup = 0\n\t    GROUP BY\n\t        room.id\n\t    HAVING\n\t        (SELECT COUNT(rm.user) FROM room_member as rm WHERE rm.room = room.id AND rm.user = 1) = 1\n\t        AND\n\t        (SELECT COUNT(r.id) FROM room_member as r WHERE room = room.id) = 2\n\t)\n\tas count\n\t;\n```\n\n© Copyright Max Base, 2021\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbasemax%2Fmessengersocketws","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fbasemax%2Fmessengersocketws","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbasemax%2Fmessengersocketws/lists"}