added autochannel module
This commit is contained in:
16
modules-available/autochannel.ini
Normal file
16
modules-available/autochannel.ini
Normal file
@@ -0,0 +1,16 @@
|
||||
|
||||
[autochannel]
|
||||
; Comma seperated list of servers to operate on, leave empty for all
|
||||
servers =
|
||||
|
||||
; Number of spare channel
|
||||
spare_channel = 1
|
||||
|
||||
; Number of channels taken from top100 steam should be created
|
||||
top_games_limit = 10
|
||||
|
||||
; Name used for root channel for newly created channels
|
||||
root_channel_name = Random Channel
|
||||
|
||||
; Interval in sec between channel checks
|
||||
check_timer_interval = 5
|
||||
127
modules/autochannel.py
Normal file
127
modules/autochannel.py
Normal file
@@ -0,0 +1,127 @@
|
||||
#!/usr/bin/env python
|
||||
|
||||
import random
|
||||
from threading import Timer
|
||||
|
||||
import requests
|
||||
from mumo_module import (commaSeperatedIntegers, MumoModule)
|
||||
|
||||
|
||||
# noinspection PyPep8Naming
|
||||
class autochannel(MumoModule):
|
||||
default_config = {'autochannel': (
|
||||
('servers', commaSeperatedIntegers, []),
|
||||
('spare_channel', int, 1),
|
||||
('top_games_limit', int, 10),
|
||||
('root_channel_name', str, "Random Channel"),
|
||||
('check_timer_interval', int, 5)
|
||||
)
|
||||
}
|
||||
|
||||
def __init__(self, name, manager, configuration=None):
|
||||
MumoModule.__init__(self, name, manager, configuration)
|
||||
self.murmur = manager.getMurmurModule()
|
||||
self.spare_channel = self.cfg().autochannel.spare_channel
|
||||
self.top_games_limit = self.cfg().autochannel.top_games_limit
|
||||
self.root_channel_name = self.cfg().autochannel.root_channel_name
|
||||
self.timer_interval = self.cfg().autochannel.check_timer_interval
|
||||
self.root = None
|
||||
self.servertimer = {}
|
||||
|
||||
# Load steam top 100 last two weeks
|
||||
r = requests.get("http://steamspy.com/api.php?request=top100in2weeks")
|
||||
|
||||
if r.status_code == 200:
|
||||
self.top_list = r.json()
|
||||
self.log().info("Loaded steam Top100")
|
||||
else:
|
||||
self.top_list = None
|
||||
|
||||
# Load wordlist
|
||||
r = requests.get("https://svnweb.freebsd.org/csrg/share/dict/words?view=co&content-type=text/plain")
|
||||
|
||||
if r.status_code == 200:
|
||||
self.wordlist = r.text.splitlines()
|
||||
self.log().info("Loaded {} words".format(len(self.wordlist)))
|
||||
else:
|
||||
self.wordlist = None
|
||||
|
||||
def connected(self):
|
||||
self.log().debug("Register for Server callbacks")
|
||||
|
||||
servers = self.cfg().autochannel.servers
|
||||
if not servers:
|
||||
servers = self.manager().SERVERS_ALL
|
||||
|
||||
self.manager().subscribeMetaCallbacks(self, servers)
|
||||
|
||||
for server in self.manager().getMeta().getBootedServers():
|
||||
self.init_channels(server)
|
||||
self.servertimer[server.id] = Timer(self.timer_interval, self.handle_timer, [server])
|
||||
self.servertimer[server.id].start()
|
||||
|
||||
def handle_timer(self, server):
|
||||
self.check_channel(server)
|
||||
|
||||
self.servertimer[server.id] = Timer(self.timer_interval, self.handle_timer, [server])
|
||||
self.servertimer[server.id].start()
|
||||
|
||||
def disconnected(self):
|
||||
pass
|
||||
|
||||
def init_channels(self, server):
|
||||
channels = server.getChannels()
|
||||
|
||||
if not self.root:
|
||||
for cid, channel in channels.items():
|
||||
if channel.name == self.root_channel_name and channel.parent == 0:
|
||||
self.root = channel
|
||||
|
||||
if not self.root:
|
||||
new_root_cid = server.addChannel(self.root_channel_name, 0)
|
||||
self.root = server.getChannelState(new_root_cid)
|
||||
|
||||
self.check_channel(server)
|
||||
|
||||
@staticmethod
|
||||
def get_user_for_channel(cid, server):
|
||||
users = server.getUsers()
|
||||
users_in_channel = {}
|
||||
|
||||
for uid, user in users.items():
|
||||
if user.channel == cid:
|
||||
users_in_channel[uid] = user
|
||||
|
||||
return users_in_channel
|
||||
|
||||
def check_channel(self, server):
|
||||
empty_channels = []
|
||||
channels = server.getChannels()
|
||||
|
||||
for cid, channel in channels.items():
|
||||
if channel.parent == self.root.id and len(self.get_user_for_channel(cid, server)) == 0:
|
||||
empty_channels.append(cid)
|
||||
|
||||
for cid in empty_channels[1:]:
|
||||
server.removeChannel(cid)
|
||||
|
||||
if len(empty_channels) == 0:
|
||||
self.add_random_channel(server)
|
||||
|
||||
def add_random_channel(self, server):
|
||||
server.addChannel(self.wordlist[random.randint(0, len(self.wordlist))], self.root.id)
|
||||
|
||||
#
|
||||
# --- Meta callback functions
|
||||
#
|
||||
|
||||
def started(self, server, context=None):
|
||||
self.manager().subscribeServerCallbacks(self, [server.id])
|
||||
|
||||
self.servertimer[server.id] = Timer(self.timer_interval, self.handle_timer, [server])
|
||||
self.servertimer[server.id].start()
|
||||
self.init_channels(server)
|
||||
|
||||
def stopped(self, server, context=None):
|
||||
if server.id in self.servertimer:
|
||||
self.servertimer[server.id].stop()
|
||||
Reference in New Issue
Block a user