Example #1
0
        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}");
            }
        }
Example #2
0
        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;
        }