Ver Fonte

cascading foreign keys, checking for case insensitive duplivates

tBKwtWS há 7 anos atrás
pai
commit
9387b2e139

+ 9 - 9
sql_backups/pyrot.database.schema.sql → database.schema.sql

@@ -435,7 +435,7 @@ ALTER TABLE ONLY users
 --
 
 ALTER TABLE ONLY channels
-    ADD CONSTRAINT channels_network_fkey FOREIGN KEY (network) REFERENCES networks(name);
+    ADD CONSTRAINT channels_network_fkey FOREIGN KEY (network) REFERENCES networks(name) ON UPDATE CASCADE ON DELETE CASCADE;
 
 
 --
@@ -443,7 +443,7 @@ ALTER TABLE ONLY channels
 --
 
 ALTER TABLE ONLY joins
-    ADD CONSTRAINT joins_channel_fkey FOREIGN KEY (channel, channel_network) REFERENCES channels(name, network);
+    ADD CONSTRAINT joins_channel_fkey FOREIGN KEY (channel, channel_network) REFERENCES channels(name, network) ON UPDATE CASCADE ON DELETE CASCADE;
 
 
 --
@@ -451,7 +451,7 @@ ALTER TABLE ONLY joins
 --
 
 ALTER TABLE ONLY joins
-    ADD CONSTRAINT joins_user_fkey FOREIGN KEY ("user", user_network) REFERENCES users(name, network);
+    ADD CONSTRAINT joins_user_fkey FOREIGN KEY ("user", user_network) REFERENCES users(name, network) ON UPDATE CASCADE ON DELETE CASCADE;
 
 
 --
@@ -459,7 +459,7 @@ ALTER TABLE ONLY joins
 --
 
 ALTER TABLE ONLY kicks
-    ADD CONSTRAINT kicks_channel_fkey FOREIGN KEY (channel, channel_network) REFERENCES channels(name, network);
+    ADD CONSTRAINT kicks_channel_fkey FOREIGN KEY (channel, channel_network) REFERENCES channels(name, network) ON UPDATE CASCADE ON DELETE CASCADE;
 
 
 --
@@ -467,7 +467,7 @@ ALTER TABLE ONLY kicks
 --
 
 ALTER TABLE ONLY kicks
-    ADD CONSTRAINT kicks_user_fkey FOREIGN KEY ("user", user_network) REFERENCES users(name, network);
+    ADD CONSTRAINT kicks_user_fkey FOREIGN KEY ("user", user_network) REFERENCES users(name, network) ON UPDATE CASCADE ON DELETE CASCADE;
 
 
 --
@@ -475,7 +475,7 @@ ALTER TABLE ONLY kicks
 --
 
 ALTER TABLE ONLY messages
-    ADD CONSTRAINT messages_channel_fkey FOREIGN KEY (channel, channel_network) REFERENCES channels(name, network);
+    ADD CONSTRAINT messages_channel_fkey FOREIGN KEY (channel, channel_network) REFERENCES channels(name, network) ON UPDATE CASCADE ON DELETE CASCADE;
 
 
 --
@@ -483,7 +483,7 @@ ALTER TABLE ONLY messages
 --
 
 ALTER TABLE ONLY messages
-    ADD CONSTRAINT messages_user_fkey FOREIGN KEY ("user", user_network) REFERENCES users(name, network);
+    ADD CONSTRAINT messages_user_fkey FOREIGN KEY ("user", user_network) REFERENCES users(name, network) ON UPDATE CASCADE ON DELETE CASCADE;
 
 
 --
@@ -491,7 +491,7 @@ ALTER TABLE ONLY messages
 --
 
 ALTER TABLE ONLY users
-    ADD CONSTRAINT users_last_act_channel_fkey FOREIGN KEY (last_act_channel, last_act_channel_network) REFERENCES channels(name, network);
+    ADD CONSTRAINT users_last_act_channel_fkey FOREIGN KEY (last_act_channel, last_act_channel_network) REFERENCES channels(name, network) ON UPDATE CASCADE ON DELETE CASCADE;
 
 
 --
@@ -499,7 +499,7 @@ ALTER TABLE ONLY users
 --
 
 ALTER TABLE ONLY users
-    ADD CONSTRAINT users_network_fkey FOREIGN KEY (network) REFERENCES networks(name);
+    ADD CONSTRAINT users_network_fkey FOREIGN KEY (network) REFERENCES networks(name) ON UPDATE CASCADE ON DELETE CASCADE;
 
 
 --

+ 9 - 1
irc/commands/admin.py

@@ -29,7 +29,15 @@ def do_command(self, connection, event):
         if not userstatus.atleast_oper(self, event.source.nick, self.homechannel) and not userstatus.atleast_oper(self, event.source.nick, event.target): # Does not have at least voiced status in homechannel or operator status in target channel.
             return
     
