public async Task Process(Say say) { if (!IsLoggedIn) { return; } if (User.BanMute) { return; // block all say for muted } say.User = Name; say.Time = DateTime.UtcNow; if (say.Ring) { // ring permissions - bot/admin anywhere, others only to own battle if (!User.IsAdmin) { if ((say.Place != SayPlace.Battle && say.Place != SayPlace.BattlePrivate) || MyBattle == null || MyBattle.Founder != User) { say.Ring = false; } } } switch (say.Place) { case SayPlace.Channel: Channel channel; if (state.Rooms.TryGetValue(say.Target, out channel)) { if (channel.Users.ContainsKey(Name)) { await state.Broadcast(channel.Users.Keys, say); await state.OfflineMessageHandler.StoreChatHistory(say); } } break; case SayPlace.User: ConnectedUser connectedUser; if (state.ConnectedUsers.TryGetValue(say.Target, out connectedUser)) { await connectedUser.SendCommand(say); } else { await state.OfflineMessageHandler.StoreChatHistory(say); } await SendCommand(say); break; case SayPlace.Battle: if (MyBattle != null) { await state.Broadcast(MyBattle.Users.Keys, say); } break; case SayPlace.BattlePrivate: if (MyBattle != null && MyBattle.Founder.Name == Name) { ConnectedUser cli; if (MyBattle.Users.ContainsKey(say.Target)) { if (state.ConnectedUsers.TryGetValue(say.Target, out cli)) { await cli.SendCommand(say); } } } break; case SayPlace.MessageBox: if (User.IsAdmin) { await state.Broadcast(state.ConnectedUsers.Values, say); } break; } await state.OnSaid(say); }