Here's the plugin I used, its kinda a hack in some places, but it has no external deps and it used to work.
Maybe someone should put it up on svn?
Code: Select all
package koreIRC;
use strict;
use Plugins;
use Globals;
use Log qw(message debug error);
use Commands;
use Utils qw(dataWaiting);
use IO::Socket::INET;
use Time::HiRes qw(time usleep);
#added
use Utils qw(timeOut);
use Utils::DataStructures qw(existsInList);
### USER CONFIGURATION ###
my $irc_server = 'irc.openkore.com';
my $irc_port = 6667;
my $irc_nick = 'test';
my $irc_password = '';
my $irc_username = 'KoreIRC';
my $irc_desc = 'Just a Bot';
my $irc_channel = '#test';
my $irc_webmaster = 0;
my $Commander_Password = 'justatest';
my $irc_session_timeout = 120;
my $irc_channel_pwd = "";
my $irc_identify_pwd = "";
### USER CONFIGURATION ###
#my $irc_debug = 1;
my $irc_sent_login = 0;
my $irc_socket;
#my $irc_connect_step = 1;
my $irc_session_time;
my $irc_session;
#UNUSED
#my %timeout;
$timeout{loginSent}{timeout} = 0;
#$timeout{ircConnectCheck}{time} = time;
# register the plugin with openkore
Plugins::register('koreIRC', 'Communication between kore and IRC.', \&unload, \&reload);
my $hooks = Plugins::addHooks(
['mainLoop_post',\&ircLoop,undef],
);
my $log_hook = Log::addHook(\&redirectToIRC,"");
sub unload {
Plugins::delHooks($hooks);
Log::delHook($log_hook);
close($irc_socket) if (ircSocketOpen());
message("koreIRC plugin unloaded.\n","koreIRC");
}
sub reload {
&unload;
}
my $dcc_socket;
my $dccSockMsg;
my $dccConnected = 0;
my $IRC_Connection = 0;
my $ircsockmsg;
# redirects the allowed kore messages to IRC
sub redirectToIRC {
my ($type, $domain, $level, $globalVerbosity, $message, $user_data) = @_;
# ignoredomains is for if you hook on msgToIRC and do something in the console there
return unless (existsInList($config{'irc_redirectDomains'}, $domain) || $user_data && !existsInList($config{'irc_ignoreDomains'}, $domain));
#hardcoded this ignore
return if ($domain =~ /^(koreIRC)/);
# (e.x.) printing out a playerlist to IRC in separate lines
my (@message) = split(/\n/,$message);
if (ircSocketOpen()) {
# see $Log_Hook_ID
my $receiver = $user_data || $irc_channel;
foreach $message (@message) {
$irc_socket->send("PRIVMSG $receiver :$message\n");
#debug("(To $receiver): $message\n","koreIRC");
#kore to IRC
my $type = ($user_data) ? 'Query' : 'Channel';
Plugins::callHook('msgToIRC', {receiver => $receiver, msg => $message, type => $type});
}
}
}
sub ircLoop {
ircConnectionCheck();
return if (!ircSocketOpen());
if (dataWaiting(\$irc_socket)) {
#$irc_sent_login = 1;
$irc_socket->recv($ircsockmsg, 512);
#next => return?
return if (length($ircsockmsg) <= 1);
my (@ircsockmsg) = split(/\n/,$ircsockmsg);
foreach $ircsockmsg (@ircsockmsg) {
# check for PING
if ($ircsockmsg =~ m/^PING/) {
(undef, $ircsockmsg) = split(/\s/,$ircsockmsg);
$ircsockmsg =~ s/://g;
$irc_socket->send("PONG $ircsockmsg\n");
return;
}
my ($ircname, $irccmd, $irctarget) = split(/\s/,$ircsockmsg);
if ($irccmd eq "PRIVMSG") {
# we DO care about channel messages for now => example channel: #openkore, so make different for that, way to separate public from pm
#commented return if ($irctarget =~ m/^#/);
my (undef,undef,$ircchat) = split(/:/,$ircsockmsg);
my ($ircmsgnick) = split(/!/,$ircsockmsg);
$ircmsgnick =~ s/://g;
debug("(From $ircmsgnick): $ircchat\n","koreIRC");
#IRC to kore
my $type = (!($irctarget =~ m/^#/)) ? 'Query' : 'Channel';
Plugins::callHook('msgFromIRC', {sender => $ircmsgnick, msg => $ircchat, type => $type});
# handle sub protocol
if ( $ircchat =~ m/\001(.*?) (.*)\001*/ ) {
ircHandleSubProtocol($1, $2);
return; # continue on next main loop
}
if ($ircchat =~ /^auth/i) {
my (undef, $tmppassword) = split(/\s/,$ircchat);
if ($tmppassword eq $Commander_Password) {
message("[IRC] -> Authorized $ircmsgnick for $irc_session_timeout seconds\n", "koreIRC");
$irc_socket->send("PRIVMSG $ircmsgnick :Your command has been authorized.\n");
$irc_session_time = time();
$irc_session = $ircmsgnick;
}
return;
}
# session timed out
if ($irc_session_time && time() > ($irc_session_time + $irc_session_timeout)) {
$irc_session_time = 0;
$irc_session = '';
message("[IRC] -> $ircmsgnick is no longer authorized.\n");
$irc_socket->send("PRIVMSG $ircmsgnick :You are no longer authorized.\n");
}
next if ($irc_session ne $ircmsgnick);
message("[IRC] -> <Admin commander> $ircchat\n");
my($ircadmincmd) = split(/\s/,$ircchat);
if ($ircadmincmd eq "logout") {
$irc_session_time = 0;
$irc_session = '';
message("[IRC] -> $ircmsgnick has been logout.\n", "koreIRC");
#4,1 is some sort of color in IRC
$irc_socket->send("PRIVMSG $ircmsgnick :" . chr(3) . "4,1Done.\n");
next;
} else {
my $Log_Hook_ID = Log::addHook(\&redirectToIRC,$ircmsgnick);
$ircchat =~ s/[\r\n].*$//;
Commands::run($ircchat);
Log::delHook($Log_Hook_ID);
}
next;
} elsif ($irccmd eq "001" || $irccmd eq "007") {
$irc_socket->send("PRIVMSG nickserv :identify $irc_identify_pwd\n");
$irc_socket->send("JOIN $irc_channel $irc_channel_pwd\n");
$irc_socket->send("UMODE -mM\n") if ($irc_webmaster);
message("[IRC] -> Logged on irc server ($irc_server)\n");
message("[IRC] -> Joining channel $irc_channel\n");
next;
} elsif ($irccmd eq "433") {
my $newnick = substr($irc_nick,0,5) . int(rand(9999));
$irc_socket->send("NICK $newnick\n");
message("[IRC] -> Nickname in use, Using random nick instead ($newnick)\n");
next;
} elsif ($irccmd eq "372") {
#message("[IRC] -> MOTD\n", "koreIRC");
} elsif ($irccmd eq "376") {
#message("[IRC] -> END MOTD\n", "koreIRC");
}
}
}
}
### IRC CONNECTION HANDLING ###
# ircSocketCheck
sub ircSocketOpen {
($irc_socket && $irc_socket->connected()) ? return 1 : return 0;
}
# ircConnectionCheck
sub ircConnectionCheck {
if (!ircSocketOpen()) {
message("[IRC] -> Opening socket\n", "koreIRC");
$irc_socket = new IO::Socket::INET(PeerAddr => $irc_server, PeerPort => $irc_port, Proto => 'tcp');
#$irc_socket = new IO::Socket::INET(
# PeerHost => $irc_server,
# PeerPort => $irc_port,
# Proto => 'tcp'
#);
$irc_sent_login = 0;
}
ircSendLogin() if (!$irc_sent_login && ircSocketOpen());
}
# ircSendLogin
sub ircSendLogin {
$irc_socket->send("PASS $irc_password\n") if ($irc_password);
$irc_socket->send("NICK $irc_nick\n");
$irc_socket->send("USER $irc_username $irc_username $irc_username :$irc_desc\n");
message("[IRC] -> Sending login request\n", "koreIRC");
$irc_sent_login = 1;
}
return 1;