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); }
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); } } }