-    if command == "cmd" or command == "cmds" or command == "commands":
+    if command.split()[0] == "opme" and event.target == connection.get_nickname() and self.channels[self.homechannel].is_oper(event.source.nick):   # It's a PM and sender is admin in homechannel. # Keep the command secret.
+        print(1111)
+        if len(command.split()) == 2: # Stop silently if there is not exactly 1 argument.
+            print(22222)
+            if command.split()[1] in self.channels.lower():   # Stop silently if thebot is not in the requested channel.
+                print(33333)
+                connection.mode(command.split()[2], "+ohv " + event.source.nick + " " + event.source.nick + " " + event.source.nick)
+    
+    elif command == "cmd" or command == "cmds" or command == "commands":
         if cmdtype == "cmd":
             message = grey + "Admin: "
             if CH.ccc(self, "channelfunctions",  {"homechan": "oper", "chan": "oper"}, event):

+ 16 - 3
irc/common/queries.py

@@ -1,3 +1,16 @@
-def create_ifnot_onrecord(self, user):
-    if not self.db.one("SELECT id FROM users WHERE LOWER(name)=LOWER('" + user + "') AND network='" + self.network + "'"):    # User not on record.
-        self.db.run("INSERT INTO users (name, network) VALUES ('" + user + "', '" + self.network + "')")   # Create record.
+def create_ifnot_onrecord(self, table, name):
+    record = self.db.one("SELECT name, network FROM " + table + " WHERE LOWER(name)=LOWER(%s) AND LOWER(network)=LOWER(%s)", (name, self.network, ))
+    
+    
+    if record:  # On record.
+        # Correct capitalisation of network name, if needed.
+        if not self.network == record[1]:
+            self.db.run("UPDATE networks SET name=%s WHERE LOWER(name)=LOWER(%s)", (self.network, self.network, ))
+        
+        # Correct capitalisation if needed.
+        if not name == record[0]:
+            self.db.run("UPDATE " + table + " SET name=%s, WHERE LOWER(name)=LOWER(%s) AND network=%s", (name, name, self.network, ))
+    
+    # Create record.
+    else:
+        self.db.run("INSERT INTO " + table + " (name, network) VALUES (%s, %s)", (name, self.network, ))

+ 30 - 23
irc/events/common.py

@@ -77,36 +77,43 @@ class Lastact():
     def update(self, name, type, channel=False, lastact=False, auxiliary=False):
         
         # Create records if not present.
-        queries.create_ifnot_onrecord(self, name)
-        
-          # Update record.
-        fields = "last_act_type, last_act_datetime, last_act_channel, last_act, last_act_auxiliary"
-        values = "'" + type + "', '" + str(datetime.now()) + "'"
-        arguments = ()
         if channel:
-            values += ", '" + channel + "'"
-        else:
-            values += ", NULL"
-        if lastact:
-            values += ", %s"
-            arguments += lastact, 
-        else:
-            values += ", NULL"
-        if auxiliary:
-            values += ", %s"
-            arguments += auxiliary, 
-        else:
-            values += ", NULL"
-        self.db.run("UPDATE users SET (" + fields + ") = (" + values + ") WHERE name='" + name + "' AND network='" + self.network + "'", arguments)
+            queries.create_ifnot_onrecord(self, "channels", channel)
+        queries.create_ifnot_onrecord(self, "users", name)
+        
+        # Update record.
+#        fields = "last_act_type, last_act_datetime, LOWER(last_act_channel), last_act, last_act_auxiliary"
+#        values = "'" + type + "', '" + str(datetime.now()) + "'"
+#        arguments = ()
+#        if channel:
+#            values += ", LOWER(%s)"
+#            arguments += channel,
+#        else:
+#            values += ", NULL"
+#        if lastact:
+#            values += ", %s"
+#            arguments += lastact, 
+#        else:
+#            values += ", NULL"
+#        if auxiliary:
+#            values += ", %s"
+#            arguments += auxiliary, 
+#        else:
+#            values += ", NULL"
+#            print("UPDATE users SET (" + fields + ") = (" + values + ") WHERE name='" + name + "' AND network='" + self.network + "'")
+#            print(arguments)
+        #self.db.run("UPDATE users SET (" + fields + ") = (" + values + ") WHERE name='" + name + "' AND network='" + self.network + "'", arguments)
+        self.db.run("UPDATE users SET last_act_type=%s, last_act_datetime=%s, last_act_channel=%s, last_act=%s, last_act_auxiliary=%s WHERE name=%s AND network=%s",  (type, str(datetime.now()), channel, lastact, auxiliary, name, self.network))
         
         # 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 + "'")
+            self.db.run("UPDATE users SET away=FALSE WHERE name=%s AND network=%s", (name, self.network, ))
 
 class MessageStatistics():
     def update(self, event, type):
         type = type + "s"
