我正在尝试为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在与您有关的消息中使用的壳体匹配。这都是小写。