Exemplo n.º 1
0
        protected long GetPlayerId(string msg)
        {
            //try get id from link
            var regex = new Regex(@"dotabuff.com/players/(?<id>\d+)", RegexOptions.IgnoreCase);
            var match = regex.Match(msg);

            var idStr = match.Success ? match.Groups["id"].Value : msg;

            //test by number
            long id;

            if (long.TryParse(idStr, out id))
            {
                id = SteamId.ConvertTo32(id);
                return(id);
            }

            return(0);
        }
Exemplo n.º 2
0
        public async Task NotifyStatusChats(List <string> newOnline, List <PlayerGameSession> newOffline)
        {
            if (newOnline.Count == 0 && newOffline.Count == 0)
            {
                return;
            }

            using var scope = serviceProvider.CreateScope();
            var dataManager = scope.ServiceProvider.GetRequiredService <DataManager>();

            var chats = dataManager
                        .GetChatPlayers(x => x.Chat, x => x.Player)
                        .GroupBy(x => x.Chat)
                        .Select(g => new
            {
                Chat    = g.Key,
                Players = g.Select(x => x.Player).ToList()
            })
                        .ToList();

            foreach (var session in newOffline)
            {
                if (session.Start != null && session.End != null)
                {
                    var steamId  = long.Parse(session.SteamId);
                    var playerId = SteamId.ConvertTo32(steamId);

                    var games = dataManager
                                .GetPlayerMatches(playerId, session.Start.Value, session.End.Value)
                                .Select(x => new { x.Won })
                                .ToList();

                    if (games.Count > 0)
                    {
                        var wons  = games.Count(x => x.Won);
                        var losts = games.Count(x => !x.Won);

                        session.Stat = wons - losts;
                    }
                }
            }

            foreach (var chat in chats)
            {
                var online = chat.Players.Where(x => newOnline.Contains(x.SteamId)).ToList();
                if (online.Count > 0)
                {
                    var lines = online.Select(x => $"*{x.Name.Markdown()}* connected");
                    var msg   = string.Join("\n", lines);

                    await telegram.SendTextMessageAsync(chat.Chat.Id, msg, parseMode : ParseMode.Markdown);
                }

                List <PlayerGameSession> offline = new List <PlayerGameSession>();
                foreach (var player in chat.Players)
                {
                    var session = newOffline.FirstOrDefault(x => x.SteamId == player.SteamId);
                    if (session != null)
                    {
                        session.PlayerName = player.Name;
                        offline.Add(session);
                    }
                }

                if (offline.Count > 0)
                {
                    var lines = offline.Select(x =>
                    {
                        var str = $"*{x.PlayerName.Markdown()}* disconnected";

                        if (x.Stat != null)
                        {
                            str += $" || {x.Stat.Value:+#;-#;0}";
                        }

                        var duration = x.End - x.Start;
                        if (duration != null)
                        {
                            var time = duration.Value.Humanize(precision: 2,
                                                               minUnit: TimeUnit.Minute,
                                                               maxUnit: TimeUnit.Hour);

                            str += $" || {time}";
                        }

                        return(str);
                    });

                    var msg = string.Join("\n", lines);

                    await telegram.SendTextMessageAsync(chat.Chat.Id, msg, parseMode : ParseMode.Markdown);
                }
            }
        }