コード例 #1
0
ファイル: Program.cs プロジェクト: mvdhout1992/RenCSharpBot
 private static char GetUserPermissionChar(NonRfcChannelUser user)
 {
     if (user.IsOwner)
     {
         return('~');
     }
     if (user.IsChannelAdmin)
     {
         return('&');
     }
     if (user.IsIrcOp)
     {
         return('@');
     }
     if (user.IsHalfop)
     {
         return('%');
     }
     if (user.IsVoice)
     {
         return('+');
     }
     return('?');
 }
コード例 #2
0
        internal void ProcessMessage(object sender, IrcEventArgs eventArgs)
        {
            if (eventArgs.Data.Message == null)
            {
                return;
            }
            string message = eventArgs.Data.Message.TrimStart(CommandPrefix);
            string nick    = eventArgs.Data.Nick.Split('!')[0];

            _log.Debug($"Got message '{message}' and nick '{nick}'");

            if (_config.IgnoreList.Contains(nick))
            {
                _log.Debug($"{nick} was in IgnoreList");
                return;
            }

            if (_config.IgnoreNonVoicedUsers)
            {
                NonRfcChannelUser user = _client.GetChannelUser(eventArgs.Data.Channel, nick) as NonRfcChannelUser;
                if (user == null)
                {
                    _log.Info(
                        $"Got null when getting {nick} in {eventArgs.Data.Channel}, can't verify if they're non voiced, ignoring.");
                    return;
                }

                if (!user.IsVoice && !user.IsOp && !user.IsHalfop && !user.IsOwner && !user.IsChannelAdmin &&
                    !user.IsIrcOp)
                {
                    _log.Info($"Ignored {nick} because IgnoreNonVoicedUsers is set to {_config.IgnoreNonVoicedUsers}");
                    return;
                }
            }

            foreach (ICommand command in Commands)
            {
                NoPrefix      noPrefix      = (NoPrefix)Attribute.GetCustomAttribute(command.GetType(), typeof(NoPrefix));
                UseMainThread useMainThread = (UseMainThread)Attribute.GetCustomAttribute(command.GetType(),
                                                                                          typeof(UseMainThread));

                bool runInMainThread     = useMainThread != null;
                bool prefixRequired      = noPrefix == null;
                bool breakAfterExecution =
                    (BreakAfterExecution)Attribute.GetCustomAttribute(command.GetType(),
                                                                      typeof(BreakAfterExecution)) != null;
                bool matched = false;

                if (prefixRequired)
                {
                    if (eventArgs.Data.Message[0] != _config.Prefix)
                    {
                        continue;
                    }
                }

                foreach (Regex regex in command.Patterns)
                {
                    Match match = regex.Match(message);
                    if (!match.Success)
                    {
                        continue;
                    }
                    matched = true;

                    _log.Debug($"Successfully matched message to '{command.CommandName}' with regex '{regex}'");
                    if (runInMainThread)
                    {
                        RunCommand(eventArgs, command, match);
                        continue;
                    }

                    Thread commandThread = new Thread(() => RunCommand(eventArgs, command, match));
                    Threads.Add(commandThread);
                    commandThread.Start();
                }

                if (breakAfterExecution && matched)
                {
                    break;
                }
            }
        }
コード例 #3
0
ファイル: IrcClient.cs プロジェクト: Zenexer/QuoteServ
        /// <summary>
        /// Event handler for join messages
        /// </summary>
        /// <param name="ircdata">Message data containing join information</param>
        private void _Event_JOIN(IrcMessageData ircdata)
        {
            string who = ircdata.Nick;
            string channelname = ircdata.Channel;

            if (IsMe(who)) {
                _JoinedChannels.Add(channelname);
            }

            if (ActiveChannelSyncing) {
                Channel channel;
                if (IsMe(who)) {
                    // we joined the channel
            #if LOG4NET
                    Logger.ChannelSyncing.Debug("joining channel: "+channelname);
            #endif
                    if (SupportNonRfc) {
                        channel = new NonRfcChannel(channelname);
                    } else {
                        channel = new Channel(channelname);
                    }
                    _Channels.Add(channelname, channel);
                    // request channel mode
                    RfcMode(channelname);
                    // request wholist
                    RfcWho(channelname);
                    // request banlist
                    Ban(channelname);
                } else {
                    // someone else joined the channel
                    // request the who data
                    RfcWho(who);
                }

            #if LOG4NET
                Logger.ChannelSyncing.Debug(who+" joins channel: "+channelname);
            #endif
                channel = GetChannel(channelname);
                IrcUser ircuser = GetIrcUser(who);

                if (ircuser == null) {
                    ircuser = new IrcUser(who, this);
                    ircuser.Ident = ircdata.Ident;
                    ircuser.Host  = ircdata.Host;
                    _IrcUsers.Add(who, ircuser);
                }

                ChannelUser channeluser;
                if (SupportNonRfc) {
                    channeluser = new NonRfcChannelUser(channelname, ircuser);
                } else {
                    channeluser = new ChannelUser(channelname, ircuser);
                }
                channel.UnsafeUsers.Add(who, channeluser);
            }

            if (OnJoin != null) {
                OnJoin(this, new JoinEventArgs(ircdata, channelname, who));
            }
        }
