/* * The MIT License * * Copyright 2013 Jason Unger <entityreborn@gmail.com>. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. */ package com.entityreborn.socpuppet.extensions.builtins; import com.entityreborn.socbot.Colors; import com.entityreborn.socbot.Numerics; import com.entityreborn.socbot.SocBot; import com.entityreborn.socbot.Styles; import com.entityreborn.socbot.Target; import com.entityreborn.socbot.events.CTCPEvent; import com.entityreborn.socbot.events.CTCPReplyEvent; import com.entityreborn.socbot.events.ConnectedEvent; import com.entityreborn.socbot.events.ConnectingEvent; import com.entityreborn.socbot.events.JoinEvent; import com.entityreborn.socbot.events.LineSendEvent; import com.entityreborn.socbot.events.ModeChangeEvent; import com.entityreborn.socbot.events.NickInUseEvent; import com.entityreborn.socbot.events.NoticeEvent; import com.entityreborn.socbot.events.NumericEvent; import com.entityreborn.socbot.events.PacketReceivedEvent; import com.entityreborn.socbot.events.PartEvent; import com.entityreborn.socbot.events.PrivmsgEvent; import com.entityreborn.socbot.events.QuitEvent; import com.entityreborn.socbot.events.WelcomeEvent; import com.entityreborn.socbot.eventsystem.EventHandler; import com.entityreborn.socbot.eventsystem.Listener; import com.entityreborn.socpuppet.config.BotConfig; import com.entityreborn.socpuppet.config.ChannelConfig; import com.entityreborn.socpuppet.config.ConnectionConfig; import com.entityreborn.socpuppet.extensions.AbstractTrigger; import com.entityreborn.socpuppet.extensions.ExtensionManager; import com.entityreborn.socpuppet.extensions.ExtensionTracker; import com.entityreborn.socpuppet.extensions.annotations.Permission; import com.entityreborn.socpuppet.extensions.annotations.Permission.DefaultTo; import com.entityreborn.socpuppet.users.RegisteredUser; import com.entityreborn.socpuppet.users.SocPuppetUser; import java.io.BufferedWriter; import java.io.File; import java.io.FileWriter; import java.io.Writer; import java.util.regex.Matcher; import java.util.regex.Pattern; /** * * @author Jason Unger <entityreborn@gmail.com> */ public class BuiltinListener implements Listener { BotConfig config; public BuiltinListener(BotConfig config) { this.config = config; } public void debug(SocBot bot, String message) { System.out.println("[" + bot.getID() + "] " + message); } @EventHandler public void handleConnecting(ConnectingEvent event) { debug(event.getBot(), "Connecting to " + event.getServer() + (event.getPort() != 6667 ? event.getPort() : "")); } @EventHandler public void handleConnected(ConnectedEvent event) { debug(event.getBot(), "Connected"); } @EventHandler public void handleWelcome(WelcomeEvent event) { debug(event.getBot(), event.getServerName() + " welcomed us to the server."); ConnectionConfig conn = config.getConnection(event.getBot().getID()); for (String channame : conn.getChannelNames()) { ChannelConfig chan = conn.getChannel(channame); if (chan.getAutoJoin()) { event.getBot().join(channame, chan.getPassword()); } } } @EventHandler public void handleJoin(JoinEvent event) { debug(event.getBot(), event.getUser().getName() + " joined " + event.getChannel()); } @EventHandler public void handlePart(PartEvent event) { debug(event.getBot(), event.getUser().getName() + " left " + event.getChannel() + " (" + event.getPartMessage() + ")"); } @EventHandler public void handleQuit(QuitEvent event) { debug(event.getBot(), event.getUser().getName() + " quit (" + event.getQuitMessage() + ")"); } Pattern maskpat = Pattern.compile("- ([^\\s]*)\\s*(.*?)/x.*"); File fout = new File("commands.txt"); @EventHandler public void handleNotice(NoticeEvent event) { if (event.getUser().getName().equalsIgnoreCase("HostServ")) { String message = Colors.removeAll(Styles.removeAll(event.getMessage())); Matcher match = maskpat.matcher(message); if (match.find()) { try { try (Writer output = new BufferedWriter(new FileWriter(fout, true))) { String nick = match.group(1); String mask = match.group(2); output.append("/msg HostServ vhost " + nick + " " + mask + "\r\n"); output.flush(); } } catch (Exception ex) { System.out.println(ex.getMessage()); } } } } private final Pattern regex = Pattern.compile("^\\^([^\\ ]+)(\\s+?(.*))?", Pattern.CASE_INSENSITIVE | Pattern.UNICODE_CASE | Pattern.MULTILINE | Pattern.COMMENTS); @EventHandler public void handleMsg(PrivmsgEvent event) { Matcher regexMatcher = regex.matcher(event.getMessage()); Target target = event.getTarget(); if (event.getTarget().getName().equals(event.getBot().getNickname())) { target = event.getSender(); } if (event.getSender() instanceof SocPuppetUser) { SocPuppetUser user = (SocPuppetUser)event.getSender(); if (user.getRegistration() == null) { user.attemptHostmaskLogin(); } } if (regexMatcher.matches()) { String trigger = regexMatcher.group(1); String args = regexMatcher.group(3); if (args == null) { args = ""; } for (ExtensionTracker tracker : ExtensionManager.Get().getTrackers().values()) { if (tracker.getTriggers().keySet().contains(trigger)) { AbstractTrigger trig = tracker.getTriggers().get(trigger); System.out.println("Called " + trig.plugin() + ":" + trig.name()); SocPuppetUser user = (SocPuppetUser)event.getUser(); Permission perm = trig.permission(); if (perm != null) { RegisteredUser regUser = user.getRegistration(); if (regUser == null) { target.sendMsg("You aren't logged in! This" + " command requires the '" + perm.node() + "' permission."); event.setCancelled(true); return; } boolean hasPerm = user.getRegistration().hasPerm( perm.node(), perm.defaultTo() == DefaultTo.ALLOW); if (!hasPerm) { target.sendMsg("I'm sorry, you don't have" + " permission to run this command! This" + " command requires the '" + perm.node() + "' permission."); event.setCancelled(true); return; } } String response = trig.exec(event, trigger, args); if (response != null && !response.trim().isEmpty()) { target.sendMsg(response); } break; } } } } @EventHandler public void handleNickInUse(NickInUseEvent event) { event.getBot().setNickname(event.getNick() + "|"); } @EventHandler public void handleCTCP(CTCPEvent event) { if (event.getType().equals("PING")) { event.getSender().sendCTCPReply("PING", event.getMessage()); } } @EventHandler public void handleCTCPReply(CTCPReplyEvent event) { } @EventHandler public void handleLineIn(PacketReceivedEvent event) { debug(event.getBot(), event.getPacket().getOriginalLine()); } @EventHandler public void handleNumeric(NumericEvent event) { if (event.getNumeric() == Numerics.BuiltinNumeric.ERR_NICKNAMEINUSE) { String newnick = event.getPacket().getArgs().get(0); event.getBot().setNickname(newnick + "_"); } } @EventHandler public void handleLineOut(LineSendEvent event) { debug(event.getBot(), event.getLine()); } @EventHandler public void handleModeChange(ModeChangeEvent event) { } }