mewi
mewi

Reputation: 352

Java Twitch IRC Bot

So I'm working on a basic Twitch Bot for my channel and the code is as follows:

Config.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);
        }
    }

}

The console displays "Connected!" and "Successfully joined channel" however the bot is unresponsive, and is not in the channel I specified. It also does not print "Hello I am a bot" in the chat.

Upvotes: 1

Views: 5164

Answers (1)

Orel Eraki
Orel Eraki

Reputation: 12196

There are few things to consider about Twitch.

  1. Your email must be validated. Settings -> Profile -> Profile Settings
  2. Channel names must be entered as lowercase.
  3. Nickname are useless, twitch are using your profile nickname.
  4. Twitch uses IRCv3 Client Capability Negotiation aka CAP, which means you should be use it as well.
  5. You should only try enter existing channels, otherwise the server will ignore your JOIN channel.
  6. Twitch, allow themselves the opportunity to change your nickname while you logged in, which means, that the expected nick results, provided by TwitchBot class, can, and probably be incorrect if you supply any name different from your logged in profile nickname.

Twitch IRC Capabilities, can be found Here, here are few..

membership: JOIN, MODE, NAMES, PART
tags: PRIVMSG, etc'

You should add those CAP, first thing you are logged in.

Important Notice: PIRCBot, doesn't look to support twitch PRIVMSG format, which means onMessage callback, will not be called. which leaves you to handle the parsing of received messages, through handleLine general callback.

Code as been updated to apply to above changes, and you should set the final variables in order it to work.

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");
    }
}

Upvotes: 2

Related Questions