.BANCHO. Add streams and streamList object, add 'main' stream
This commit is contained in:
		| @@ -86,3 +86,6 @@ class forceUpdateException(Exception): | ||||
|  | ||||
| class loginLockedException(Exception): | ||||
| 	pass | ||||
|  | ||||
| class unknownStreamException(Exception): | ||||
| 	pass | ||||
| @@ -28,7 +28,7 @@ return the message or **False** if there's no response by the bot | ||||
| TODO: Change False to None, because False doesn't make any sense | ||||
| """ | ||||
| def instantRestart(fro, chan, message): | ||||
| 	glob.tokens.enqueueAll(serverPackets.notification("We are restarting Bancho. Be right back!")) | ||||
| 	glob.streams.broadcast("main", serverPackets.notification("We are restarting Bancho. Be right back!")) | ||||
| 	systemHelper.scheduleShutdown(0, True, delay=1) | ||||
| 	return False | ||||
|  | ||||
| @@ -69,7 +69,7 @@ def roll(fro, chan, message): | ||||
| #	return random.choice(["yes", "no", "maybe"]) | ||||
|  | ||||
| def alert(fro, chan, message): | ||||
| 	glob.tokens.enqueueAll(serverPackets.notification(' '.join(message[:]))) | ||||
| 	glob.streams.broadcast("main", serverPackets.notification(' '.join(message[:]))) | ||||
| 	return False | ||||
|  | ||||
| def alertUser(fro, chan, message): | ||||
| @@ -311,11 +311,11 @@ def systemReload(fro, chan, message): | ||||
| 	glob.chatFilters.loadFilters() | ||||
|  | ||||
| 	# Send new channels and new bottom icon to everyone | ||||
| 	glob.tokens.enqueueAll(serverPackets.mainMenuIcon(glob.banchoConf.config["menuIcon"])) | ||||
| 	glob.tokens.enqueueAll(serverPackets.channelInfoEnd()) | ||||
| 	glob.streams.broadcast("main", serverPackets.mainMenuIcon(glob.banchoConf.config["menuIcon"])) | ||||
| 	glob.streams.broadcast("main", serverPackets.channelInfoEnd()) | ||||
| 	for key, value in glob.channels.channels.items(): | ||||
| 		if value.publicRead == True and value.hidden == False: | ||||
| 			glob.tokens.enqueueAll(serverPackets.channelInfo(key)) | ||||
| 			glob.streams.broadcast("main", serverPackets.channelInfo(key)) | ||||
|  | ||||
| 	return "Bancho settings reloaded!" | ||||
|  | ||||
| @@ -341,7 +341,7 @@ def systemMaintenance(fro, chan, message): | ||||
| 			if not value.admin: | ||||
| 				who.append(value.userID) | ||||
|  | ||||
| 		glob.tokens.enqueueAll(serverPackets.notification("Our bancho server is in maintenance mode. Please try to login again later.")) | ||||
| 		glob.streams.broadcast("main", serverPackets.notification("Our bancho server is in maintenance mode. Please try to login again later.")) | ||||
| 		glob.tokens.multipleEnqueue(serverPackets.loginError(), who) | ||||
| 		msg = "The server is now in maintenance mode!" | ||||
| 	else: | ||||
|   | ||||
| @@ -205,7 +205,7 @@ def handle(tornadoRequest): | ||||
|  | ||||
| 		# Send to everyone our userpanel if we are not restricted | ||||
| 		if not responseToken.restricted: | ||||
| 			glob.tokens.enqueueAll(serverPackets.userPanel(userID)) | ||||
| 			glob.streams.broadcast("main", serverPackets.userPanel(userID)) | ||||
|  | ||||
| 		# Set reponse data to right value and reset our queue | ||||
| 		responseData = responseToken.queue | ||||
|   | ||||
| @@ -25,8 +25,11 @@ def handle(userToken, _=None): | ||||
| 		for i in userToken.joinedChannels: | ||||
| 			chat.partChannel(token=userToken, channel=i) | ||||
|  | ||||
| 		# Leave all joined streams | ||||
| 		userToken.leaveAllStreams() | ||||
|  | ||||
| 		# Enqueue our disconnection to everyone else | ||||
| 		glob.tokens.enqueueAll(serverPackets.userLogout(userID)) | ||||
| 		glob.streams.broadcast("main", serverPackets.userLogout(userID)) | ||||
|  | ||||
| 		# Disconnect from IRC if needed | ||||
| 		if userToken.irc == True and glob.irc == True: | ||||
|   | ||||
| @@ -320,7 +320,7 @@ def IRCConnect(username): | ||||
| 		return | ||||
| 	glob.tokens.deleteOldTokens(userID) | ||||
| 	glob.tokens.addToken(userID, irc=True) | ||||
| 	glob.tokens.enqueueAll(serverPackets.userPanel(userID)) | ||||
| 	glob.streams.broadcast("main", serverPackets.userPanel(userID)) | ||||
| 	log.info("{} logged in from IRC".format(username)) | ||||
|  | ||||
| def IRCDisconnect(username): | ||||
|   | ||||
| @@ -42,10 +42,10 @@ def scheduleShutdown(sendRestartTime, restart, message = "", delay=20): | ||||
|  | ||||
| 	# Send notification if set | ||||
| 	if message != "": | ||||
| 		glob.tokens.enqueueAll(serverPackets.notification(message)) | ||||
| 		glob.streams.broadcast("main", serverPackets.notification(message)) | ||||
|  | ||||
| 	# Schedule server restart packet | ||||
| 	threading.Timer(sendRestartTime, glob.tokens.enqueueAll, [serverPackets.banchoRestart(delay*2*1000)]).start() | ||||
| 	threading.Timer(sendRestartTime, glob.streams.broadcast, ["main", serverPackets.banchoRestart(delay*2*1000)]).start() | ||||
| 	glob.restarting = True | ||||
|  | ||||
| 	# Restart/shutdown | ||||
|   | ||||
| @@ -282,20 +282,21 @@ class Client: | ||||
| 				return | ||||
|  | ||||
| 			# Make sure we are not connected to Bancho | ||||
| 			token = glob.tokens.getTokenFromUsername(chat.fixUsernameForBancho(nick)) | ||||
| 			token = glob.tokens.getTokenFromUsername(chat.fixUsernameForBancho(nick), True) | ||||
| 			if token is not None: | ||||
| 				self.reply("433 * {} :Nickname is already in use".format(nick)) | ||||
| 				return | ||||
|  | ||||
| 			# Make sure we are not already connected from IRC with that name | ||||
| 			for _, value in self.server.clients.items(): | ||||
| 				if value.IRCUsername == self.IRCUsername and value != self: | ||||
| 					self.reply("433 * {} :Nickname is already in use".format(nick)) | ||||
| 					return | ||||
|  | ||||
| 			# Everything seems fine, set username (nickname) | ||||
| 			self.IRCUsername = nick	# username for IRC | ||||
| 			self.banchoUsername = chat.fixUsernameForBancho(self.IRCUsername)	# username for bancho | ||||
|  | ||||
| 			# Disconnect other IRC clients from the same user | ||||
| 			for _, value in self.server.clients.items(): | ||||
| 				if value.IRCUsername.lower() == self.IRCUsername.lower() and value != self: | ||||
| 					print("DISCONNECTERINOOOOOOOOOOOOOOOOOOOOO") | ||||
| 					value.disconnect(quitmsg="Connected from another client") | ||||
| 					return | ||||
| 		elif command == "USER": | ||||
| 			# Ignore USER command, we use nickname only | ||||
| 			return | ||||
|   | ||||
| @@ -14,8 +14,8 @@ def connect(): | ||||
| 	"""Add FokaBot to connected users and send userpanel/stats packet to everyone""" | ||||
| 	token = glob.tokens.addToken(999) | ||||
| 	token.actionID = actions.IDLE | ||||
| 	glob.tokens.enqueueAll(serverPackets.userPanel(999)) | ||||
| 	glob.tokens.enqueueAll(serverPackets.userStats(999)) | ||||
| 	glob.streams.broadcast("main", serverPackets.userPanel(999)) | ||||
| 	glob.streams.broadcast("main", serverPackets.userStats(999)) | ||||
|  | ||||
| def disconnect(): | ||||
| 	"""Remove FokaBot from connected users""" | ||||
|   | ||||
| @@ -5,6 +5,7 @@ from objects import channelList | ||||
| from objects import matchList | ||||
| from objects import fileLocks | ||||
| from objects import fileBuffer | ||||
| from objects import streamList | ||||
| import time | ||||
|  | ||||
| try: | ||||
| @@ -42,3 +43,6 @@ sentry = False | ||||
| irc = False | ||||
|  | ||||
| startTime = int(time.time()) | ||||
|  | ||||
|  | ||||
| streams = streamList.streamList() | ||||
|   | ||||
| @@ -34,6 +34,7 @@ class token: | ||||
| 		self.pingTime = self.loginTime | ||||
| 		self.timeOffset = timeOffset | ||||
| 		self.lock = threading.Lock()	# Sync primitive | ||||
| 		self.streams = [] | ||||
|  | ||||
| 		# Default variables | ||||
| 		self.spectators = [] | ||||
| @@ -79,6 +80,9 @@ class token: | ||||
| 		if ip != "": | ||||
| 			userHelper.saveBanchoSession(self.userID, self.ip) | ||||
|  | ||||
| 		# Join main stream | ||||
| 		self.joinStream("main") | ||||
|  | ||||
| 	def enqueue(self, bytes_): | ||||
| 		""" | ||||
| 		Add bytes (packets) to queue | ||||
| @@ -277,7 +281,7 @@ class token: | ||||
| 		self.enqueue(serverPackets.silenceEndTime(seconds)) | ||||
|  | ||||
| 		# Send silenced packet to everyone else | ||||
| 		glob.tokens.enqueueAll(serverPackets.userSilenced(self.userID)) | ||||
| 		glob.streams.broadcast("main", serverPackets.userSilenced(self.userID)) | ||||
|  | ||||
| 	def spamProtection(self, increaseSpamRate = True): | ||||
| 		""" | ||||
| @@ -343,3 +347,17 @@ class token: | ||||
| 		""" | ||||
| 		self.restricted = True | ||||
| 		chat.sendMessage("FokaBot",self.username, "Your account is currently in restricted mode. Please visit ripple's website for more information.") | ||||
|  | ||||
| 	def joinStream(self, name): | ||||
| 		glob.streams.join(name, self) | ||||
| 		if name not in self.streams: | ||||
| 			self.streams.append(name) | ||||
|  | ||||
| 	def leaveStream(self, name): | ||||
| 		glob.streams.leave(name, self) | ||||
| 		if name in self.streams: | ||||
| 			self.streams.remove(name) | ||||
|  | ||||
| 	def leaveAllStreams(self): | ||||
| 		for i in self.streams: | ||||
| 			self.leaveStream(i) | ||||
							
								
								
									
										39
									
								
								objects/stream.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										39
									
								
								objects/stream.py
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,39 @@ | ||||
| class stream(): | ||||
| 	def __init__(self, name): | ||||
| 		""" | ||||
| 		Initialize a stream object | ||||
|  | ||||
| 		:param name: stream name | ||||
| 		""" | ||||
| 		self.name = name | ||||
| 		self.clients = [] | ||||
|  | ||||
| 	def addClient(self, client): | ||||
| 		""" | ||||
| 		Add a client to this stream if not already in | ||||
|  | ||||
| 		:param client: client (osuToken) object | ||||
| 		:return: | ||||
| 		""" | ||||
| 		if client not in self.clients: | ||||
| 			self.clients.append(client) | ||||
|  | ||||
| 	def removeClient(self, client): | ||||
| 		""" | ||||
| 		Remove a client from this stream if in | ||||
|  | ||||
| 		:param client: client (osuToken) object | ||||
| 		:return: | ||||
| 		""" | ||||
| 		if client in self.clients: | ||||
| 			self.clients.remove(client) | ||||
|  | ||||
| 	def broadcast(self, data): | ||||
| 		""" | ||||
| 		Send some data to all clients connected to this stream | ||||
|  | ||||
| 		:param data: data to send | ||||
| 		:return: | ||||
| 		""" | ||||
| 		for i in self.clients: | ||||
| 			i.enqueue(data) | ||||
							
								
								
									
										63
									
								
								objects/streamList.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										63
									
								
								objects/streamList.py
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,63 @@ | ||||
| from objects import stream | ||||
|  | ||||
| class streamList(): | ||||
| 	def __init__(self): | ||||
| 		self.streams = {} | ||||
|  | ||||
| 	def add(self, name): | ||||
| 		""" | ||||
| 		Create a new stream list if it doesn't already exist | ||||
|  | ||||
| 		:param name: stream name | ||||
| 		:return: | ||||
| 		""" | ||||
| 		if name not in self.streams: | ||||
| 			self.streams[name] = stream.stream(name) | ||||
|  | ||||
| 	def remove(self, name): | ||||
| 		""" | ||||
| 		Removes an existing stream and kick every user in it | ||||
|  | ||||
| 		:param name: stream name | ||||
| 		:return: | ||||
| 		""" | ||||
| 		if name in self.streams: | ||||
| 			for i in self.streams[name].clients: | ||||
| 				i.leaveStream(name) | ||||
| 			self.streams.pop(name) | ||||
|  | ||||
| 	def broadcast(self, streamName, data): | ||||
| 		""" | ||||
| 		Send some data to all clients in a stream | ||||
|  | ||||
| 		:param streamName: stream name | ||||
| 		:param data: data to send | ||||
| 		:return: | ||||
| 		""" | ||||
| 		if streamName not in self.streams: | ||||
| 			return | ||||
| 		self.streams[streamName].broadcast(data) | ||||
|  | ||||
| 	def join(self, streamName, client): | ||||
| 		""" | ||||
| 		Add a client to a stream | ||||
|  | ||||
| 		:param streamName: stream name | ||||
| 		:param client: client (osuToken) object | ||||
| 		:return: | ||||
| 		""" | ||||
| 		if streamName not in self.streams: | ||||
| 			return | ||||
| 		self.streams[streamName].addClient(client) | ||||
|  | ||||
| 	def leave(self, streamName, client): | ||||
| 		""" | ||||
| 		Remove a client from a stream | ||||
|  | ||||
| 		:param streamName: stream name | ||||
| 		:param client: client (osuToken) object | ||||
| 		:return: | ||||
| 		""" | ||||
| 		if streamName not in self.streams: | ||||
| 			return | ||||
| 		self.streams[streamName].removeClient(client) | ||||
| @@ -58,7 +58,7 @@ class tokenList: | ||||
| 		# Get userID associated to that token | ||||
| 		return self.tokens[token].userID | ||||
|  | ||||
| 	def getTokenFromUserID(self, userID): | ||||
| 	def getTokenFromUserID(self, userID, ignoreIRC=False): | ||||
| 		""" | ||||
| 		Get token from a user ID | ||||
|  | ||||
| @@ -68,12 +68,14 @@ class tokenList: | ||||
| 		# Make sure the token exists | ||||
| 		for _, value in self.tokens.items(): | ||||
| 			if value.userID == userID: | ||||
| 				if ignoreIRC and value.irc: | ||||
| 					continue | ||||
| 				return value | ||||
|  | ||||
| 		# Return none if not found | ||||
| 		return None | ||||
|  | ||||
| 	def getTokenFromUsername(self, username): | ||||
| 	def getTokenFromUsername(self, username, ignoreIRC=False): | ||||
| 		""" | ||||
| 		Get token from a username | ||||
|  | ||||
| @@ -86,6 +88,8 @@ class tokenList: | ||||
| 		# Make sure the token exists | ||||
| 		for _, value in self.tokens.items(): | ||||
| 			if value.username.lower() == who: | ||||
| 				if ignoreIRC and value.irc: | ||||
| 					continue | ||||
| 				return value | ||||
|  | ||||
| 		# Return none if not found | ||||
|   | ||||
							
								
								
									
										5
									
								
								pep.py
									
									
									
									
									
								
							
							
						
						
									
										5
									
								
								pep.py
									
									
									
									
									
								
							| @@ -130,6 +130,11 @@ if __name__ == "__main__": | ||||
| 		glob.channels.loadChannels() | ||||
| 		consoleHelper.printDone() | ||||
|  | ||||
| 		# Initialize stremas | ||||
| 		consoleHelper.printNoNl("> Creating main stream... ") | ||||
| 		glob.streams.add("main") | ||||
| 		consoleHelper.printDone() | ||||
|  | ||||
| 		# Start fokabot | ||||
| 		consoleHelper.printNoNl("> Connecting FokaBot... ") | ||||
| 		fokabot.connect() | ||||
|   | ||||
		Reference in New Issue
	
	Block a user