2

我试图让我的机器人检查聊天主持人是否发出命令。twitch IRC 确实使用“@”作为主持人的前缀,就像任何其他 irc 一样。

这是包含检查的 onMessage 方法:

public void onMessage(String channel, String sender,String login, String hostname,String message) {

String opStatus = getStatus(sender);

if (message.equalsIgnoreCase("+questions") && (opStatus = "@")) {
       sendMessage(channel, "Message");
       System.out.println(sender.toString());
       System.out.println(opStatus);
    }
}

如您所见,出于调试原因,我输出了状态(opStatus)。发出命令的发送者的名字出现了,但下面的行完全是空的。

在这里我试图获取用户的状态:

private String getStatus(String nickname){

     String status = "";

     User userList[] = getUsers("channel");

     for(User user : userList ){

          if(nickname.equals(user.getNick())){
               status = user.getPrefix();
               break;
          }
     }
     return status;
}//end method getStatus

getPrefix() 记录了以下内容:

返回用户的前缀。如果用户对象是从频道中的用户列表中获得的,那么这将反映用户在该频道中的状态。

我也已经尝试过 isOp() ,但也没有运气。谁能帮我吗?

编辑:显然 IRC 协议对于 Twitch 是不同的。该问题尚未得到解决。

4

3 回答 3

1

通过 IRC 服务器检查操作员会带来一些延迟。要查看有问题的 IRC 服务器是否将用户识别为操作员,您需要等待来自 Twitch 的 MODE 信号。在 Pircbot(假设您正在使用该库)中,如果您使用的是 Eclipse 之类的 IDE,则会在控制台中打印这些信号。

我一直在寻找一种类似的方法来快速捕捉频道中的运营商,但我放弃了它,因为我发现 IRC 对我的应用程序来说不够快。相反,我只是将操作员列表与机器人一起保存在本地。如果有人执行命令,只需检查 Operator 文件。但是,如果延迟对您来说不是问题,那么下面的解释可能会有用。

您应该触发的线路是:

1425158996453 :jtv MODE #yourchannel +o someuser

和:

1425159389131 :jtv MODE #yourchannel -o someuser

正如您可能已经猜到的那样,+o 和 -o 表示此人是否已获得或失去操作员身份。

我正在使用一个自定义类,它允许我捕获打印流。最初,我将它用于不同的目的,但这可能正是您正在寻找的。该类是一个 JPanel,您可以将其放置在界面中的某个位置并查看其运行中的 PrintStream。以下代码全部放在一个文件中。

我希望这能够帮到你。干杯。

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.EventQueue;
import java.awt.Font;
import java.io.IOException;
import java.io.OutputStream;
import java.io.PrintStream;

import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;

public class Console extends JPanel implements Consumer 
{
    private static final long serialVersionUID = 1L;
    private JTextArea output;

    public Console() 
    {
        setLayout( new BorderLayout() );
        output = new JTextArea();
        add( new JScrollPane(output) );
        setLooks();

        PrintStream ps = System.out;
        System.setOut( new PrintStream( new StreamCapturer("OUT", this, ps) ) ); // print output
        System.setErr( new PrintStream( new StreamCapturer("ERR", this, ps) ) ); // print errors
        this.setFont( new Font( "Courier New" , Font.PLAIN ,10 ) );
    }

    @Override
    public void appendText(final String text) 
    {
        if (EventQueue.isDispatchThread()) 
        {
            output.append(text);
            output.setCaretPosition(output.getText().length());
        } 
        else 
        {
            EventQueue.invokeLater(new Runnable() 
            {
                @Override
                public void run() 
                {
                    appendText(text);
                }
            });
        }
    }       

    private static Color BACKGROUND = new Color(0.2f,0.2f,0.2f,1.0f);
    private static Color FOREGROUND = new Color(0.9f,0.9f,0.9f,1.0f);
    public void setLooks()
    {
        output.setBackground( BACKGROUND );
        output.setForeground( FOREGROUND );
        output.setFont( new Font( "Courier New" , Font.PLAIN , 12 ) );
        output.setCaretColor( FOREGROUND );
    }
}

interface Consumer 
{        
    public void appendText(String text);
}

class StreamCapturer extends OutputStream 
{
    private StringBuilder buffer;
    private Consumer consumer;
    private PrintStream old;

    public StreamCapturer(String prefix, Consumer consumer, PrintStream old) 
    {
        buffer = new StringBuilder(128);
        this.old = old;
        this.consumer = consumer;
    }

    @Override
    public void write(int b) throws IOException 
    {
        char c = (char) b;
        String value = Character.toString(c);
        buffer.append(value);
        if (value.equals("\n")) 
        {
            consumer.appendText(buffer.toString());
            buffer.delete(0, buffer.length());
        }
        old.print(c);
    }        
}
于 2015-02-28T21:51:03.227 回答
0

也许getUsers("channel");返回一个空列表,所以for循环根本不执行。您应该将getStatus方法更改为getStatus(String channel, String nickName)无论如何或制作一个单独的Channel-Class ,该类又包含一个getPrefix(String nickName)方法。

此外,您还应该重命名getStatus为,getPrefix因为它返回前缀而不是用户的状态。所以函数应该是这样的:

private String getPrefix(String channel, String nickname){
    User userList[] = getUsers(channel);

    for(User user : userList ){        
        if(nickname.equals(user.getNick())){
            return user.getPrefix();
        }
    }

    return "";
}
于 2015-01-03T08:14:33.087 回答
0

我知道这篇文章早已死去,但我想进一步参考和教育。请注意:getUsers("channel"). 他正在尝试将频道命名为“频道”。相反,您想要做的是getUsers(channel). :)

于 2017-11-30T19:10:09.900 回答