コード例 #4
0
ファイル: IrcClient.cs プロジェクト: Zenexer/QuoteServ
        /// <summary>
        /// Event handler for name reply messages
        /// </summary>
        /// <param name="ircdata">Message data containing name reply information</param>
        private void _Event_RPL_NAMREPLY(IrcMessageData ircdata)
        {
            string   channelname  = ircdata.Channel;
            string[] userlist     = ircdata.MessageArray;
            if (ActiveChannelSyncing &&
                IsJoined(channelname)) {
                string nickname;
                bool   op;
                bool   halfop;
                bool   voice;
                foreach (string user in userlist) {
                    if (user.Length <= 0) {
                        continue;
                    }

                    op = false;
                    halfop = false;
                    voice = false;
                    switch (user[0]) {
                        case '@':
                            op = true;
                            nickname = user.Substring(1);
                        break;
                        case '+':
                            voice = true;
                            nickname = user.Substring(1);
                        break;
                        // RFC VIOLATION
                        // some IRC network do this and break our channel sync...
                        case '&':
                            nickname = user.Substring(1);
                        break;
                        case '%':
                            halfop = true;
                            nickname = user.Substring(1);
                        break;
                        case '~':
                            nickname = user.Substring(1);
                        break;
                        default:
                            nickname = user;
                        break;
                    }

                    IrcUser     ircuser     = GetIrcUser(nickname);
                    ChannelUser channeluser = GetChannelUser(channelname, nickname);

                    if (ircuser == null) {
            #if LOG4NET
                        Logger.ChannelSyncing.Debug("creating IrcUser: "******" because he doesn't exist yet");
            #endif
                        ircuser = new IrcUser(nickname, this);
                        _IrcUsers.Add(nickname, ircuser);
                    }

                    if (channeluser == null) {
            #if LOG4NET
                        Logger.ChannelSyncing.Debug("creating ChannelUser: "******" for Channel: "+channelname+" because he doesn't exist yet");
            #endif
                        if (SupportNonRfc) {
                            channeluser = new NonRfcChannelUser(channelname, ircuser);
                        } else {
                            channeluser = new ChannelUser(channelname, ircuser);
                        }
                        Channel channel = GetChannel(channelname);

                        channel.UnsafeUsers.Add(nickname, channeluser);
                        if (op) {
                            channel.UnsafeOps.Add(nickname, channeluser);
            #if LOG4NET
                            Logger.ChannelSyncing.Debug("added op: "+nickname+" to: "+channelname);
            #endif
                        }
                        if (SupportNonRfc && halfop)  {
                            ((NonRfcChannel)channel).UnsafeHalfops.Add(nickname, channeluser);
            #if LOG4NET
                            Logger.ChannelSyncing.Debug("added halfop: "+nickname+" to: "+channelname);
            #endif
                        }
                        if (voice) {
                            channel.UnsafeVoices.Add(nickname, channeluser);
            #if LOG4NET
                            Logger.ChannelSyncing.Debug("added voice: "+nickname+" to: "+channelname);
            #endif
                        }
                    }

                    channeluser.IsOp    = op;
                    channeluser.IsVoice = voice;
                    if (SupportNonRfc) {
                        ((NonRfcChannelUser)channeluser).IsHalfop = halfop;
                    }
                }
            }

            if (OnNames != null) {
                OnNames(this, new NamesEventArgs(ircdata, channelname, userlist));
            }
        }