public async Task OnReactionAdd(Cacheable <IUserMessage, ulong> cmessage, ISocketMessageChannel ichannel, SocketReaction reaction) { if (!(reaction.Emote is Emoji emoji) || emoji.Name != "📳" || !(ichannel is SocketGuildChannel channel)) { return; } var run = _db.Events.FirstOrDefault(e => e.MessageId3 == cmessage.Id); if (run == null || run.Notified || run.RunTime < DateTime.Now.ToBinary() || run.SubscribedUsers.Contains(reaction.UserId.ToString()) || reaction.UserId == run.LeaderId || reaction.UserId == _client.CurrentUser.Id) { return; } await _db.AddMemberToEvent(run, reaction.UserId); var leader = channel.GetUser(run.LeaderId); var member = _client.GetUser(reaction.UserId); var runTime = DateTime.FromBinary(run.RunTime); var dbUser = _db.Users.FirstOrDefault(u => u.DiscordId == member.Id); // ReSharper disable once JoinDeclarationAndInitializer TimeZoneInfo tzi; var(customTzi, localizedRunTime) = Util.GetLocalizedTimeForUser(dbUser, runTime); tzi = customTzi ?? TimeZoneInfo.FindSystemTimeZoneById("America/Los_Angeles"); if (localizedRunTime != default) { runTime = localizedRunTime; runTime = runTime.AddHours(8); } var tzAbbrs = TZNames.GetAbbreviationsForTimeZone(tzi.Id, "en-US"); var tzAbbr = tzi.IsDaylightSavingTime(DateTime.Now) ? tzAbbrs.Daylight : tzAbbrs.Standard; await member.SendMessageAsync($"You have RSVP'd for {leader.Nickname ?? leader.Username}'s run on on {runTime.DayOfWeek} at {runTime.ToShortTimeString()} ({tzAbbr}) [{runTime.DayOfWeek}, {(Month)runTime.Month} {runTime.Day}]! :thumbsup:"); Log.Information("Added member {MemberId} to run {MessageId}.", reaction.UserId, run.MessageId3); }