chat document update

This commit is contained in:
2023-08-12 15:26:32 +09:00
parent 5e953d6131
commit a08353a920
4 changed files with 312 additions and 123 deletions

View File

@ -14,6 +14,7 @@ import (
"github.com/go-redis/redis/v8"
"repositories.action2quare.com/ayo/gocommon"
"repositories.action2quare.com/ayo/gocommon/flagx"
"repositories.action2quare.com/ayo/gocommon/logger"
"repositories.action2quare.com/ayo/gocommon/wshandler"
@ -21,6 +22,8 @@ import (
"go.mongodb.org/mongo-driver/bson/bsonrw"
)
var devflag = flagx.Bool("dev", false, "")
const (
defaultMaxMemory = 32 << 10 // 32 KB
)
@ -65,7 +68,7 @@ func readBsonDoc(r io.Reader, src any) error {
type TavernConfig struct {
gocommon.RegionStorageConfig `json:",inline"`
Group2 map[string]configDocument `json:"tavern_group_types"`
Group map[string]configDocument `json:"tavern_group_types"`
MaingateApiToken string `json:"maingate_api_token"`
RedisURL string `json:"tavern_redis_url"`
macAddr string
@ -80,7 +83,7 @@ type Tavern struct {
type subTavern struct {
mongoClient gocommon.MongoClient
redisClient *redis.Client
redison *gocommon.RedisonHandler
wsh *wshandler.WebsocketHandler
region string
groups map[string]group
@ -147,10 +150,12 @@ func (tv *Tavern) prepare(ctx context.Context) error {
return err
}
redison := gocommon.NewRedisonHandler(redisClient.Context(), redisClient)
sub := &subTavern{
wsh: tv.wsh,
mongoClient: dbconn,
redisClient: redisClient,
redison: redison,
region: region,
apiFuncs: &apiFuncsContainer{
normfuncs: make(map[string]apiFuncType),
@ -159,7 +164,7 @@ func (tv *Tavern) prepare(ctx context.Context) error {
}
groups := make(map[string]group)
for typename, cfg := range config.Group2 {
for typename, cfg := range config.Group {
gtype, ok := groupTypeContainer()[typename]
if !ok {
return fmt.Errorf("%s group type is not valid", typename)
@ -203,7 +208,7 @@ func (tv *Tavern) RegisterHandlers(ctx context.Context, serveMux *http.ServeMux,
func (sub *subTavern) OnClientMessageReceived(sender *wshandler.Sender, messageType wshandler.WebSocketMessageType, body io.Reader) {
if messageType == wshandler.Connected {
logger.Println("OnClientMessageReceived : connected ", sender.Accid.Hex())
sub.redisClient.HSet(sub.redisClient.Context(), sender.Accid.Hex(), "_ts", time.Now().UTC().Unix()).Result()
sub.redison.HSet(sub.redison.Context(), sender.Accid.Hex(), "_ts", time.Now().UTC().Unix()).Result()
for _, gt := range sub.groups {
gt.ClientMessageReceived(sender, messageType, nil)
}
@ -215,7 +220,7 @@ func (sub *subTavern) OnClientMessageReceived(sender *wshandler.Sender, messageT
gt.ClientMessageReceived(sender, messageType, rooms)
}
}
sub.redisClient.Del(sub.redisClient.Context(), sender.Accid.Hex()).Result()
sub.redison.Del(sub.redison.Context(), sender.Accid.Hex()).Result()
logger.Println("OnClientMessageReceived : disconnected ", sender.Accid.Hex())
} else if messageType == wshandler.BinaryMessage {
var commandline []any
@ -240,11 +245,29 @@ func (sub *subTavern) OnClientMessageReceived(sender *wshandler.Sender, messageT
}
func (sub *subTavern) OnRoomCreated(region, name string) {
created, err := sub.redison.JSONSet(name, "$", map[string]any{
"_refcnt": 1,
}, gocommon.RedisonSetOptionNX)
if err != nil && !errors.Is(err, redis.Nil) {
logger.Println("OnRoomCreated JSONSet failed :", err)
return
}
if !created {
_, err = sub.redison.JSONNumIncrBy(name, "$._refcnt", 1)
if err != nil {
logger.Println("OnRoomCreated JSONSet failed :", err)
return
}
}
}
func (sub *subTavern) OnRoomDestroyed(region, name string) {
cnt, err := sub.redison.JSONNumIncrBy(name, "$._refcnt", -1)
if err != nil || len(cnt) == 0 {
logger.Println("OnRoomDestroyed JSONNumIncrBy failed :", err)
} else if cnt[0] == 0 {
sub.redison.Del(sub.redison.Context(), name)
}
}
func (sub *subTavern) api(w http.ResponseWriter, r *http.Request) {