public async Task EventRsvpCheck(int eventId, string house = null, string division = null, string team = null, string roster = null, bool mention = false) { var client = DIHttpClient.CreateWithAuthCookies(ConfigUtil.Config.AuthConfig.Cookies); var evt = _calendar.Calendars.SelectMany(x => x.Events).FirstOrDefault(x => x.EventID == eventId); if (evt == null) { await ReplyAsync("No event with that ID could be found!"); return; } var rsvpMembers = await client.GetEventRsvpAsync(evt.TitleUrl); DIUnit unit = _mdr.GetUnit(house, division, team, roster); var members = unit.Members.Where(x => x.Rank != DIRank.Associate && x.Rank != DIRank.AwayST && x.Rank != DIRank.AwayLT); var memberCount = members.Count(); var memberRsvpCount = members.Select(x => x.Name).Intersect(rsvpMembers).Count(); var response = $"RSVP Rate: {memberRsvpCount}/{memberCount} ({((memberRsvpCount / (float)memberCount) * 100).ToString("0.00")}%). People missing:\n\n" + members .Select(x => x.Name) .Except(rsvpMembers) .Select(x => mention && members.First(y => y.Name == x)?.DiscordId > 0 ? Context.Guild.GetUser(members.First(y => y.Name == x).DiscordId)?.Mention ?? x : x) .Aggregate((a, b) => a + "\n" + b); await ReplyAsync("", false, evt.GetEmbed()); await ReplyMultiMessageAsync(response); }
public void Update() { var oldUsers = Members.ToList(); SubUnits.Clear(); try { var handler = new HttpClientHandler(); handler.CookieContainer = new CookieContainer(); ConfigUtil.Config.AuthConfig.Cookies .Select(x => new System.Net.Cookie(x.Name, x.Value, x.Path, x.Domain)) .ToList() .ForEach(x => handler.CookieContainer.Add(x)); var result = new DIHttpClient(handler).GetStringAsync("mdr/").GetAwaiter().GetResult(); var doc = new HtmlDocument(); doc.LoadHtml(result); foreach (var node in doc.DocumentNode.SelectNodes("//a")) { var user = new DIUser(); if (!Enum.TryParse(node.Attributes["class"]?.Value.Replace("-", "") ?? "", true, out user.Rank)) { continue; } user.Name = node.InnerText.Split(' ')[0].Trim(); user.Id = Convert.ToInt32(ProfileUrlRegex.Match(node.Attributes["href"].Value).Groups[2].Value); AddDIUnitInformation(user, node); DIUser oldUser = null; if ((oldUser = oldUsers.FirstOrDefault(x => x.Id == user.Id)) != null) { user.DiscordId = oldUser.DiscordId; user.ImageUrl = oldUser.ImageUrl; } AddUser(user); } } catch (Exception e) { e.ToString(); } }
public async Task EventRsvpRemind(int eventId, string house, string division, string team, string roster) { var client = DIHttpClient.CreateWithAuthCookies(ConfigUtil.Config.AuthConfig.Cookies); var evt = _calendar.Calendars.SelectMany(x => x.Events).FirstOrDefault(x => x.EventID == eventId); if (evt == null) { await ReplyAsync("No event with that ID could be found!"); return; } var rsvpMembers = await client.GetEventRsvpAsync(evt.TitleUrl); DIUnit unit = _mdr.GetUnit(house, division, team, roster); var members = unit.Members.Where(x => x.Rank != DIRank.Associate && x.Rank != DIRank.AwayST && x.Rank != DIRank.AwayLT); var guildUsers = members .Where(x => !rsvpMembers.Contains(x.Name) && x.DiscordId > 0) .Select(x => Context.Guild.GetUser(x.DiscordId)) .Where(x => x != null); foreach (var guildUser in guildUsers) { await guildUser.SendMessageAsync($"Hello {guildUser.Username}!\n" + $"\n" + $"This is a reminder message from {Context.User.Username} to" + $"RSVP to the shown event.\n" + $"\n" + $"What is RSVP? - Open the event and you will find 3 buttons" + $"on the left to click: \"Going\", \"Maybe\" and \"Decline\"." + $"RSVP means literally \"Respond please\" meaning you should" + $"click any of those buttons to inform the event host about" + $"whether you will attend or not.\n" + $"\n" + $"Why do I get reminders for this? - Some events are mandatory" + $"to RSVP too and you might end up getting a strike for it.\n" + $"\n" + $"Any questions left? Feel free to ask @Amryu#1337 about it!", false, evt.GetEmbed("Open event in browser")); } await ReplyAsync($"{guildUsers.Count()} users were successfully notified!"); }
private void CalendarLoop(object sender, ElapsedEventArgs evt) { _timer.Enabled = false; _timer.Interval = 300000; if (_diCals == null) { _diCals = new Dictionary <string, DICalendar>(); foreach (var cal in ConfigUtil.Config.Calendars) { _diCals.Add(cal, File.Exists("calendars/" + cal) ? DICalendar.LoadCalendar(cal) : new DICalendar(cal)); } } var handler = new HttpClientHandler(); handler.CookieContainer = new CookieContainer(); ConfigUtil.Config.AuthConfig.Cookies .Select(x => new System.Net.Cookie(x.Name, x.Value, x.Path, x.Domain)) .ToList() .ForEach(x => handler.CookieContainer.Add(x)); var client = new DIHttpClient(handler); foreach (var cal in ConfigUtil.Config.Calendars) { var vCal = Calendar.Load(client .GetCalendarAsync(cal) .GetAwaiter().GetResult()); lock (_diCals[cal]) { _diCals[cal].ProcessEvents(vCal, _discord, _mdr); DICalendar.SaveCalendar(_diCals[cal]); } } _timer.Enabled = true; }