.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