@@ -52,6 +52,10 @@ func New(server_config *Config, duplex_config *duplex.Config) *Server {
5252
5353 self := "bridge@" + server_config .Designation
5454
55+ if server_config .Standalone_Mode {
56+ self += "standalone"
57+ }
58+
5559 // Create bridge manager
5660 server := & Server {
5761 Self : self ,
@@ -61,7 +65,7 @@ func New(server_config *Config, duplex_config *duplex.Config) *Server {
6165 DeltaResolverCache : make (map [* duplex.Peer ]HelloArgs ),
6266 Config : server_config ,
6367 RoomsMap : make (map [RoomKey ]* Room ),
64- roomEvents : make (chan RoomEvent , 1024 ),
68+ roomEvents : make (chan RoomEvent ),
6569 snowflakeGen : node ,
6670 App : fiber .New (fiber.Config {
6771 JSONEncoder : json .Marshal ,
@@ -158,14 +162,21 @@ func (s *Server) Run() {
158162 s .Done <- true
159163}
160164
165+ func (s * Server ) make_response (a any , e RoomEvent ) {
166+ s .Logger .Debug ().Any ("response" , a ).Msg ("🚪 replying" )
167+ e .Respond <- a
168+ }
169+
161170func (s * Server ) RoomManager () {
162171 for event := range s .roomEvents {
172+ s .Logger .Debug ().Str ("opcode" , event .Op .String ()).Any ("key" , event .Key ).Any ("value" , event .Value ).Msg ("🚪 processing" )
173+
163174 switch event .Op {
164175 case OpJoinRoom :
165176 r , exists := s .RoomsMap [event .Room ]
166177 if ! exists {
167- s .Logger .Info ().Msgf ( "%s 🚪 Creating room %s " , event .Client . GiveName () , event .Room )
168- r = & Room {Clients : make (Targets )}
178+ s .Logger .Info ().Any ( "client " , event .Client ). Any ( "room" , event .Room ). Msgf ( "🚪 creating" )
179+ r = & Room {Clients : make (Targets ), GlobalVars : & sync. Map {} }
169180 s .RoomsMap [event .Room ] = r
170181 }
171182 r .Clients [event .Client ] = true
@@ -174,7 +185,7 @@ func (s *Server) RoomManager() {
174185 delete (r .Clients , event .Client )
175186 if len (r .Clients ) == 0 {
176187 delete (s .RoomsMap , event .Room )
177- s .Logger .Info ().Msgf ( "%s 🚪 Destroying vacant room %s " , event .Client . GiveName () , event .Room )
188+ s .Logger .Info ().Any ( "client " , event .Client ). Any ( "room" , event .Room ). Msgf ( "🚪 destroying" )
178189 }
179190 }
180191 case OpGetClients :
@@ -185,7 +196,7 @@ func (s *Server) RoomManager() {
185196 clients = append (clients , c )
186197 }
187198 }
188- event . Respond <- clients
199+ s . make_response ( clients , event )
189200 case OpGetTargets :
190201 var targets Targets
191202 if r , exists := s .RoomsMap [event .Room ]; exists {
@@ -194,12 +205,12 @@ func (s *Server) RoomManager() {
194205 targets [c ] = true
195206 }
196207 }
197- event . Respond <- targets
208+ s . make_response ( targets , event )
198209 case OpDoesRoomExist :
199210 _ , exists := s .RoomsMap [event .Room ]
200- event . Respond <- exists
211+ s . make_response ( exists , event )
201212 case OpGetActiveRooms :
202- event . Respond <- len (s .RoomsMap )
213+ s . make_response ( len (s .RoomsMap ), event )
203214 case OpCanAllocateNRooms :
204215 active_rooms := len (s .RoomsMap )
205216 decrement := 0
@@ -208,20 +219,56 @@ func (s *Server) RoomManager() {
208219 decrement = - 1
209220 }
210221 }
211- event . Respond <- active_rooms + event .N + decrement <= int (s .Config .Maximum_Rooms )
212- case OpGetRoomForVars :
222+ s . make_response ( active_rooms + event .N + decrement <= int (s .Config .Maximum_Rooms ), event )
223+ case OpGetRoomVars :
213224 if r , exists := s .RoomsMap [event .Room ]; exists {
214- event . Respond <- & r .GlobalVars
225+ s . make_response ( r .GlobalVars , event )
215226 } else {
216- event .Respond <- (* sync .Map )(nil )
227+ s .make_response ((* sync .Map )(nil ), event )
228+ }
229+ case OpSetRoomVar :
230+ if r , exists := s .RoomsMap [event .Room ]; exists {
231+
232+ if _ , ok := r .GlobalVars .Load (event .Key ); ! ok {
233+ s .Logger .Info ().Any ("client" , event .Client ).Any ("room" , event .Room ).Any ("gvar" , event .Key ).Msgf ("🚪 creating" )
234+ }
235+
236+ r .GlobalVars .Store (event .Key , event .Value )
237+ s .make_response (true , event )
238+ } else {
239+ s .make_response (false , event )
240+ }
241+ case OpDeleteRoomVar :
242+ if r , exists := s .RoomsMap [event .Room ]; exists {
243+
244+ if _ , ok := r .GlobalVars .Load (event .Key ); ! ok {
245+ s .Logger .Info ().Any ("client" , event .Client ).Any ("room" , event .Room ).Any ("gvar" , event .Key ).Msgf ("🚪 deleting" )
246+ }
247+
248+ r .GlobalVars .Delete (event .Key )
249+ s .make_response (true , event )
250+ } else {
251+ s .make_response (false , event )
217252 }
218253 }
219254 }
220255}
221256
257+ func (s * Server ) DeleteRoomGlobalVar (room RoomKey , key any ) bool {
258+ resp := make (chan any , 1 )
259+ s .roomEvents <- RoomEvent {Op : OpDeleteRoomVar , Room : room , Key : key , Respond : resp }
260+ return (<- resp ).(bool )
261+ }
262+
263+ func (s * Server ) SetRoomGlobalVar (client * BridgeClient , room RoomKey , key any , value any ) bool {
264+ resp := make (chan any , 1 )
265+ s .roomEvents <- RoomEvent {Op : OpSetRoomVar , Client : client , Room : room , Key : key , Value : value , Respond : resp }
266+ return (<- resp ).(bool )
267+ }
268+
222269func (s * Server ) GetRoomGlobalVars (room RoomKey ) * sync.Map {
223270 resp := make (chan any , 1 )
224- s .roomEvents <- RoomEvent {Op : OpGetRoomForVars , Room : room , Respond : resp }
271+ s .roomEvents <- RoomEvent {Op : OpGetRoomVars , Room : room , Respond : resp }
225272 return (<- resp ).(* sync.Map )
226273}
227274
0 commit comments