protected virtual void HandleUncountCommand(CommandMatch cmd, IChannelMessageEventArgs args) { ChannelUserLevel level = ConnectionManager.GetChannelLevelForUser(args.Channel, args.SenderNickname); if (level < ChannelUserLevel.HalfOp) { ConnectionManager.SendChannelMessage(args.Channel, $"{args.SenderNickname}: You need to be a channel operator."); return; } var counter = (string)cmd.Arguments[0]; CounterEntry entry; using (CountersContext ctx = GetNewContext()) { entry = ctx.Entries .Where(e => e.Command == counter && e.Channel == args.Channel) .OrderByDescending(e => e.ID) .FirstOrDefault() ; if (entry == null) { ConnectionManager.SendChannelMessage(args.Channel, $"{args.SenderNickname}: Found nothing for counter '{counter}' in {args.Channel}."); return; } if (entry.Expunged) { ConnectionManager.SendChannelMessage(args.Channel, $"{args.SenderNickname}: Already expunged: <{entry.PerpNickname}> {entry.Message}"); return; } entry.Expunged = true; ctx.SaveChanges(); ConnectionManager.SendChannelMessage(args.Channel, $"{args.SenderNickname}: Okay, expunged <{entry.PerpNickname}> {entry.Message}"); } }
protected virtual void TryToMatch(Counter counter, string channel, string senderNickname, string messageSubstring = null, Regex messageRegex = null) { // go back through time RingBuffer <ChannelMessage> messages; if (!ChannelsMessages.TryGetValue(channel, out messages)) { return; } IEnumerable <ChannelMessage> messagesReversed = messages .Reverse(); ChannelMessage foundMessage = null; foreach (ChannelMessage message in messagesReversed) { if (messageSubstring != null) { if (!message.Body.Contains(messageSubstring)) { continue; } } if (messageRegex != null) { if (!messageRegex.IsMatch(message.Body)) { continue; } } if (counter.MessageRegex != null && !counter.MessageRegex.IsMatch(message.Body)) { continue; } if ( counter.NicknameRegex != null && !counter.NicknameRegex.IsMatch(message.Nickname) && (message.Username == null || !counter.NicknameRegex.IsMatch(message.Username)) ) { continue; } foundMessage = message; break; } if (foundMessage == null) { ConnectionManager.SendChannelMessage( channel, $"{senderNickname}: Nothing to count." ); return; } if (foundMessage.Counted) { ConnectionManager.SendChannelMessage( channel, $"{senderNickname}: That's been counted already." ); return; } using (CountersContext ctx = GetNewContext()) { ctx.Entries.Add(new CounterEntry { Command = counter.CommandName, HappenedTimestamp = foundMessage.Timestamp, CountedTimestamp = DateTimeOffset.Now, Channel = channel, PerpNickname = foundMessage.Nickname, PerpUsername = foundMessage.Username, CounterNickname = senderNickname, CounterUsername = ConnectionManager.RegisteredNameForNick(senderNickname), Message = foundMessage.Body, Expunged = false }); ctx.SaveChanges(); } foundMessage.Counted = true; }