+#!/usr/bin/perl
#
# OnJoin.pl: emit a message when a user enters the channel
-# Author: tensai
-# Version: v0.1
+# Author: Corey Edwards <tensai@zmonkey.org>
+# Version: v0.3.1
# Created: 20051222
-# Updated: 20051230
+# Updated: 20060112
use strict;
sub onjoin {
my ($nick, $user, $host, $chan) = @_;
- my $n = lc $nick;
- my $message = &sqlSelect('onjoin', 'message', { nick => $n, channel => $chan } ) || 0;
+ $nick = lc $nick;
+
+ # look for a channel specific message
+ my $message = &sqlSelect('onjoin', 'message', { nick => $nick, channel => $chan } ) || 0;
+
+ # look for a default message
+ if (!$message){
+ $message = &sqlSelect('onjoin', 'message', { nick => $nick, channel => '_default' } ) || 0;
+ }
# print the message, if there was one
if ($message){
- &status("OnJoin: $nick arrived");
- &msg($chan, $message);
+ $message = substVars($message, 1);
+ if ($message =~ m/^<action>\s*(.*)/){
+ &status("OnJoin: $nick arrived, performing action");
+ &action($chan, $1);
+ }
+ else{
+ $message =~ s/^<reply>\s*//;
+ &status("OnJoin: $nick arrived, printing message");
+ &msg($chan, $message);
+ }
}
return;
# set and get messages
sub Cmdonjoin {
- my $msg = shift;
- $msg =~ m/(.*?)( (.*))/;
- my $nick = $1;
- $msg = $3;
+ $_ = shift;
+ m/(\S*)(\s*(\S*)(\s*(.*)|)|)/;
+ my $ch = $1;
+ my $nick = $3;
+ my $msg = $5;
+
+ # get options
+ my $strict = &getChanConf('onjoinStrict');
+ my $ops = &getChanConf('onjoinOpsOnly');
+
+ # see if they specified a channel
+ if ($ch !~ m/^\#/ && $ch ne '_default'){
+ $msg = $nick . ($msg ? " $msg" : '');
+ $nick = $ch;
+ $ch = $chan;
+ }
+
+ $nick = lc $nick;
+
+ if ($nick =~ m/^-(.*)/){
+ $nick = $1;
+ if ($ops){
+ if (!$channels{$chan}{o}{$who}){
+ &performReply("sorry, you're not an operator");
+ }
+ }
+ elsif ($strict){
+ # regardless of strict mode, ops can always change
+ if (!$channels{$chan}{o}{$who} and $nick ne $who){
+ &performReply("I can't alter a message for another user (strict mode)");
+ }
+ }
+ else{
+ &sqlDelete('onjoin', { nick => $nick, channel => $ch });
+ &performReply('ok');
+ }
+ return;
+ }
# if msg not set, show what the message would be
if (!$msg){
$nick = $who if (!$nick);
- $msg = &sqlSelect('onjoin', 'message', { nick => $nick, channel => $chan } ) || '';
- if ($msg){
- &performReply($msg);
+ my %row = &sqlSelectRowHash('onjoin', 'message, modified_by, modified_time', { nick => $nick, channel => $ch } );
+ if ($row{'message'}){
+ &performStrictReply("onjoin for $nick set by $row{modified_by} on " . localtime($row{modified_time}) . ": $row{message}");
}
return;
}
- # get params
- my $strict = &getChanConf('onjoinStrict');
- my $ops = &getChanConf('onjoinOpsOnly');
-
# only allow changes by ops
if ($ops){
if (!$channels{$chan}{o}{$who}){
}
}
- &sqlDelete('onjoin', { nick => $nick, channel => $chan});
- &sqlInsert('onjoin', { nick => $nick, channel => $chan, message => $msg});
- &performReply("ok");
+ # remove old one (if exists) and add new message
+ &sqlDelete('onjoin', { nick => $nick, channel => $ch });
+ my $insert = &sqlInsert('onjoin', { nick => $nick, channel => $ch, message => $msg, modified_by => $who, modified_time => time() });
+ if ($insert){
+ &performReply('ok');
+ }
+ else{
+ &performReply('whoops. database error');
+ }
return;
}