我试图让我的机器人检查一个命令是否由聊天的主持人发出。抽搐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);
}
}
正如您所看到的,出于调试原因,我输出了Status(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(),但也没有运气。 任何人都可以帮助我吗?
编辑:显然,Twitch的IRC协议不同。这个问题尚未得到解决。
答案 0 :(得分:1)
通过IRC服务器检查操作员会带来一些延迟。要查看有问题的IRC服务器是否将用户识别为操作员,您需要等待来自Twitch的MODE信号。在Pircbot中(假设您正在使用该库)如果您正在使用像Eclipse这样的IDE,则会在控制台中打印这些信号。
我一直在寻找类似的方法来快速捕获频道中的运营商,但我已经放弃了它,因为我发现IRC对我的应用程序来说不够快。相反,我只是将操作员列表与机器人本地存储在一起。如果有人执行命令,只需检查操作员文件。但是,如果延迟对您来说不是问题,那么以下说明可能会有用。
您应该触发的行是:
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);
}
}
答案 1 :(得分:0)
也许getUsers("channel");
会返回一个空列表,因此for
循环根本不会执行。
您应该将getStatus
方法更改为getStatus(String channel, String nickName)
,或者另外制作一个Channel
- 类,其中包含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 "";
}
答案 2 :(得分:0)
我知道这篇文章已经很久了,我想进一步参考和教育。请注意:getUsers(channel)
。他正试图获得名为" channel"的频道。你反而希望做的是top, right, bottom, left
。 :)