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('?'); }
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; } } }
/// <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)); } }
/// <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)); } }