Irssi 循环通过频道中的用户

Posted

技术标签:

【中文标题】Irssi 循环通过频道中的用户【英文标题】:Irssi Loop Through Users in Channel 【发布时间】:2015-02-16 17:38:01 【问题描述】:

我正在尝试将我见过的其他脚本拼凑起来,以便能够遍历频道上的用户列表。

这是我想出来的

my $channel = @_;
foreach my $nick ($channel->nicks()) 
    $server->command("msg $chatchannel $nick->nick");

但我从中得到的只是

如果没有包或对象引用,则无法调用方法“nicks” /root/.irssi/scripts/test.pl 第 64 行。

指的是

$channel->nicks()

我是不是走错了路?或者这应该有效吗?我见过许多其他使用 $channel->nicks() 的脚本,所以我知道它一定可以工作?

编辑

我还应该提到,这已经在代码中进一步定义

my ($server, $msg, $target, $channel, $chatnet) = @_;

但是当我尝试使用 $channel 变量时,我得到了

无法通过包定位对象方法“nicks” “mattigins@mattigins.tmi.twitch.tv”(也许你忘了加载 “mattigins@mattigins.tmi.twitch.tv”?)在/root/.irssi/scripts/test.pl 第 64 行。

【问题讨论】:

$_ 中有什么内容?你从哪里得到它?显然它不是您所期望的 Channel 对象实例。 对不起,是的,它应该是@_,它也做同样的事情 【参考方案1】:

由于my $channel = @_; 的左侧 (LHS) 是一个标量,它会将标量上下文强加于 @_ 数组。这意味着数组的长度被分配给$channel。您想使用 my ($channel) = @_; 进行分配,以便 LHS 在列表上下文中,并且 @_ 数组中的第一个元素被分配给您的标量。

参考:

What is the difference between the scalar and list contexts in Perl?

Scalar and List context in Perl

【讨论】:

感谢您的建议。我尝试将 () 放在 $channel 周围,但现在我收到此错误 Can't locate object method "nicks" via package "Irssi::Irc::Server" at /root/.irssi/scripts/test.pl line 64.【参考方案2】:

我想出了办法。

$chan = $server->channel_find('#channel');
foreach my $nick ($chan->nicks()) 
    $nickname = $nick->nick;

【讨论】:

以上是关于Irssi 循环通过频道中的用户的主要内容,如果未能解决你的问题,请参考以下文章

自动加入 Irssi 中所有当前打开的频道

获取频道并循环播放 discord.net

Discord Bot 删除特定频道中的消息

如何在循环中创建频道?

如何确定用户是不是加入/切换/离开了语音频道?

如何通过自动生成的频道#name 获取 youtube 频道 ID?