tBKwtWS 7 жил өмнө
parent
commit
6334f6ae00

+ 65 - 1
commands/games.py

@@ -20,12 +20,13 @@ def do_command(self, connection, event):
     
     if command == "cmd" or command == "cmds" or command == "commands":
         if cmdtype == "cmd":
-            connection.privmsg(replyto, grey + "Games: " + CH.ccc(self, "8ball") + CH.ccc(self, "dice")[:-2] + ".")
+            connection.privmsg(replyto, grey + "Games: " + CH.ccc(self, "8ball") + CH.ccc(self, "dice") + CH.ccc(self, "players")[:-2] + ".")
     
     elif command.split()[0] == "8ball":
         if cmdtype == "help":    #Display help text.
             connection.privmsg(replyto, "Ask a question of the mighty and illusive 8-Ball.")
             connection.privmsg(replyto, grey + "Usage: " + blue + "!8ball " + reset + italic + "question")
+            
         elif cmdtype == "cmd":
             if len(command.split()) < 2:    # Command contains only !8ball.
                 messages = [
@@ -125,3 +126,66 @@ def do_command(self, connection, event):
                     connection.privmsg(replyto, ", ".join(str(rolls) for rolls in GameHelpers.roll_dice(diceamount,  dicetype)) + ".") # Roll x amount of x type dice.
             else:   # Invalid amount of arguments.
                 connection.privmsg(replyto, "Too many arguments. For help type: " + blue + self.helpchar + "dice" + reset + ".")
+    
+    elif command.split()[0] == "players":
+        if cmdtype == "help":    #Display help text.
+            connection.privmsg(replyto, "Displays a users game info. User optional.")
+            
+        elif cmdtype == "cmd":
+            if len(command.split()) == 1:
+                user = event.source.nick.lower()
+                message = "Your info. "
+            elif len(command.split()) == 2:
+                user = command.split()[1]
+                if not self.db.one("SELECT id FROM users WHERE LOWER(name)=%s AND network='" + self.network + "'", (user, )):
+                    connection.action(replyto, "does not know of a " + red + trigger.split()[1] + reset + ".")
+                    return
+                if user == connection.get_nickname().lower():
+                    connection.privmsg(replyto, "The game does not play the master.")
+                    return
+                if user == event.source.nick.lower():
+                    message = "Your info. "
+                else:
+                    message = "Info for " + red + trigger.split()[1] + reset + ". "
+            all_joins = self.db.all("SELECT joins FROM joins WHERE LOWER(\"user\")=%s AND user_network='" + self.network + "'", (user, ))
+            all_kicks = self.db.all("SELECT given, received FROM kicks WHERE LOWER(\"user\")=%s AND user_network='" + self.network + "'", (user, ))
+            all_messages = self.db.all("SELECT messages, messages_words, messages_characters, actions, actions_words, actions_characters, notices, notices_words, notices_characters FROM messages WHERE LOWER(\"user\")=%s AND user_network='" + self.network + "'", (user, ))
+            joins =0
+            for record in all_joins:
+                joins += record
+            given = 0
+            received = 0
+            for record in all_kicks:
+                given += int(record[0])
+                received += int(record[1])
+            messages = 0
+            messages_words = 0
+            messages_characters = 0
+            actions = 0
+            actions_words = 0
+            actions_characters = 0
+            notices = 0
+            notices_words = 0
+            notices_characters = 0
+            for record in all_messages:
+                messages += int(record[0])
+                messages_words += int(record[1])
+                messages_characters += int(record[2])
+                actions += int(record[3])
+                actions_words += int(record[4])
+                actions_characters += int(record[5])
+                notices += int(record[6])
+                notices_words += int(record[7])
+                notices_characters += int(record[8])
+            userrecord = self.db.one("SELECT xp_spent, level FROM users WHERE LOWER(name)=%s AND network='" + self.network + "'", (user, ))
+            total_xp = (joins + (given * received) + messages + (messages_words / 4) + (messages_characters / 10) + ((actions + (actions_words / 4) + (actions_characters / 10)) * 2) + ((notices + (notices_words / 4) + (notices_characters / 10)) / 2)) / 20
+            xp = total_xp - userrecord[0]
+            total_messages = messages + actions + notices
+            total_words = messages_words + actions_words + notices_words
+            if joins < 1:
+                joins = 1
+            if total_messages < 1:
+                total_messages = 1
+            karma = ((((messages / 10) - joins) / 5) + ((total_words / 5) - total_messages) / 40) - (given * received) 
+    
+            connection.privmsg(replyto, message + "Level: " + str(userrecord[1]) + ", XP: " + str(xp) + ", karma: " + str(karma))

+ 18 - 3
commands/public.py

@@ -1,5 +1,6 @@
-from common import userstatus
+from common import userstatus, queries
 from commands.common import CommandHelpers as CH
+
 bold = "\x02"
 italic = "\x1D"
 underline = "\x1F"
@@ -38,7 +39,7 @@ def do_command(self, connection, event):
             if not event.target == connection.get_nickname() and not self.db.one("SELECT join_greeting FROM channels WHERE name='" + event.target + "' AND network='" + self.network + "'"):
                 connection.privmsg(replyto, grey + "Commands: " + CH.ccc(self, "cmd") + CH.ccc(self, "help")[:-2] + ".")
             else:
-                connection.privmsg(replyto, grey + "Commands: " + CH.ccc(self, "cmd") + CH.ccc(self, "help") + CH.ccc(self, "stopgreet")[:-2] + ".")
+                connection.privmsg(replyto, grey + "Commands: " + CH.ccc(self, "cmd") + CH.ccc(self, "help") + CH.ccc(self, "away") + CH.ccc(self, "stopgreet")[:-2] + ".")
     
     elif command == "help":
         if cmdtype == "help":    #Display help text.
@@ -54,7 +55,7 @@ def do_command(self, connection, event):
             if len(command.split()) is not 1:
                 return
             connection.privmsg(replyto, "Stops the bot from greeting you or a specific user. Channel, user and option to resume optional.")
-            connection.privmsg(replyto, grey + "Usage: " + blue + "!stopgreet " + red + reset + italic + "resume " + red + "channel user")
+            connection.privmsg(replyto, grey + "Usage: " + blue + "!stopgreet " + reset + italic + "resume " + red + "channel user")
         elif cmdtype == "cmd":
             
             # Check for resume variation of command.
@@ -121,3 +122,17 @@ def do_command(self, connection, event):
                 self.db.run("UPDATE joins SET stopgreet='" + str(stopgreet) + "' WHERE LOWER(\"user\")=LOWER('" + user + "') AND user_network='" + self.network + "' AND lower(channel)=LOWER('" + channel + "') AND channel_network='" + self.network + "'")
             except:
                 connection.privmsg(replyto, "Failed to update database.")
+    
+    elif command.split()[0] == "away":
+        if cmdtype == "help":    #Display help text.
+            if len(command.split()) is not 1:
+                return
+            connection.privmsg(replyto, "Sets you away, optionally with reason. Affects the !seen command.")
+            connection.privmsg(replyto, grey + "Usage: " + blue + "!away " + reset + italic + "rreason")
+            
+        elif cmdtype == "cmd":
+            queries.create_ifnot_onrecord(self, event.source.nick)
+            if len(trigger.split()) == 1:
+                self.db.run("UPDATE users SET away=TRUE, away_reason=NULL WHERE name='" + event.source.nick + "' AND network='" + self.network + "'")
+            else:
+                self.db.run("UPDATE users SET away=TRUE, away_reason=%s WHERE name='" + event.source.nick + "' AND network='" + self.network + "'", (trigger.split(maxsplit=1)[1], ))

+ 9 - 10
commands/statistics.py

@@ -141,20 +141,15 @@ def do_command(self, connection, event):
                 connection.privmsg(replyto, "I asm seeing you right now. For help type " + blue + self.helpchar + reset + ".")
             elif len(command.split()) == 2:
                 if not self.db.one("SELECT last_act_type FROM users WHERE LOWER(name)='" + command.split()[1] + "' AND network='" + self.network + "'"):
-                    print("SELECT last_act_type FROM users WHERE LOWER(name)='" + command.split()[1] + "' AND network='" + self.network + "'")
-                    print(self.db.one("SELECT last_act_type FROM users WHERE LOWER(name)='" + command.split()[1] + "' AND network='" + self.network + "'"))
                     connection.action(replyto, "has never seen " + red + command.split()[1] + reset + ".")
-                elif command.split()[1] == connection.get_nickname().lower():
-                    connection.action(replyto, "never forgets to look in the mirror.")
-                elif command.split()[1] == event.source.nick:
-                    connection.action(replyto, "holds up a mirror to " + event.source.nick)
+                elif command.split()[1] == event.source.nick.lower():
+                    connection.action(replyto, "holds up a mirror to " + event.source.nick + ".")
                 else:
-                    record = self.db.one("SELECT last_act_type, last_act_datetime, last_act_channel, last_act, last_act_auxiliary FROM users WHERE LOWER(name)='" + command.split()[1] + "' AND network='" + self.network + "'")
+                    record = self.db.one("SELECT last_act_type, last_act_datetime, last_act_channel, last_act, last_act_auxiliary, away, away_reason FROM users WHERE LOWER(name)='" + command.split()[1] + "' AND network='" + self.network + "'")
                     if command.split()[1] == connection.get_nickname().lower():
-                        action = "last act"
+                        action = "last action was "
                     else:
                         action = "last saw " + red + trigger.split()[1] + reset + " "
-                    print(record)
                     if record[0] == "nick":
                         action += "changing nickname to " + red + record[3]
                     elif record[0] == "join":
@@ -191,7 +186,6 @@ def do_command(self, connection, event):
                         connection.privmsg(replyto, "Last stored action unsupported by command code.")
                         return
                     action += reset + ", "
-                    print(datetime.now() - record[1])
                     differential = datetime.now() - record[1]
                     if differential.seconds < 5:    # Less then 5 seconds.
                         action += blue + "right now."
@@ -222,5 +216,10 @@ def do_command(self, connection, event):
                     else:   # More then 5 years.
                         action += green + str(int(differential.days / 365)) + blue + " years ago."
                     connection.action(replyto, action)
+                    if record[5]:
+                        if record[6]:
+                            connection.privmsg(replyto, red + trigger.split()[1] + reset + " is away " + green + record[6] + ".")
+                        else:
+                            connection.privmsg(replyto, red + trigger.split()[1] + reset + " is away.")
             else:   # Too many arguments.
                 connection.privmsg(replyto, "Too many arguments. For help type " + blue + self.helpchar + "seen" + reset + ".")

+ 3 - 0
common/queries.py

@@ -0,0 +1,3 @@
+def create_ifnot_onrecord(self, user):
+    if not self.db.one("SELECT id FROM users WHERE name='" + user + "' AND network='" + self.network + "'"):    # User not on record.
+        self.db.run("INSERT INTO users (name, network) VALUES ('" + user + "', '" + self.network + "')")   # Create record.

+ 7 - 4
events/common.py

@@ -1,5 +1,6 @@
 import random
 from datetime import datetime
+from common import queries
 from common import userstatus
 
 class Protectees():
@@ -76,8 +77,7 @@ class Lastact():
     def update(self, name, type, channel=False, lastact=False, auxiliary=False):
         
         # Create records if not present.
-        if not self.db.one("SELECT id FROM users WHERE name='" + name + "' AND network='" + self.network + "'"):  # Not on record.
-            self.db.run("INSERT INTO users (name, network) VALUES ('" + name + "', '" + self.network + "')")  # Create record.
+        queries.create_ifnot_onrecord(self, name)
         
           # Update record.
         fields = "last_act_type, last_act_datetime, last_act_channel, last_act, last_act_auxiliary"
@@ -98,12 +98,15 @@ class Lastact():
         else:
             values += ", NULL"
         self.db.run("UPDATE users SET (" + fields + ") = (" + values + ") WHERE name='" + name + "' AND network='" + self.network + "'", arguments)
+        
+        # Set user back from away, if user is active.
+        if type not in ["nick", "kick", "part", "quit"]:
+            self.db.run("UPDATE users SET away=FALSE WHERE name='" + name + "' AND network='" + self.network + "'")
 
 class MessageStatistics():
     def update(self, event, type):
         type = type + "s"
-        if not self.db.one("SELECT id FROM \"users\" WHERE name='" + event.source.nick + "' AND network='" + self.network + "'"):    # User not on record.
-            self.db.run("INSERT INTO \"users\" (name, network) VALUES ('" + event.source.nick + "', '" + self.network + "')")   # Create record.
+        queries.create_ifnot_onrecord(self, event.source.nick)
         if not self.db.one("SELECT id FROM messages WHERE channel='" + event.target + "' AND channel_network='" + self.network + "' AND \"user\"='" + event.source.nick + "' AND user_network='" + self.network + "'"):    # Not on record.
             self.db.run("INSERT INTO messages (channel, channel_network, \"user\", user_network) VALUES ('" + event.target + "', '" + self.network + "', '" + event.source.nick + "', '" + self.network + "')")   # Create record.
         self.db.run("UPDATE messages SET " + type + "=" + type + "+1, " + type + "_words=" + type + "_words+" + str(len(event.arguments[0].split())) + ", " + type + "_characters=" + type + "_characters+" + str(len(event.arguments[0])) + " WHERE channel='" + event.target + "' AND channel_network='" + self.network + "' AND \"user\"='" + event.source.nick + "' AND user_network='" + self.network + "'")   # Increment record.

+ 4 - 9
events/on_pubmsg.py

@@ -9,21 +9,18 @@ def process_event(self, connection, event):
     # Save statistic to database.
     MessageStatistics.update(self, event, "message")
     
+    # Stop if channelfunction chat if off.
+    if not self.db.one("SELECT chat FROM channels WHERE name='" + event.target + "' AND network='" + self.network + "'"):
+        return
+    
     if connection.get_nickname().lower() in event.arguments[0].lower() and event.source.nick is not connection.get_nickname(): # Bot's name was mentioned
         if event.arguments[0].startswith(self.cmdchar):
             return  # Stop if it's a command.
-        if not self.db.one("SELECT chat FROM channels WHERE name='" + event.target + "' AND network='" + self.network + "'"):
-            return  # Stop if channelfunction chat if off.
-        
         Replyto.name(connection, event)
     
     # Character lame.
     elif event.arguments[0] == len(event.arguments[0]) * event.arguments[0][0]:   # Trigger exclusively same character.
         
-        # Stop if chat channel function is off.
-        if not self.db.one("SELECT chat FROM channels WHERE name='" + event.target + "' AND network='" + self.network + "'"):
-            return
-        
         # Stop if lamed recently.
         lastlame = self.db.one("SELECT last_lame FROM channels WHERE name='" + event.target + "' AND network='" + self.network + "'")
         if lastlame and lastlame > datetime.datetime.now() - datetime.timedelta(minutes=2):    # In the last 2 minutes.
@@ -33,5 +30,3 @@ def process_event(self, connection, event):
         self.db.run("UPDATE channels SET last_lame='" + str(datetime.datetime.now()) + "' WHERE name='" + event.target + "' AND network='" + self.network + "'")
         
         connection.privmsg(event.target, event.arguments[0] + event.arguments[0][:1])
-    
-    

+ 1 - 1
rotbot.py

@@ -105,11 +105,11 @@ class PyRot(irc.bot.SingleServerIRCBot):
         Lastact.update(self, event.source.nick, "topic", channel=event.target, lastact=event.arguments[0])
 
     def on_pubmsg(self, connection,  event):
+        events.on_pubmsg.process_event(self, connection, event)
         commands.public.do_command(self, connection, event)
         commands.admin.do_command(self, connection, event)
         commands.statistics.do_command(self, connection, event)
         commands.games.do_command(self, connection, event)
-        events.on_pubmsg.process_event(self, connection, event)
     
     def on_privmsg(self, connection, event):
         log.info(event)