com.sk89q.eduardo.plugin.irc.PircBotXClient.java Source code

Java tutorial

Introduction

Here is the source code for com.sk89q.eduardo.plugin.irc.PircBotXClient.java

Source

/*
 * Eduardo, an IRC bot framework
 * Copyright (C) sk89q <http://www.sk89q.com>
 * Copyright (C) Eduardo team and contributors
 *
 * This program is free software: you can redistribute it and/or modify it
 * under the terms of the GNU Lesser General Public License as published by the
 * Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License
 * for more details.
 *
 * You should have received a copy of the GNU Lesser General Public License
 * along with this program. If not, see <http://www.gnu.org/licenses/>.
 */

package com.sk89q.eduardo.plugin.irc;

import com.google.common.base.Strings;
import com.google.inject.Inject;
import com.sk89q.eduardo.event.StartupEvent;
import com.sk89q.eduardo.event.message.BroadcastEvent;
import com.sk89q.eduardo.event.message.MessageEvent;
import com.sk89q.eduardo.model.context.Context;
import com.sk89q.eduardo.model.context.Mode;
import com.sk89q.eduardo.model.response.Response;
import com.sk89q.eduardo.service.event.EventBus;
import com.sk89q.eduardo.service.event.Subscribe;
import com.sk89q.eduardo.service.plugin.Plugin;
import com.sk89q.eduardo.util.config.Config;
import com.sk89q.eduardo.util.formatting.StyledFragment;
import org.pircbotx.*;
import org.pircbotx.Configuration.Builder;
import org.pircbotx.hooks.Event;
import org.pircbotx.hooks.Listener;
import org.pircbotx.hooks.events.NoticeEvent;
import org.pircbotx.hooks.types.GenericMessageEvent;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import javax.annotation.Nullable;
import java.util.*;

@Plugin(id = "irc")
public class PircBotXClient implements Listener<IRCBot> {

    private static final Logger log = LoggerFactory.getLogger(PircBotXClient.class);

    private final Map<String, Builder<IRCBot>> builders = new HashMap<>();
    private final MultiBotManager<IRCBot> manager = new MultiBotManager<>();
    @Inject
    private EventBus eventBus;

    @Inject
    public PircBotXClient(Config config, EventBus eventBus) {
        eventBus.register(this);

        Config irc = config.getConfig("irc");

        Builder<IRCBot> base = new Configuration.Builder<IRCBot>().setVersion(irc.getString("version", "Eduardo"))
                .setAutoSplitMessage(true).setIdentServerEnabled(false).setAutoNickChange(true);

        for (Config server : irc.getList("servers", Config.class)) {
            Builder<IRCBot> builder = new Builder<>(base).setServer(server.getString("host", "localhost"),
                    server.getInt("port", 6667), server.getString("password", ""));

            builder.setName(server.getString("name", "MyNewBot")).setLogin(server.getString("name", "MyNewBot"))
                    .setFinger(server.getString("name", "MyNewBot"))
                    .setRealName(server.getString("name", "MyNewBot"));

            if (server.getBoolean("ssl", false)) {
                builder.setSocketFactory(new UtilSSLSocketFactory().trustAllCertificates());
            }

            builder.setNickservPassword(Strings.emptyToNull(server.getString("nickserv.password", "")));

            for (String channel : server.getList("auto-join", String.class)) {
                log.info("Auto-joining channel {}", channel);
                builder.addAutoJoinChannel(channel);
            }

            builders.put(server.getString("id", "noname-" + System.currentTimeMillis()), builder);
        }
    }

    @Subscribe
    public void onStartup(StartupEvent event) {
        for (Map.Entry<String, Builder<IRCBot>> entry : builders.entrySet()) {
            Builder<IRCBot> builder = entry.getValue();
            builder.addListener(this);
            manager.addBot(new IRCBot(builder.buildConfiguration(), entry.getKey()));
        }

        Thread thread = new Thread(manager::start, "PircBotX");
        thread.start();
    }

    @Subscribe
    public void onGenericMessage(GenericMessageEvent<IRCBot> event) {
        eventBus.post(new MessageEvent(createContext(event), event.getMessage(), new ResponseImpl(event)));
    }

    @Subscribe
    public void onBroadcast(BroadcastEvent event) {
        String target = event.getTarget();
        if (target.startsWith("#")) {
            for (PircBotX bot : manager.getBots()) {
                bot.sendIRC().message(target, IRCColorBuilder.asColorCodes(event.getMessage()));
            }
        }
    }

    @Override
    public void onEvent(Event<IRCBot> event) throws Exception {
        eventBus.post(event);
    }

    private static Context createContext(GenericMessageEvent<? extends IRCBot> event) {
        User user = event.getUser();
        @Nullable
        Channel channel;
        List<Mode> modes = new ArrayList<>();

        if (event instanceof org.pircbotx.hooks.events.MessageEvent) {
            channel = ((org.pircbotx.hooks.events.MessageEvent) event).getChannel();
        } else if (event instanceof NoticeEvent) {
            channel = ((NoticeEvent) event).getChannel();
        } else {
            channel = null;
        }

        if (channel != null) {
            if (user.getChannelsOpIn().contains(channel)) {
                modes.add(Mode.OPERATOR);
            }

            if (user.getChannelsHalfOpIn().contains(channel)) {
                modes.add(Mode.HALF_OP);
            }

            if (user.getChannelsVoiceIn().contains(channel)) {
                modes.add(Mode.VOICED);
            }
        }

        return new Context(new IRCNetwork(event.getBot()), new IRCUser(event.getUser()),
                channel != null ? new IRCRoom(channel) : null,
                modes.isEmpty() ? Collections.emptySet() : EnumSet.copyOf(modes));
    }

    private static class ResponseImpl implements Response {
        private final GenericMessageEvent<?> event;

        private ResponseImpl(GenericMessageEvent<?> event) {
            this.event = event;
        }

        @Override
        public void respond(StyledFragment fragment) {
            event.respond(IRCColorBuilder.asColorCodes(fragment));
        }

        @Override
        public void broadcast(StyledFragment fragment) {
            String message = IRCColorBuilder.asColorCodes(fragment);

            if (event instanceof org.pircbotx.hooks.events.MessageEvent) {
                ((org.pircbotx.hooks.events.MessageEvent) event).getChannel().send().message(message);
            } else {
                event.respond(message);
            }
        }
    }

}