.BANCHO. Add streams and streamList object, add 'main' stream

This commit is contained in:
Nyo
2016-10-01 21:19:03 +02:00
parent 2213a99147
commit 40264ceffe
14 changed files with 163 additions and 23 deletions

View File

@@ -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"""

View File

@@ -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()

View File

@@ -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
View 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
View 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)

View File

@@ -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