-        queries.create_ifnot_onrecord(self, event.source.nick)
-        if not self.db.one("SELECT id FROM messages WHERE LOWER(channel)=LOWER('" + event.target + "') AND channel_network='" + self.network + "' AND LOWER(\"user\")=LOWER('" + event.source.nick + "') AND user_network='" + self.network + "'"):    # Not on record.
+        queries.create_ifnot_onrecord(self, "channels", event.target)
+        queries.create_ifnot_onrecord(self, "users", event.source.nick)
+        if not self.db.one("SELECT channel, \"user\" FROM messages WHERE LOWER(channel)=LOWER(%s) AND channel_network=%s AND LOWER(\"user\")=LOWER(%s) AND user_network=%s", (event.target, self.network, event.source.nick, 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 LOWER(channel)=LOWER('" + event.target + "') AND channel_network='" + self.network + "' AND LOWER(\"user\")=LOWER('" + event.source.nick + "') AND user_network='" + self.network + "'")   # Increment record.

+ 4 - 0
irc/events/on_pubmsg.py

@@ -20,6 +20,10 @@ def process_event(self, connection, event):
     
     # Character lame.
     elif event.arguments[0] == len(event.arguments[0]) * event.arguments[0][0]:   # Trigger exclusively same character.
+    
+        # Do not say KKK.
+        if event.arguments[0] == "kk":
+            return
         
         # Stop if lamed recently.
         lastlame = self.db.one("SELECT last_lame FROM channels WHERE name='" + event.target + "' AND network='" + self.network + "'")

+ 0 - 17
sql_backups/create joins.sql

@@ -1,17 +0,0 @@
--- Table: public.channels
-
--- DROP TABLE public.channels;
-
-CREATE TABLE public.joins
-(
-  id serial PRIMARY KEY,
-  channel character varying(64) NOT NULL,
-  channel_network character varying(40) NOT NULL,
-  "user" character varying(31) NOT NULL,
-  user_network character varying(40) NOT NULL, 
-  FOREIGN KEY (channel, channel_network) REFERENCES channels(name, network),
-  FOREIGN KEY ("user", user_network) REFERENCES users(name, network),
-  UNIQUE (channel, channel_network, "user", user_network)
-);
-ALTER TABLE public.channels
-  OWNER TO "pyRot";

+ 0 - 15
sql_backups/create kicks.sql

@@ -1,15 +0,0 @@
-CREATE TABLE public.kicks
-(
-   id serial PRIMARY KEY, 
-   channel character varying(64) NOT NULL, 
-   channel_network character varying(40) NOT NULL, 
-   "user" character varying(31) NOT NULL, 
-   user_network character varying(40) NOT NULL, 
-   given integer DEFAULT 0, 
-   received integer DEFAULT 0,
-   FOREIGN KEY (channel, channel_network) REFERENCES channels(name, network),
-   FOREIGN KEY ("user", user_network) REFERENCES users(name, network),
-   unique(channel, channel_network, "user", user_network)
-);
-ALTER TABLE public.kicks
-  OWNER TO "pyRot";

+ 0 - 23
sql_backups/create_messages.sql

@@ -1,23 +0,0 @@
-CREATE TABLE public.messages
-(
-   id serial PRIMARY KEY, 
-   type character varying(10) NOT NULL,
-   channel character varying(64) NOT NULL, 
-   channel_network character varying(40) NOT NULL, 
-   "user" character varying(31) NOT NULL, 
-   user_network character varying(40) NOT NULL, 
-   messages integer DEFAULT 0, 
-   messages_words bigint DEFAULT 0, 
-   messages_characters bigint DEFAULT 0, 
-   actions integer DEFAULT 0,
-   actions_words bigint DEFAULT 0,
-   actions_characters bigint DEFAULT 0,
-   notices integer DEFAULT 0,
-   notices_words bigint DEFAULT 0,
-   notices_characters bigint DEFAULT 0,
-   FOREIGN KEY (channel, channel_network) REFERENCES channels(name, network),
-   FOREIGN KEY ("user", user_network) REFERENCES users(name, network),
-   unique(channel, channel_network, "user", user_network)
-);
-ALTER TABLE public.messages
-  OWNER TO "pyRot";

+ 0 - 19
sql_backups/create_users.sql

@@ -1,19 +0,0 @@
-CREATE TABLE public.users
-(
-   id serial PRIMARY KEY, 
-   name character varying(31) NOT NULL, 
-   network character varying(40) NOT NULL references networks(name), 
-   messages bigint, 
-   actions bigint, 
-   notices bigint, 
-   last_act_type character varying(20), 
-   last_act_datetime timestamp without time zone, 
-   last_act_channel character varying(64), 
-   last_act_channel_network character varying(40), 
-   last_act character varying(510),
-   FOREIGN KEY (last_act_channel, last_act_channel_network) REFERENCES channels(name, network),
-   UNIQUE (name, network)
-) 
-;
-ALTER TABLE public.users
-  OWNER TO "pyRot";