private static void ClientOnDataReceived(object sender, Message message) { try { var messages = message.MessageString.Split('\u0013'); foreach (var msg in messages) { if (msg == "ping" || String.IsNullOrWhiteSpace(msg)) { return; //ignore } string t = null; try { dynamic m = JsonConvert.DeserializeObject(msg); t = m.JType?.ToString(); } catch (Exception e) { //Bot.SendTextMessage(Settings.MainChatId, e.Message); continue; } Werewolf game; if (t != null) { Console.WriteLine(t); switch (t) { case "PlayerJoinInfo": var pji = JsonConvert.DeserializeObject <PlayerJoinInfo>(msg); game = Games.FirstOrDefault(x => x.ChatId == pji.GroupId); game?.AddPlayer(pji.User); break; case "GameStartInfo": var gsi = JsonConvert.DeserializeObject <GameStartInfo>(msg); //double check we don't already have a game... game = Games.FirstOrDefault(x => x.ChatId == gsi.Chat.Id); if (game != null) { game.AddPlayer(gsi.User); } else { game = new Werewolf(gsi.Chat.Id, gsi.User, gsi.Chat.Title, gsi.Chaos); Games.Add(game); GamesStarted++; } break; case "ForceStartInfo": var fsi = JsonConvert.DeserializeObject <ForceStartInfo>(msg); game = Games.FirstOrDefault(x => x.ChatId == fsi.GroupId); game?.ForceStart(); break; //case "ReplyInfo": // var ri = JsonConvert.DeserializeObject<ReplyInfo>(msg); // game = // Games.FirstOrDefault( // x => x.Players.Any(p => p.TeleUser.Id == ri.Update.Message.From.Id && !p.IsDead)); // game?.HandleReply(ri.Update); // break; case "CallbackInfo": var ci = JsonConvert.DeserializeObject <CallbackInfo>(msg); game = Games.FirstOrDefault( x => x.Players?.Any(p => p != null && !p.IsDead && p.TeleUser.Id == ci.Query.From.Id) ?? false); game?.HandleReply(ci.Query); break; case "PlayerListRequestInfo": var plri = JsonConvert.DeserializeObject <PlayerListRequestInfo>(msg); game = Games.FirstOrDefault(x => x.ChatId == plri.GroupId); game?.OutputPlayers(); break; case "PlayerFleeInfo": var pfi = JsonConvert.DeserializeObject <PlayerFleeInfo>(msg); game = Games.FirstOrDefault(x => x.ChatId == pfi.GroupId); game?.RemovePlayer(pfi.User); break; case "LoadLangInfo": var lli = JsonConvert.DeserializeObject <LoadLangInfo>(msg); game = Games.FirstOrDefault(x => x.ChatId == lli.GroupId); game?.LoadLanguage(lli.FileName); break; case "PlayerSmiteInfo": var psi = JsonConvert.DeserializeObject <PlayerSmiteInfo>(msg); game = Games.FirstOrDefault(x => x.ChatId == psi.GroupId); game?.FleePlayer(psi.UserId); break; case "UpdateNodeInfo": var uni = JsonConvert.DeserializeObject <UpdateNodeInfo>(msg); IsShuttingDown = true; if (uni.Kill) { //force kill Environment.Exit(1); } break; case "SkipVoteInfo": var svi = JsonConvert.DeserializeObject <SkipVoteInfo>(msg); game = Games.FirstOrDefault(x => x.ChatId == svi.GroupId); game?.SkipVote(); break; case "GameKillInfo": var gki = JsonConvert.DeserializeObject <GameKillInfo>(msg); game = Games.FirstOrDefault(x => x.ChatId == gki.GroupId); game?.Kill(); break; case "GetGameInfo": var ggi = JsonConvert.DeserializeObject <GetGameInfo>(msg); var g = Games.FirstOrDefault(x => x.ChatId == ggi.GroupId); if (g == null) { message.Reply("null"); } //build our response var gi = new GameInfo { Language = g.Language, ChatGroup = g.ChatGroup, GroupId = g.ChatId, NodeId = ClientId, State = g.IsRunning ? GameState.Running : g.IsJoining ? GameState.Joining : GameState.Dead, Users = new HashSet <int>(g.Players?.Where(x => !x.IsDead)?.Select(x => x.TeleUser.Id) ?? new[] { 0 }), Players = new HashSet <IPlayer>(g.Players ?? new List <IPlayer>(new[] { new IPlayer { Name = "Error" } })) }; message.Reply(JsonConvert.SerializeObject(gi)); break; case "ExtendTimeInfo": var eti = JsonConvert.DeserializeObject <ExtendTimeInfo>(msg); game = Games.FirstOrDefault(x => x.ChatId == eti.GroupId); game?.ExtendTime(eti.User, eti.Admin, eti.Seconds); break; default: Console.WriteLine(msg); break; } } } } catch (Exception e) { Console.WriteLine(e.Message + "\n" + message.MessageString); try { Directory.CreateDirectory(Path.Combine(RootDirectory, "ReceiveErrors")); using (var sw = new StreamWriter(Path.Combine(RootDirectory, "ReceiveErrors", "error.log"), true)) { sw.WriteLine(e.Message + Environment.NewLine + message.MessageString + Environment.NewLine + e.StackTrace); } } catch { // ignored } } }
private static void ClientOnDataReceived(object sender, Message message) { try { var messages = message.MessageString.Split('\u0013'); foreach (var msg in messages) { if (msg == "ping" || String.IsNullOrWhiteSpace(msg)) { return; //ignore } if (msg.StartsWith("reload:")) { ReloadLang(msg.Substring("reload:".Length)); return; } string t = null; try { dynamic m = JsonConvert.DeserializeObject(msg); t = m.JType?.ToString(); } catch (Exception) { //Bot.SendTextMessage(Settings.MainChatId, e.Message); continue; } Werewolf game; if (t != null) { Console.WriteLine(t); switch (t) { case "PlayerJoinInfo": var pji = JsonConvert.DeserializeObject <PlayerJoinInfo>(msg); game = Games.FirstOrDefault(x => x.Guid == pji.GameId); game?.AddPlayer(pji.User); break; case "GameStartInfo": var gsi = JsonConvert.DeserializeObject <GameStartInfo>(msg); try { //double check we don't already have a game... game = Games.FirstOrDefault(x => x.ChatId == gsi.Chat.Id); if (game != null) { game.ShowJoinButton(); } else { game = new Werewolf(gsi.Chat.Id, gsi.User, gsi.Chat.Title, gsi.Chaos); Games.Add(game); GamesStarted++; } } catch (Exception e) { Bot.SendTextMessageAsync(ErrorGroup, $"Error Occured during Node <code>{ClientId}</code> processing <code>GameStartInfo</code>:\n\n{e.ToString()}\n\nData:\n{gsi.ToString()}", ParseMode.Html); } break; case "ForceStartInfo": var fsi = JsonConvert.DeserializeObject <ForceStartInfo>(msg); game = Games.FirstOrDefault(x => x.ChatId == fsi.GroupId); game?.ForceStart(); break; //case "ReplyInfo": // var ri = JsonConvert.DeserializeObject<ReplyInfo>(msg); // game = // Games.FirstOrDefault( // x => x.Players.Any(p => p.TeleUser.Id == ri.Update.Message.From.Id && !p.IsDead)); // game?.HandleReply(ri.Update); // break; case "CallbackInfo": var ci = JsonConvert.DeserializeObject <CallbackInfo>(msg); game = Games.FirstOrDefault( x => //x.Players?.Any(p => p != null && !p.IsDead && p.TeleUser.Id == ci.Query.From.Id) ?? false); x.Guid == ci.GameId); game?.HandleReply(ci.Query); break; case "PlayerListRequestInfo": var plri = JsonConvert.DeserializeObject <PlayerListRequestInfo>(msg); game = Games.FirstOrDefault(x => x.ChatId == plri.GroupId); game?.OutputPlayers(); break; case "PlayerFleeInfo": var pfi = JsonConvert.DeserializeObject <PlayerFleeInfo>(msg); game = Games.FirstOrDefault(x => x.ChatId == pfi.GroupId); game?.RemovePlayer(pfi.User); break; case "LoadLangInfo": var lli = JsonConvert.DeserializeObject <LoadLangInfo>(msg); game = Games.FirstOrDefault(x => x.ChatId == lli.GroupId); game?.LoadLanguage(lli.FileName); break; case "PlayerSmiteInfo": var psi = JsonConvert.DeserializeObject <PlayerSmiteInfo>(msg); game = Games.FirstOrDefault(x => x.ChatId == psi.GroupId); game?.FleePlayer(psi.UserId); break; case "UpdateNodeInfo": var uni = JsonConvert.DeserializeObject <UpdateNodeInfo>(msg); IsShuttingDown = true; if (uni.Kill) { //force kill Environment.Exit(1); } break; case "SkipVoteInfo": var svi = JsonConvert.DeserializeObject <SkipVoteInfo>(msg); game = Games.FirstOrDefault(x => x.ChatId == svi.GroupId); game?.SkipVote(); break; case "GameKillInfo": var gki = JsonConvert.DeserializeObject <GameKillInfo>(msg); game = Games.FirstOrDefault(x => x.ChatId == gki.GroupId); game?.Kill(); break; case "GetGameInfo": var ggi = JsonConvert.DeserializeObject <GetGameInfo>(msg); var g = Games.FirstOrDefault(x => x.ChatId == ggi.GroupId); if (g == null) { message.Reply("null"); } //build our response var gi = new GameInfo { Language = g.Language, ChatGroup = g.ChatGroup, GroupId = g.ChatId, NodeId = ClientId, Guid = g.Guid, Cycle = g.Time, State = g.IsRunning ? GameState.Running : g.IsJoining ? GameState.Joining : GameState.Dead, Users = new HashSet <int>(g.Players?.Where(x => !x.IsDead)?.Select(x => x.TeleUser.Id) ?? new[] { 0 }), Players = g.Players?.Select(x => new { Bitten = x.Bitten?"Yes":"No", x.Bullet, Choice = g.Players.FirstOrDefault(p => p.Id == x.Choice)?.Name, CurrentQuestion = x.CurrentQuestion?.QType.ToString(), x.DonationLevel, IsDead = x.IsDead?"Yes":"No", x.Name, LoverId = g.Players.FirstOrDefault(p => p.Id == x.LoverId)?.Name, PlayerRole = x.PlayerRole.ToString(), Team = x.Team.ToString(), x.Votes, x.Id }) }; message.Reply(JsonConvert.SerializeObject(gi)); break; case "ExtendTimeInfo": var eti = JsonConvert.DeserializeObject <ExtendTimeInfo>(msg); game = Games.FirstOrDefault(x => x.ChatId == eti.GroupId); game?.ExtendTime(eti.User, eti.Admin, eti.Seconds); break; case "JoinButtonRequestInfo": var jbri = JsonConvert.DeserializeObject <JoinButtonRequestInfo>(msg); game = Games.FirstOrDefault(x => x.ChatId == jbri.GroupId); game?.ShowJoinButton(); Console.ForegroundColor = ConsoleColor.Green; Console.WriteLine(jbri.GroupId); Console.ForegroundColor = ConsoleColor.Gray; break; default: Console.WriteLine(msg); break; } } } } catch (Exception e) { Console.WriteLine(e.Message + "\n" + message.MessageString); try { Directory.CreateDirectory(Path.Combine(RootDirectory, "ReceiveErrors")); using (var sw = new StreamWriter(Path.Combine(RootDirectory, "ReceiveErrors", "error.log"), true)) { sw.WriteLine(e.Message + Environment.NewLine + message.MessageString + Environment.NewLine + e.StackTrace); } } catch { // ignored } } }