示例#1
0
        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
                }
            }
        }
示例#2
0
        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
                }
            }
        }