--- ChivanetConvoBot/convobot	2025/02/03 17:31:28	1.4
+++ ChivanetConvoBot/convobot	2025/02/05 01:03:18	1.6
@@ -9,6 +9,12 @@
 # Licensed AGPL-3.0
 #
 # $Log: convobot,v $
+# Revision 1.6  2025/02/05 01:03:18  snw
+# Fix invite and seen commands to support screen names with spaces
+#
+# 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 +54,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 +81,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 +100,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 +111,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 +135,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 +157,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 +169,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 +180,45 @@ 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 <em>screenname</em>");
-        }
+
+    if($who ne $botsn) {
+	if($cmd[0] eq "!seen") {
+	    if(exists($cmd[1])) {
+		my @sna = @cmd[1..$#cmd];
+		my $ssn = join(' ', @sna);
+		get_seen_status($ssn, $chat);
+	    }
+	    else {
+		$chat->chat_send("Syntax: !seen <em>screenname</em>");
+	    }
+	}
+	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 "!invite") {
+	    if(exists($cmd[1])) {
+		my @sna = @cmd[1..$#cmd];
+		my $ssn = join(' ', @sna);		
+		$chat->invite($ssn, "Please join us in $chatroom! <br><em>Requested by $who</em>");
+	    }
+	}
+	elsif($cmd[0] eq "!help") {
+	    $room->chat_send("You can enter the following commands:");
+	    $room->chat_send(" <code>!seen <em>screenname</em></code>  (find out when <em>screenname</em> was last in the chat)");
+	    $room->chat_send(" <code>!invite <em>screenname</em></code>  (invite <em>screenname</em> to the chat)");
+	    $room->chat_send(" <code>!speak</code>  (send a random message)");
+	    $room->chat_send(" <code>!quote</code>  (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 +243,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 +281,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) {