--- ChivanetConvoBot/convobot 2025/02/03 17:31:28 1.4
+++ ChivanetConvoBot/convobot 2025/02/03 18:14:15 1.5
@@ -9,6 +9,9 @@
# Licensed AGPL-3.0
#
# $Log: convobot,v $
+# Revision 1.5 2025/02/03 18:14:15 snw
+# Further work on bot
+#
# Revision 1.4 2025/02/03 17:31:28 snw
# Further MySQL work
#
@@ -48,6 +51,8 @@ my $online = 0;
my $chat_idle_seconds = 0;
my $last_chat_received = time();
my $start_time = time();
+my $dbh = '';
+my $dsn = '';
my @congregants = ();
@@ -73,16 +78,17 @@ sub update_seen_status {
my($sn) = @_;
my $del = $dbh->prepare("DELETE FROM seen WHERE aim_server=? AND aim_sn=? AND aim_chatroom=? AND sn=?");
- $del->execute($botsrv, $botsn, $chatroom, $sn);
+ $del->execute($botsrv, $botsn, $chatroom, $sn) or die "error DBI->errstr()";
- my $ins = $dbh->prepare("INSERT INTO seen (aim_server, aim_sn, aim_chatroom, sn, seen_time) VALUES (?, ?, ?, ?, ?");
- $ins->execute($botsrv, $botsn, $chatroom, $sn, localtime);
+ my $ins = $dbh->prepare("INSERT INTO seen (aim_server, aim_sn, aim_chatroom, sn, seen_time) VALUES (?, ?, ?, ?, ?)");
+ my $seentime = localtime();
+ $ins->execute($botsrv, $botsn, $chatroom, $sn, $seentime) or die "error DBI->errstr()";
}
sub signon_done {
print "[OK]\n";
- print "Joining $chatroom...";
- $oscar->chat_join($chatroom, 5);
+ print "convobot: joining $chatroom...";
+ $oscar->chat_join($chatroom, 5);
print "[OK]\n";
$online = 1;
}
@@ -91,10 +97,10 @@ sub oscar_error {
my($oscar, $connection, $error, $description, $fatal) = @_;
if($fatal != 0) {
- die "\nFatal OSCAR error: $description\n";
+ die "\nconvobot: fatal OSCAR error: $description\n";
}
else {
- print "\nRecoverable OSCAR error: $description\n";
+ print "\nconvobot: recoverable OSCAR error: $description\n";
}
}
@@ -102,8 +108,21 @@ sub oscar_error {
sub chat_joined {
my($oscar, $chatname, $chat) = @_;
+ print "bot: chat joined [$chatname]\n";
+
$room = $chat;
bless $room, "Net::OSCAR::Connection::Chat";
+
+ print "convobot: connecting to database $dbname\@$dbhost...";
+
+ $dsn = "DBI:mysql:database=$dbname;host=$dbhost;port=3306;mysql_connect_timeout=5;";
+ $dbh = DBI->connect($dsn, $dbusername, $dbpw, {RaiseError => 1});
+ die "convobot: failed to connect to MySQL database: DBI->errstr()" unless $dbh;
+
+ print "[OK]\n";
+
+ $oscar->set_callback_chat_buddy_in(\&chat_buddy_in);
+ $oscar->set_callback_chat_buddy_out(\&chat_buddy_out);
}
sub chat_buddy_in {
@@ -113,10 +132,10 @@ sub chat_buddy_in {
if($who ne $botsn) {
push(@congregants, $who);
- print "[$who] has joined\n";
+ print "convobot: [$who] has joined\n";
}
else {
- print "[$who] has joined (ignoring bot)\n";
+ print "convobot: [$who] has joined (ignoring bot)\n";
}
@@ -135,7 +154,7 @@ sub chat_buddy_in {
$chat->chat_send($phrasefix);
}
else {
- print "Not sending greeting for 2 seconds after startup\n";
+ print "convobot: not sending greeting for 2 seconds after startup\n";
}
}
}
@@ -147,7 +166,7 @@ sub chat_buddy_out {
$index++ until $congregants[$index] eq $who;
splice(@congregants, $index, 1);
- print "$who has left\n";
+ print "convobot: $who has left\n";
}
sub chat_im_in {
@@ -158,21 +177,35 @@ sub chat_im_in {
my @cmd = split(' ', $rawcmd);
update_seen_status($who);
-
- if($cmd[0] eq "!seen") {
- if(exists($cmd[1])) {
- get_seen_status($cmd[1], $chat);
- }
- else {
- $chat->chat_send("Syntax: !seen screenname");
- }
+
+ if($who ne $botsn) {
+ if($cmd[0] eq "!seen") {
+ if(exists($cmd[1])) {
+ get_seen_status($cmd[1], $chat);
+ }
+ else {
+ $chat->chat_send("Syntax: !seen screenname");
+ }
+ }
+ elsif($cmd[0] eq "!speak") {
+ send_idle_message();
+ }
+ elsif($cmd[0] eq "!quote") {
+ my $fortune = `/usr/games/fortune`;
+ $room->chat_send($fortune);
+ }
+ elsif($cmd[0] eq "!help") {
+ $room->chat_send("You can enter the following commands:");
+ $room->chat_send(" !seen screenname
(find out when screenname was last in the chat)");
+ $room->chat_send(" !speak
(send a random message)");
+ $room->chat_send(" !quote
(send a quote)");
+ }
}
-
-
-
+
+
$last_chat_received = time();
- print "chat received from $who; resetting idle counter\n";
+ print "convobot: chat received from $who; resetting idle counter\n";
}
@@ -197,12 +230,11 @@ sub send_idle_message {
$room->chat_send($phrasefix);
$last_chat_received = time();
}
+
}
$oscar->set_callback_signon_done(\&signon_done);
$oscar->set_callback_chat_joined(\&chat_joined);
-$oscar->set_callback_chat_buddy_in(\&chat_buddy_in);
-$oscar->set_callback_chat_buddy_out(\&chat_buddy_out);
$oscar->set_callback_chat_im_in(\&chat_im_in);
$oscar->set_callback_error(\&oscar_error);
@@ -236,15 +268,8 @@ print "DB Username: $dbusername\n"
print "Idle before ping: $idlemax\n";
print "Auto-Greet: $autogreet\n\n";
-print "Connecting to database $dbname\@$dbhost...";
-
-my $dsn = "DBI:mysql:database=$dbname;host=$dbhost;port=3306;mysql_connect_timeout=5;";
-my $dbh = DBI->connect($dsn, $dbusername, $dbpw, {RaiseError => 1});
-die "Failed to connect to MySQL database: DBI->errstr()" unless $dbh;
-
-print "[OK]\n";
-print "bot: attempting to sign in... ";
+print "convobot: attempting to sign in...";
$oscar->signon(%signon);
while(1) {