การดู : 0
12/04/2026 18:18น.

EP.46 การเพิ่มฟีเจอร์กำหนดสถานะผู้ใช้ (Custom User Status) ใน WebSocket Chat
#Chat Presence
#Chat UX
#Custom Status
#WebSocket API
#Real-Time Chat
#Golang
#Go
#WebSocket
#User Status
ทำไมต้องมีฟีเจอร์กำหนดสถานะผู้ใช้?
ฟีเจอร์ Custom User Status หรือ การกำหนดสถานะผู้ใช้ ช่วยให้ผู้ใช้สามารถระบุสถานะของตนเองในระบบแชทได้ เช่น:
- "ออนไลน์" (Online) - พร้อมสนทนา
- "ไม่ว่าง" (Busy) - อยู่ในโหมดห้ามรบกวน
- "ออฟไลน์" (Offline) - ไม่พร้อมสนทนา
การแสดงสถานะของผู้ใช้ช่วยให้การสนทนามีประสิทธิภาพมากขึ้น และช่วยลดปัญหาการส่งข้อความไปหาเพื่อนที่อาจไม่พร้อมตอบกลับ
โครงสร้างของระบบกำหนดสถานะผู้ใช้ใน WebSocket Chat
- WebSocket Server - คอยติดตามและอัปเดตสถานะของผู้ใช้แบบเรียลไทม์
- Frontend (Client-Side) - ให้ผู้ใช้เลือกและอัปเดตสถานะของตนเอง
- Database (Optional) - หากต้องการบันทึกสถานะของผู้ใช้ระยะยาว
การเพิ่มฟีเจอร์ Custom User Status ใน WebSocket Server
1. อัปเกรด WebSocket Server ให้รองรับการกำหนดสถานะ
ไฟล์ websocket_server.go
package main
import (
"encoding/json"
"fmt"
"net/http"
"sync"
"github.com/gorilla/websocket"
)
type UserStatus struct {
Username string `json:"username"`
Status string `json:"status"`
}
var upgrader = websocket.Upgrader{
CheckOrigin: func(r *http.Request) bool { return true },
}
var (
clients = make(map[*websocket.Conn]string)
userStatuses = make(map[string]string)
broadcast = make(chan UserStatus)
mu sync.Mutex
)
func handleConnections(w http.ResponseWriter, r *http.Request) {
conn, _ := upgrader.Upgrade(w, r, nil)
defer conn.Close()
var username string = r.URL.Query().Get("username")
mu.Lock()
clients[conn] = username
userStatuses[username] = "ออนไลน์"
mu.Unlock()
broadcast <- UserStatus{Username: username, Status: "ออนไลน์"}
for {
var statusUpdate UserStatus
err := conn.ReadJSON(&statusUpdate)
if err != nil {
mu.Lock()
delete(clients, conn)
delete(userStatuses, username)
mu.Unlock()
broadcast <- UserStatus{Username: username, Status: "ออฟไลน์"}
break
}
mu.Lock()
userStatuses[statusUpdate.Username] = statusUpdate.Status
mu.Unlock()
broadcast <- statusUpdate
}
}
func handleMessages() {
for {
statusUpdate := <-broadcast
fmt.Printf("User %s updated status: %s\n", statusUpdate.Username, statusUpdate.Status)
for client := range clients {
err := client.WriteJSON(statusUpdate)
if err != nil {
client.Close()
mu.Lock()
delete(clients, client)
mu.Unlock()
}
}
}
}
func main() {
http.HandleFunc("/ws", handleConnections)
go handleMessages()
fmt.Println("WebSocket Server Running on Port 8080")
http.ListenAndServe(":8080", nil)
}2. การเพิ่มฟังก์ชัน Custom User Status ใน Frontend (Client-Side)
ไฟล์ client.js
const username = prompt("Enter your username:");
const socket = new WebSocket(`ws://localhost:8080/ws?username=${username}`);
const statusSelect = document.getElementById("status-select");
const statusDisplay = document.getElementById("status-display");
socket.onmessage = (event) => {
const data = JSON.parse(event.data);
updateUserStatus(data.username, data.status);
};
function updateUserStatus(username, status) {
const statusElement = document.createElement("p");
statusElement.innerText = `${username} is now ${status}`;
statusDisplay.appendChild(statusElement);
}
function changeStatus() {
const newStatus = statusSelect.value;
socket.send(JSON.stringify({ username, status: newStatus }));
}การแสดง Custom User Status บน UI
ไฟล์ index.html
<select id="status-select" onchange="changeStatus()">
<option value="ออนไลน์">ออนไลน์</option>
<option value="ไม่ว่าง">ไม่ว่าง</option>
<option value="ออฟไลน์">ออฟไลน์</option>
</select>
<div id="status-display"></div>3. การทดสอบระบบ
- รัน WebSocket Server
go run websocket_server.go- เปิดหน้าเว็บหลายแท็บและตั้งค่าชื่อผู้ใช้
- เปลี่ยนสถานะแล้วดูผลลัพธ์ที่ UI และ WebSocket Server
ท้าให้ลอง!
ลองเพิ่ม สถานะเพิ่มเติม เช่น "กำลังพิมพ์..." หรือ "กำลังประชุม" เพื่อให้การสื่อสารสมจริงยิ่งขึ้น
EP ถัดไป
ใน EP.47, เราจะเพิ่ม ฟีเจอร์โหมดห้ามรบกวน (Do Not Disturb Mode) ใน WebSocket Chat 🚀