IRCDOTNET BOT无法从IRC频道,长登录/注销中获取消息



我正在尝试为IRC频道编写bot,该频道将读取来自频道的消息,请确认它们是否是他的命令,并且采取了某些操作取决于发送的命令。我之所以选择IRCDOTNET,是因为它是唯一包含一些示例如何使用它的库,但实际上它们已经过时了,只有一半的库。我缺乏在C#和编程中的经验,根本无法理解任何东西,没有好的例子:(

所以我的程序现在要做什么:

  • 使用密码登录到服务器
  • 加入频道
  • 注销(非常有货)

我无法捕获并从频道发送任何消息,我无法立即注销。

用于登录和IRCCLIENT类的全球类示例

 public IrcRegistrationInfo  irc_iri 
        {
            get
            {
                return new IrcUserRegistrationInfo()
                {
                    NickName = "jsBot",
                    UserName = "jsBot",
                    RealName = "jsBot",
                    Password = "oauth:p4$$w0rdH3Re48324729214812489"
                };
            }
        }
   public IrcClient gIrcClient = new IrcClient();

也所有时事:

private void Form1_Load(object sender, EventArgs e)
    {
        try
        {
            gIrcClient.Connected += ircClient_Connected;
            gIrcClient.Disconnected += gIrcClient_Disconnected;
            gIrcClient.FloodPreventer = new IrcStandardFloodPreventer(1, 10000);
        }
        catch (Exception ex) { MessageBox.Show(ex.ToString());}
    }

登录按钮代码:

   private void button1_Click(object sender, EventArgs e)
        {
            button1.Enabled = false;
            if (!gIrcClient.IsConnected)
            {
                button1.Text = "Connecting...";
                gIrcClient.Connect("irc.twitch.tv", 6667, false, irc_iri);
            }
            else
            {
                button1.Text = "Disconnecting...";
                gIrcClient.Quit(5000, "bye");
            }
        }

逻辑是:程序检查IRCCLIENT是否连接,并采取一些措施。然后,在采取了适当的事件之后,将再次启用该按钮。但是该退出功能的工作速度非常慢或根本不起作用,在我不关闭程序之前,机器人将一直保持在频道(也许我需要处置Ircclient?)

连接并断开事件。在连接活动中,机器人将加入频道。在我按Connect按钮后约30秒后,Bot出现在频道上,但是在2-3秒后增加了连接的事件。断开连接的相同 - 断开事件迅速增加,但机器人在频道上停留更长的时间(约120秒)。

  void ircClient_Connected(object sender, EventArgs e)
        {
            try
            {
                if (button1.InvokeRequired)
                {
                    MethodInvoker del = delegate { 
                        button1.Text = "Disconnect"; 
                        button1.Enabled = true; };
                    button1.Invoke(del);
                }
                else
                {
                    button1.Text = "Disconnect"; 
                    button1.Enabled = true;
                }
                gIrcClient.Channels.Join("#my_channel");   
                gIrcClient.LocalUser.JoinedChannel += LocalUser_JoinedChannel;             
            }
            catch (Exception ex) { MessageBox.Show(ex.Message); }
        }
        void gIrcClient_Disconnected(object sender, EventArgs e)
        {
            if (!gIrcClient.IsConnected)
            {
                try
                {
                    if (button1.InvokeRequired)
                    {
                        MethodInvoker del = delegate
                        {
                            button1.Text = "Connect";
                            button1.Enabled = true;
                        };
                        button1.Invoke(del);
                    }
                    else
                    {
                        button1.Text = "Connect";
                        button1.Enabled = true;
                    }
                }
                catch (Exception ex) { MessageBox.Show(ex.Message); }
            }
            else gIrcClient.Disconnect();
        }

加入频道和消息收到的事件。他们从不抚养,不知道为什么。

 void LocalUser_JoinedChannel(object sender, IrcChannelEventArgs e)
        {
            try
            {                
                gIrcClient.Channels[0].MessageReceived += Form1_MessageReceived;
                gIrcClient.LocalUser.SendMessage(e.Channel, "test");
                MessageBox.Show(gIrcClient.Channels[0].Users[0].User.NickName);
                MessageBox.Show("bot_join_channel_event_raised");
            }
            catch (Exception ex) { MessageBox.Show(ex.Message); }
        }
        void Form1_MessageReceived(object sender, IrcMessageEventArgs e)
        {
            try
            {
                if (e.Text.Equals("asd"))
                    gIrcClient.LocalUser.SendMessage(e.Targets, "received");
            }
            catch (Exception ex) { MessageBox.Show(ex.Message); }
        }

那么主要问题是:如何从频道捕获消息,以及如何将消息发送到频道?我将感谢任何例子。您可以在此处找到所有代码:http://pastebin.com/tbkfl3vq谢谢

您在添加事件之前尝试加入频道。

  gIrcClient.Channels.Join("#my_channel");   
  gIrcClient.LocalUser.JoinedChannel += LocalUser_JoinedChannel;

我的建议是首先尝试添加事件:

  gIrcClient.LocalUser.JoinedChannel += LocalUser_JoinedChannel;
  gIrcClient.Channels.Join("#my_channel");   

irc.net库中有一个错误,twitch.tv正在使用一个非标准消息回复,该消息正在绊倒irc.net。

我在这里创建了一个错误。但基本上Twitch发送了"欢迎!",GLHF!&quot作为rpl_welcome消息。IRC RFC描述了消息的格式为"欢迎来到Internet Relay网络!@&quort。

irc.net从欢迎消息中解析出您的昵称,该名称用于启动加入渠道和Messagereced Events之类的事件。

我的解决方案是下载源代码,并在接收RPL_WELCOMES消息时注释其在何处设置nick名称。它从IrcRegistrationInfo中正确设置了昵称,然后将其传递到IRCCLIENT构造函数中,并且不需要从Twitch的欢迎消息中解析。不确定其他IRC服务器是否是这种情况。

该函数在ircclientmessageprocessing.cs中称为ProcessMessagerePlyWelcome:

    /// <summary>
    /// Process RPL_WELCOME responses from the server.
    /// </summary>
    /// <param name="message">The message received from the server.</param>
    [MessageProcessor("001")]
    protected void ProcessMessageReplyWelcome(IrcMessage message)
    {
        Debug.Assert(message.Parameters[0] != null);
        Debug.Assert(message.Parameters[1] != null);
        this.WelcomeMessage = message.Parameters[1];
        // Extract nick name, user name, and host name from welcome message. Use fallback info if not present.
        var nickNameIdMatch = Regex.Match(this.WelcomeMessage.Split(' ').Last(), regexNickNameId);
        //this.localUser.NickName = nickNameIdMatch.Groups["nick"].GetValue() ?? this.localUser.NickName;
        this.localUser.UserName = nickNameIdMatch.Groups["user"].GetValue() ?? this.localUser.UserName;
        this.localUser.HostName = nickNameIdMatch.Groups["host"].GetValue() ?? this.localUser.HostName;
        this.isRegistered = true;
        OnRegistered(new EventArgs());
    }

更需要参与的解决方案可能是完善nick Name Regex,因此它在GLHF上不匹配,我认为这不是一个有效的昵称。

irc.net使用case敏感的字符串比较,以通过昵称查找用户。因此,您传递到IrcregistrationInfo的昵称的价值必须与Twitch在与您有关的消息中使用的壳体匹配。这都是小写。

相关内容

  • 没有找到相关文章

最新更新