1. ホーム
  2. java

[解決済み] Java Twitch IRC ボット

2022-02-16 19:43:13

質問

私のチャンネル用に基本的なTwitch Botを作成しているのですが、コードは以下の通りです。

設定.java

import java.io.IOException;

import org.jibble.pircbot.IrcException;
import org.jibble.pircbot.NickAlreadyInUseException;

public class Config {

private static final String OAUTH = "MYOAUTHHERE";
private static final String ADRESS = "irc.chat.twitch.tv.";
private static final int PORT = 6667;
private static final String channelName = "#MYCHANNELNAMEHERE";

public static void main(String[] args) throws NickAlreadyInUseException, IOException, IrcException {

    TwitchBot bot = new TwitchBot();

    bot.setVerbose(true);

    bot.connect(ADRESS, PORT, OAUTH);
    // bot.onMessage(channelName, "Bot", channelName, channelName, channelName);
    System.out.println("Connected!");
    bot.joinChannel(channelName);
    System.out.println("Successfully joined channel!");

    bot.sendMessage(channelName, "Hello, I am a bot");

    }
}

TwitchBot.java

import org.jibble.pircbot.*;

public class TwitchBot extends PircBot {

private static final String channelName = "#MYCHANNELNAME";
private final String botName = "THEBOTNAME";

public TwitchBot() {
    this.setName(botName);
    this.setLogin(botName);

}

public String getchannelName() {
    return channelName;
}

@Override
public void onMessage(String channel, String sender, String login, String hostname, String message) {
    if (message.equalsIgnoreCase("time")) {
        String time = new java.util.Date().toString();
        sendMessage(channel, sender + ": The time is now " + time);
        }
    }

}

コンソールには "Connected!" と "Successfully joined channel" が表示されますが、ボットは無反応で、私が指定したチャンネルにも入っていません。また、チャットに "こんにちは、私はボットです" が表示されません。

どうすればいいですか?

Twitchについては、いくつか考慮すべき点があります。

  1. 電子メールの認証が必要です。設定 -> プロフィール -> プロフィール設定
  2. チャンネル名は必ず小文字で入力してください。
  3. ニックネームは、プロフィールのニックネームを使用するため、意味がありません。
  4. Twitchは IRCv3クライアント能力ネゴシエーション 別名 CAP ということは、あなたもそれを使うべきだということです。
  5. 既存のチャンネルにのみ参加するようにしてください。そうしないと、サーバーはあなたのJOINチャンネルを無視します。
  6. Twitchでは、ログイン中にニックネームを変更することが可能です。 TwitchBotクラス ログインしているプロフィールのニックネームと異なる名前を入力した場合、不正確になる可能性があります(おそらく)。

Twitch IRC機能 は、見つけることができます こちら ということで、ここではいくつか...

のメンバーシップを取得します。join、mode、names、part
タグを使用します。PRIVMSG、その他'

ログインして最初に、これらのCAPを追加する必要があります。

重要なお知らせです。 PIRCBotはtwitchのPRIVMSG形式をサポートしていないようで、これはつまり onMessage コールバックは呼び出されないので、受信したメッセージのパース処理は handleLine 一般的なコールバックです。

コード は、上記の変更に対応するために更新されました。

TwitchBot.java

import org.jibble.pircbot.*;

public class TwitchBot extends PircBot {

    private final String requestedNick;

    private String realNick;
    private String realServer;

    public TwitchBot(String nick) {
        this.requestedNick = nick;

        setName(this.requestedNick);
        setLogin(this.requestedNick);
    }

    @Override
    protected void onConnect() {
        super.onConnect();
        System.out.println("Connected!");

        // Sending special capabilities.
        sendRawLine("CAP REQ :twitch.tv/membership");
        sendRawLine("CAP REQ :twitch.tv/commands");
        sendRawLine("CAP REQ :twitch.tv/tags");
    }

    @Override
    protected void handleLine(String line) {
        super.handleLine(line);

        if (line.startsWith(":")) {
            String[] recvLines = line.split(" ");

            // First message is 001, extract logged in information.
            if (recvLines[1].equals("001")) {
                this.realServer = recvLines[0].substring(1);
                this.realNick = recvLines[2];
                System.out.println("realServer: " + this.realServer);
                System.out.println("realNick: " + this.realNick);
            }
        }
    }

    @Override
    protected void onJoin(String channel, String sender, String login, String hostname) {
        super.onJoin(channel, sender, login, hostname);
        if (sender.equals(this.realNick)){
            System.out.println("Successfully joined: " + channel);
        }
    }

    @Override
    protected void onMessage(String channel, String sender, String login, String hostname, String message) {
        if (message.equalsIgnoreCase("time")) {
            String time = new java.util.Date().toString();
            sendMessage(channel, sender + ": The time is now " + time);
        }
    }
}

goFile.java

import java.io.IOException;

import org.jibble.pircbot.IrcException;
import org.jibble.pircbot.NickAlreadyInUseException;

public class goFile {

    private static final String OAUTH = "MYOAUTHHERE";
    private static final String ADDRESS = "irc.twitch.tv.";
    private static final int PORT = 6667;
    private static final String Nick = "MYNICKHERE";
    private static final String Channel = "#MYCHANNELHERE";

    public static void main(String[] args) throws NickAlreadyInUseException, IOException, IrcException {

        TwitchBot bot = new TwitchBot(Nick);
        bot.setVerbose(true);

        bot.connect(ADDRESS, PORT, OAUTH);
        bot.joinChannel(Channel);
        bot.sendMessage(Channel, "Hello, I am a bot");
    }
}