diff --git a/RoR_client.py b/RoR_client.py index f7ba4ac..f4f6ec7 100644 --- a/RoR_client.py +++ b/RoR_client.py @@ -456,7 +456,13 @@ def sayPrivChat(self, msg, uid): # [game] () joined the server, using def sayJoin(self, uid): - self.__send("%s (%s) joined the server, using %s %s." % (self.sm.getUsername(uid), s(self.sm.getLanguage(uid)), s(self.sm.getClientName(uid)), s(self.sm.getClientVersion(uid))), "game") + userinfo = self.sm.getUsername(uid); + invalid = self.main.isUsernameBanned(userinfo) + if invalid: + self.sayInfo("User **%s** with uid **%s** was identified as a habitual ban evader and was banned again." % (self.sm.getUsername(uid), uid)) + self.main.queueBan(self.channelID, int(uid)) + else: + self.__send("%s (%s) joined the server, using %s %s." % (self.sm.getUsername(uid), s(self.sm.getLanguage(uid)), s(self.sm.getClientName(uid)), s(self.sm.getClientVersion(uid))), "game") # [game] left the server def sayLeave(self, uid): diff --git a/services_start.py b/services_start.py index 208143f..5d40a07 100644 --- a/services_start.py +++ b/services_start.py @@ -274,6 +274,11 @@ def __init__(self, *args, **kwargs): f = open('truck.blacklist') self.vehiclebans = json.load(f) f.close() + + if os.path.isfile('evader.blacklist') == True: + g = open('evader.blacklist') + self.evaderbans = json.load(g) + g.close() self.initialised = False @@ -329,6 +334,19 @@ def isVehicleBanned(self, truck): def queueKick(self, cid, uid): self.messageRoRclientByChannel(cid, ("kick", int(uid), "spawning a banned vehicle")) + + def isUsernameBanned(self, user): + if os.path.isfile('evader.blacklist') == False: + return False + + for item in self.evaderbans['bans']: + if user == item['username']: + return True + + return False + + def queueBan(self, cid, uid): + self.messageRoRclientByChannel(cid, ("ban", int(uid), "performing excessive ban evasions")) async def addVehicleBan(self, cid, truck): channel = self.get_channel(int(cid)) @@ -373,6 +391,50 @@ async def removeVehicleBan(self, cid, truck): json.dump(self.vehiclebans, f) await channel.send("[info] %s ban removed." % truck) break + + async def addEvaderBan(self, cid, user): + channel = self.get_channel(int(cid)) + + if os.path.isfile('evader.blacklist') == False: + await channel.send("[info] evader.blacklist not found.") + return + + for item in self.evaderbans['bans']: + if user == item['username']: + await channel.send("[info] %s already banned." % user) + return + + entry = {'username': user} + self.evaderbans['bans'].append(entry) + + with open('evader.blacklist', 'w') as f: + json.dump(self.evaderbans, f) + await channel.send("[info] %s banned." % user) + + async def removeEvaderBan(self, cid, user): + channel = self.get_channel(int(cid)) + + if os.path.isfile('evader.blacklist') == False: + await channel.send("[info] evader.blacklist not found.") + return + + found = False + for item in self.evaderbans['bans']: + if user == item['username']: + found = True + + if found == False: + await channel.send("[info] %s not found." % user) + return + + for x, item in enumerate(self.evaderbans['bans']): + if user == item['username']: + self.evaderbans['bans'].pop(x) + + with open('evader.blacklist', 'w') as f: + json.dump(self.evaderbans, f) + await channel.send("[info] %s ban removed." % user) + break async def serverlist(self, cid): channel = self.get_channel(int(cid)) @@ -388,6 +450,12 @@ async def sendVehicleBans(self, cid): if os.path.isfile('truck.blacklist') == True: result = "[info] %s bans recorded." % len(self.vehiclebans['bans']) await channel.send(result, file=discord.File('truck.blacklist')) + + async def sendEvaderBans(self, cid): + channel = self.get_channel(int(cid)) + if os.path.isfile('evader.blacklist') == True: + result = "[info] %s bans recorded." % len(self.evaderbans['bans']) + await channel.send(result, file=discord.File('evader.blacklist')) async def api(self, cid): channel = self.get_channel(int(cid)) @@ -491,6 +559,13 @@ async def on_message(self, message): await self.addVehicleBan(message.channel.id, message.content.replace('!banvehicle ' , '')) else: await message.channel.send('[info] Syntax: !banvehicle ') + elif "!banevader" in message.content: + args = message.content.split(" ", 1) + + if len(args) == 2: + await self.addEvaderBan(message.channel.id, message.content.replace('!banevader ' , '')) + else: + await message.channel.send('[info] Syntax: !banevader ') else: args = message.content.split(" ", 2) @@ -529,6 +604,13 @@ async def on_message(self, message): await self.removeVehicleBan(message.channel.id, message.content.replace('!unbanvehicle ' , '')) else: await message.channel.send('[info] Syntax: !unbanvehicle ') + if "!unbanevader" in message.content: + args = message.content.split(" ", 1) + + if len(args) == 2: + await self.removeEvaderBan(message.channel.id, message.content.replace('!unbanevader ' , '')) + else: + await message.channel.send('[info] Syntax: !unbanevader ') else: self.messageRoRclientByChannel(message.channel.id, ("msg", message.content)) @@ -546,6 +628,9 @@ async def on_message(self, message): if message.content.startswith('!vehiclebans') and self.checkDiscordChannel(message.channel.id): await self.sendVehicleBans(message.channel.id) + + if message.content.startswith('!evaderbans') and self.checkDiscordChannel(message.channel.id): + await self.sendEvaderBans(message.channel.id) if message.content.startswith('!help') and self.checkDiscordChannel(message.channel.id): str = """ @@ -565,6 +650,9 @@ async def on_message(self, message): **!banvehicle** Bans a vehicle **!unbanvehicle** Unbans a vehicle **!vehiclebans** Sends vehicle blacklist file +**!banevader** Bans a ban evader +**!unbanevader** Unbans a ban evader +**!evaderbans** Sends evader blacklist file **!info** Returns server info **!stats** Returns various server stats. May not be accurate **!serverlist** Returns a list of servers the bot is connected to