我怎样才能让这些 Perl 脚本延迟呢?
How can I get these Perl scripts to delay?
我正在用 Perl 制作一个简单的 IRC 机器人,可用于“猎鸭”以响应 this IRC game bot。我在私人脚本频道上执行此操作,irc.freenode.net ##duckhunt2
以免干扰玩游戏的真人。
到目前为止,我已经尝试使用 Net::IRC
and a plugin for XChat, with my code here 制作一个 Perl 机器人。鸭子源机器人发送一条消息,如
・゜゜・。。・゜゜\_O< quack!
自最后一只鸭子被射杀后 8-60 分钟之间的随机时间让您知道一只鸭子已经到达。然后您可以回复 .bang
来射击鸭子并为您的分数加一分。但是,如果你回复得太快(在一秒钟内),它会让你进入 2 小时的冷却模式,你无法射击任何鸭子。有时它还会因为“卡壳枪”等原因导致 7 秒冷却时间,如游戏机器人代码的第 272 行所示。
Perl 代码
use Net::IRC;
use Time::HiRes qw(usleep nanosleep);
$ducksource = 'DUCK_SOURCE';
$server = 'IRC_SERVER';
$channel = 'IRC_CHANNEL';
$botnick = 'BOT_NICKNAME';
$botnick2 = 'BOT_BACKUP_NICKNAME';
$password = 'BOT_PASSWORD';
$botadmin = 'BOT_ADMIN_NICKNAME';
$irc = new Net::IRC;
$conn = $irc->newconn(
Nick => $botnick,
Server => $server,
Port => IRC_SERVER_PORT,
Username => $botnick
);
$conn->add_global_handler('376', \&on_connect);
$conn->add_global_handler('disconnect', \&on_disconnect);
$conn->add_global_handler('kick', \&on_kick);
$conn->add_global_handler('msg', \&on_msg);
$conn->add_global_handler('public', \&on_public);
$irc->start;
sub on_connect {
$self = shift;
$self->privmsg('nickserv', "identify $password");
$self->join($channel);
print "Connected\n";
}
sub on_disconnect {
$self = shift;
print "Disconnected, attempting to reconnect\n";
$self->connect();
}
sub on_kick {
$self = shift;
$self->join($channel);
$self->privmsg('nickserv', "/nick $botnick");
}
sub on_msg {
$self = shift;
$event = shift;
if ($event->nick eq $botadmin) {
foreach $arg ($event->args) {
if ($arg =~ m/uptime/) {
$self->privmsg($botadmin, `uptime`);
}
}
}
}
sub on_public {
$self = shift;
$event = shift;
if ($event->nick eq $ducksource) {
foreach $arg ($event->args) {
if (($arg =~ m/</) && ($arg !~ m/>/)) {
usleep(250000);
$self->privmsg($channel, ".bang");
}
if ( ($arg =~ m/missed/)
|| ($arg =~ m/jammed/)
|| ($arg =~ m/luck/)
|| ($arg =~ m/WTF/)) {
$self->privmsg('nickserv', "/nick $botnick2");
$self->privmsg($channel, ".bang");
$self->privmsg('nickserv', "/nick $botnick");
}
if (($arg =~ m/script/) || ($arg =~ m/period/)) {
$self->privmsg('nickserv', "/nick $botnick2");
$self->privmsg($channel, ".bang");
}
}
}
}
Perl 机器人连接到服务器,加入聊天室,并响应鸭子出现,但我无法让它延迟发送命令 .bang
以便游戏机器人接收在 1 秒过去后,我没有进入两小时冷却模式。
我知道 Perl sleep
命令只接受一秒的倍数。我需要延迟 0.25 秒,因为消息到达游戏机器人大约需要 0.75 秒,所以我尝试使用 Time::HiRes 和 usleep
命令,它使用微秒(1,000 微秒 = 1 毫秒).
在我的代码的第 61 行,我添加了 usleep(250000)
这应该使脚本暂停 0.25 秒然后在下一行发送消息
$self->privmsg($channel, ".bang")
但脚本不会等待 -- 它只是正常发送消息。它的行为就像忽略了 usleep
命令。
我该如何解决这个问题并让机器人在发送消息之前等待?
其次,我对如何更改昵称感到困惑。如果游戏机器人给我 7 秒的冷却时间,我想快速将我的昵称更改为另一个昵称(例如 HunterBot6000
到 HunterBot6000_
)射击鸭子(.bang
),然后更改在另一个机器人得到鸭子之前我的昵称。通常,您可以通过 /nick NEWNICK
命令完成缺刻更改。但是,我已经尝试将此命令发送到频道和 NickServ,这并没有改变我的昵称。我该如何完成?
我还尝试为脚本编写一个 XChat 插件,看看是否可以解决计时问题,但这也不起作用。在连接到服务器并加入 XChat 中的聊天室后,我加载了插件,但我遇到了同样的问题——它用 .bang
响应鸭子,但我无法让它在发送前等待。
您可以查看文档 Writing a simple XChat Perl Script。我做错了什么?
你问了多个问题,但我只能回答一个 phone
发送即可更改昵称
NICK newnick
可以在 RFC 2812 中找到更多信息。
但是,Net::IRC 可能有更合适的方法。
我也遇到过来自 Time::HiRes 的 usleep 问题。这应该会影响 250 毫秒的睡眠:
select(undef, undef, undef, 0.25);
感谢大家的帮助。我能够让 usleep
命令正常工作,并通过将延迟更改为更大的秒数(例如 usleep(25000000)
、25 秒)然后通过删除更改回 0.25 秒来验证它是否正确延迟一次 0
个。我还在前后添加了 print Time::HiRes::time;
以验证延迟是否有效。我还发现更改昵称的正确命令是 $self->nick($botnick2);
,尽管在任何 Net::IRC 文档中都找不到它。再次感谢大家的帮助和建议。
我正在用 Perl 制作一个简单的 IRC 机器人,可用于“猎鸭”以响应 this IRC game bot。我在私人脚本频道上执行此操作,irc.freenode.net ##duckhunt2
以免干扰玩游戏的真人。
到目前为止,我已经尝试使用 Net::IRC
and a plugin for XChat, with my code here 制作一个 Perl 机器人。鸭子源机器人发送一条消息,如
・゜゜・。。・゜゜\_O< quack!
自最后一只鸭子被射杀后 8-60 分钟之间的随机时间让您知道一只鸭子已经到达。然后您可以回复 .bang
来射击鸭子并为您的分数加一分。但是,如果你回复得太快(在一秒钟内),它会让你进入 2 小时的冷却模式,你无法射击任何鸭子。有时它还会因为“卡壳枪”等原因导致 7 秒冷却时间,如游戏机器人代码的第 272 行所示。
Perl 代码
use Net::IRC;
use Time::HiRes qw(usleep nanosleep);
$ducksource = 'DUCK_SOURCE';
$server = 'IRC_SERVER';
$channel = 'IRC_CHANNEL';
$botnick = 'BOT_NICKNAME';
$botnick2 = 'BOT_BACKUP_NICKNAME';
$password = 'BOT_PASSWORD';
$botadmin = 'BOT_ADMIN_NICKNAME';
$irc = new Net::IRC;
$conn = $irc->newconn(
Nick => $botnick,
Server => $server,
Port => IRC_SERVER_PORT,
Username => $botnick
);
$conn->add_global_handler('376', \&on_connect);
$conn->add_global_handler('disconnect', \&on_disconnect);
$conn->add_global_handler('kick', \&on_kick);
$conn->add_global_handler('msg', \&on_msg);
$conn->add_global_handler('public', \&on_public);
$irc->start;
sub on_connect {
$self = shift;
$self->privmsg('nickserv', "identify $password");
$self->join($channel);
print "Connected\n";
}
sub on_disconnect {
$self = shift;
print "Disconnected, attempting to reconnect\n";
$self->connect();
}
sub on_kick {
$self = shift;
$self->join($channel);
$self->privmsg('nickserv', "/nick $botnick");
}
sub on_msg {
$self = shift;
$event = shift;
if ($event->nick eq $botadmin) {
foreach $arg ($event->args) {
if ($arg =~ m/uptime/) {
$self->privmsg($botadmin, `uptime`);
}
}
}
}
sub on_public {
$self = shift;
$event = shift;
if ($event->nick eq $ducksource) {
foreach $arg ($event->args) {
if (($arg =~ m/</) && ($arg !~ m/>/)) {
usleep(250000);
$self->privmsg($channel, ".bang");
}
if ( ($arg =~ m/missed/)
|| ($arg =~ m/jammed/)
|| ($arg =~ m/luck/)
|| ($arg =~ m/WTF/)) {
$self->privmsg('nickserv', "/nick $botnick2");
$self->privmsg($channel, ".bang");
$self->privmsg('nickserv', "/nick $botnick");
}
if (($arg =~ m/script/) || ($arg =~ m/period/)) {
$self->privmsg('nickserv', "/nick $botnick2");
$self->privmsg($channel, ".bang");
}
}
}
}
Perl 机器人连接到服务器,加入聊天室,并响应鸭子出现,但我无法让它延迟发送命令 .bang
以便游戏机器人接收在 1 秒过去后,我没有进入两小时冷却模式。
我知道 Perl sleep
命令只接受一秒的倍数。我需要延迟 0.25 秒,因为消息到达游戏机器人大约需要 0.75 秒,所以我尝试使用 Time::HiRes 和 usleep
命令,它使用微秒(1,000 微秒 = 1 毫秒).
在我的代码的第 61 行,我添加了 usleep(250000)
这应该使脚本暂停 0.25 秒然后在下一行发送消息
$self->privmsg($channel, ".bang")
但脚本不会等待 -- 它只是正常发送消息。它的行为就像忽略了 usleep
命令。
我该如何解决这个问题并让机器人在发送消息之前等待?
其次,我对如何更改昵称感到困惑。如果游戏机器人给我 7 秒的冷却时间,我想快速将我的昵称更改为另一个昵称(例如 HunterBot6000
到 HunterBot6000_
)射击鸭子(.bang
),然后更改在另一个机器人得到鸭子之前我的昵称。通常,您可以通过 /nick NEWNICK
命令完成缺刻更改。但是,我已经尝试将此命令发送到频道和 NickServ,这并没有改变我的昵称。我该如何完成?
我还尝试为脚本编写一个 XChat 插件,看看是否可以解决计时问题,但这也不起作用。在连接到服务器并加入 XChat 中的聊天室后,我加载了插件,但我遇到了同样的问题——它用 .bang
响应鸭子,但我无法让它在发送前等待。
您可以查看文档 Writing a simple XChat Perl Script。我做错了什么?
你问了多个问题,但我只能回答一个 phone
发送即可更改昵称
NICK newnick
可以在 RFC 2812 中找到更多信息。
但是,Net::IRC 可能有更合适的方法。
我也遇到过来自 Time::HiRes 的 usleep 问题。这应该会影响 250 毫秒的睡眠:
select(undef, undef, undef, 0.25);
感谢大家的帮助。我能够让 usleep
命令正常工作,并通过将延迟更改为更大的秒数(例如 usleep(25000000)
、25 秒)然后通过删除更改回 0.25 秒来验证它是否正确延迟一次 0
个。我还在前后添加了 print Time::HiRes::time;
以验证延迟是否有效。我还发现更改昵称的正确命令是 $self->nick($botnick2);
,尽管在任何 Net::IRC 文档中都找不到它。再次感谢大家的帮助和建议。