From 5936bdf379b78b06973b0281285be42fed8b763a Mon Sep 17 00:00:00 2001 From: benjamyn Date: Tue, 31 Dec 2019 01:59:39 +1100 Subject: [PATCH] Reimplemented user limits with User class Flesshed out user class --- .gitignore | 1 + UserData.py | 36 +++++++++++++++++++++++ tbot.py | 85 ++++++++++++++++++++++++++--------------------------- twitchcreds | 2 ++ 4 files changed, 81 insertions(+), 43 deletions(-) create mode 100644 UserData.py create mode 100644 twitchcreds diff --git a/.gitignore b/.gitignore index f103c28..1435aac 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ env/ .vscode/ +__pycache__/ .twitchcreds \ No newline at end of file diff --git a/UserData.py b/UserData.py new file mode 100644 index 0000000..8bfe959 --- /dev/null +++ b/UserData.py @@ -0,0 +1,36 @@ +import datetime +MSG_TIMEOUT = 30 +MSG_LIMIT = 5 + +class UserData: + def __init__(self, username, ismod): + self.username = username + self.mod = ismod + self.messageCount = 0 + self.messageTime = 0 + self.messageLimit = MSG_LIMIT + self.URLPermit = False + + def setUserTimeout(self): + if self.messageTime == 0: + self.messageTime = int(datetime.datetime.now().timestamp()) #Sets messagetime to now (Unix Timestamp) + + def checkUserMessageTimout(self): + if self.messageTime >= self.messageTime + MSG_TIMEOUT: + self.messageTime = 0 + return False + else: + return True + + def setUserMessageCount(self, amt = 1): + if self.checkUserMessageTimout(): + self.messageCount += amt + + def checkUserMessageCount(self): + return self.messageCount >= MSG_LIMIT + + def addURLPermit(self): + self.URLPermit = True + + def removeURLPermit(self): + self.URLPermit = False \ No newline at end of file diff --git a/tbot.py b/tbot.py index e4bc1fc..45b2142 100644 --- a/tbot.py +++ b/tbot.py @@ -2,6 +2,7 @@ import twitch import datetime import re import json +import UserData with open(".twitchcreds") as file: botSettings = json.loads(file.read())# @@ -9,31 +10,35 @@ with open(".twitchcreds") as file: UserID = botSettings[0]['OAUTH'] PREFIX = '!' BOTID = '[BOT]' +CHANNEL = botSettings[1]["CHANNEL"] -#User limits -TIMEOUT = 30 -MSG_LIMIT = 5 -userstats = {} - -permitURL = [] - -class UserData: - def __init__(self, username): - self.username = username - self.mod = username in botSettings[1]["MODS"] +#Users +Users = {} def isURL(message): - rule = re.compile("http(|s)[;:]\/\/.*\..*") + rule = re.compile(r"http(|s)[;:]\/\/.*\..*") return rule.findall(message) +def addUser(username): + Users[username] = UserData.UserData(username, username in botSettings[1]["MODS"]) + +def checkUserExists(username): + if username in Users: + pass + else: + addUser(username) + return True def handle_message(message: twitch.chat.Message) -> None: - #print(message.chat + uname = message.user.display_name + if uname not in Users: + Users[uname] = UserData.UserData(uname, uname in botSettings[1]["MODS"]) + if message.text.startswith(PREFIX + 'views'): - message.chat.send(f'{BOTID} @{message.user.display_name}, you have {message.user.view_count} views.') + message.chat.send(f'{BOTID} @{uname}, you have {message.user.view_count} views.') if message.text.startswith(PREFIX + "hello"): - message.chat.send(f"{BOTID} Hello @{message.user.display_name}, how are you?") + message.chat.send(f"{BOTID} Hello @{uname}, how are you?") if message.text.startswith(PREFIX + "author"): message.chat.send(f"{BOTID} I am written by an idiot who knows enough to cause trouble ;)") @@ -52,37 +57,32 @@ def handle_message(message: twitch.chat.Message) -> None: print(msg) if '@' in message.text: msg = msg.replace('@','') - message.chat.send(f"permitting {msg}") - permitURL.append(msg) - print(permitURL) + if checkUserExists(msg): + message.chat.send(f"permitting {msg}") + Users[msg].addURLPermit() - # User limits - if message.user.display_name not in userstats: - timeOut = int(datetime.datetime.now().timestamp()) - userstats[message.user.display_name] = [0, timeOut, timeOut + TIMEOUT] - userstats[message.user.display_name][0] += 1 - else: - userstats[message.user.display_name][0] += 1 - currTime = int(datetime.datetime.now().timestamp()) - if currTime >= userstats[message.user.display_name][1]: - userstats[message.user.display_name][1] = currTime - userstats[message.user.display_name][1] = currTime + TIMEOUT - userstats[message.user.display_name][0] = 0 - if currTime < userstats[message.user.display_name][2] and userstats[message.user.display_name][0] > MSG_LIMIT: - message.chat.send(f"{BOTID} Timing out {message.user.display_name} for 15 seconds, please no spam :(") - message.chat.send(f"/timeout {message.user.display_name} 15") - print(f"{userstats[message.user.display_name][2]}:{currTime}") - if message.user.display_name not in permitURL and isURL(message.text): - print("Timout user for 1 second to remove URL message, needs to be fixed") - message.chat.send(f"/timeout {message.user.display_name} 1") - message.chat.send(f"{BOTID} @{message.user.display_name} Please do not post messages with URL's unless permitted") - else: - if isURL(message.text): - permitURL.remove(message.user.display_name) - else: + #User Limits + if Users[uname].checkUserMessageTimout(): + Users[uname].setUserMessageCount() + if Users[uname].messageCount >= Users[uname].messageLimit: # if the message limit has been reached + message.chat.send(f"{BOTID} Timing out {uname} for 15 seconds, please no spam :(") + message.chat.send(f"/timeout {uname} 15") + + #URL Permits + if Users[uname].URLPermit and isURL(message.text): + Users[uname].removeURLPermit() + elif not Users[uname].URLPermit and isURL(message.text): + if f"https://www.twitch.tv/{CHANNEL}/clip" in message.text: pass + else: + message.chat.send(f"/timeout {uname} 1") + message.chat.send(f"{BOTID} @{uname} Please do not post messages with URL's unless permitted") + + + + # print(userstats) def main(): @@ -98,4 +98,3 @@ def main(): if __name__ == '__main__': main() #print(isURL("https://google.com")) - print(test.mod) \ No newline at end of file diff --git a/twitchcreds b/twitchcreds new file mode 100644 index 0000000..c2d2e4d --- /dev/null +++ b/twitchcreds @@ -0,0 +1,2 @@ +[{"OAUTH":"oauth:OAUTHCODE", "CLIENTID":"TWITCHCLIENTID"}, +{"MODS":["MODERATORS", "GOHERE"], "CHANNEL":"CHANNELNAME"}] \ No newline at end of file