Source plugin now remembers channel names of controlled channels
- validateChannelDB and channel state changes now maintain mappings database - Name mappings are used during channel creation
This commit is contained in:
@@ -124,14 +124,16 @@ class source(MumoModule):
|
|||||||
current_sid = -1
|
current_sid = -1
|
||||||
current_mumble_server = None
|
current_mumble_server = None
|
||||||
|
|
||||||
for sid, cid, _, _, _ in self.db.registeredChannels():
|
for sid, cid, game, server, team in self.db.registeredChannels():
|
||||||
if current_sid != sid:
|
if current_sid != sid:
|
||||||
current_mumble_server = self.meta.getServer(sid)
|
current_mumble_server = self.meta.getServer(sid)
|
||||||
current_sid = sid
|
current_sid = sid
|
||||||
|
|
||||||
try:
|
try:
|
||||||
current_mumble_server.getChannelState(cid)
|
state = current_mumble_server.getChannelState(cid)
|
||||||
|
self.db.mapName(state.name, sid, game, server, team)
|
||||||
#TODO: Verify ACL?
|
#TODO: Verify ACL?
|
||||||
|
|
||||||
except self.murmur.InvalidChannelException:
|
except self.murmur.InvalidChannelException:
|
||||||
# Channel no longer exists
|
# Channel no longer exists
|
||||||
log.debug("(%d) Channel %d no longer exists. Dropped.", sid, cid)
|
log.debug("(%d) Channel %d no longer exists. Dropped.", sid, cid)
|
||||||
@@ -360,7 +362,9 @@ class source(MumoModule):
|
|||||||
sid = mumble_server.id()
|
sid = mumble_server.id()
|
||||||
game_cid = self.db.cidFor(sid, game)
|
game_cid = self.db.cidFor(sid, game)
|
||||||
if game_cid == None:
|
if game_cid == None:
|
||||||
game_channel_name = self.getGameName(game) % namevars
|
game_channel_name = self.db.nameFor(sid, game,
|
||||||
|
default = (self.getGameName(game) % namevars))
|
||||||
|
|
||||||
log.debug("(%d) Creating game channel '%s' below %d", sid, game_channel_name, cfg.source.basechannelid)
|
log.debug("(%d) Creating game channel '%s' below %d", sid, game_channel_name, cfg.source.basechannelid)
|
||||||
game_cid = mumble_server.addChannel(game_channel_name, cfg.source.basechannelid)
|
game_cid = mumble_server.addChannel(game_channel_name, cfg.source.basechannelid)
|
||||||
self.db.registerChannel(sid, game_cid, game) # Make sure we don't have orphaned server channels around
|
self.db.registerChannel(sid, game_cid, game) # Make sure we don't have orphaned server channels around
|
||||||
@@ -382,7 +386,9 @@ class source(MumoModule):
|
|||||||
"""
|
"""
|
||||||
server_cid = self.db.cidFor(sid, game, server)
|
server_cid = self.db.cidFor(sid, game, server)
|
||||||
if server_cid == None:
|
if server_cid == None:
|
||||||
server_channel_name = self.getServerName(game) % namevars
|
server_channel_name = self.db.nameFor(sid, game, server,
|
||||||
|
default = self.getServerName(game) % namevars)
|
||||||
|
|
||||||
log.debug("(%d) Creating server channel '%s' below %d", sid, server_channel_name, game_cid)
|
log.debug("(%d) Creating server channel '%s' below %d", sid, server_channel_name, game_cid)
|
||||||
server_cid = mumble_server.addChannel(server_channel_name, game_cid)
|
server_cid = mumble_server.addChannel(server_channel_name, game_cid)
|
||||||
self.db.registerChannel(sid, server_cid, game, server)
|
self.db.registerChannel(sid, server_cid, game, server)
|
||||||
@@ -405,7 +411,9 @@ class source(MumoModule):
|
|||||||
|
|
||||||
team_cid = self.db.cidFor(sid, game, server, team)
|
team_cid = self.db.cidFor(sid, game, server, team)
|
||||||
if team_cid == None:
|
if team_cid == None:
|
||||||
team_channel_name = self.getTeamName(game, team)
|
team_channel_name = self.db.nameFor(sid, game, server, team,
|
||||||
|
default = self.getTeamName(game, team))
|
||||||
|
|
||||||
log.debug("(%d) Creating team channel '%s' below %d", sid, team_channel_name, server_cid)
|
log.debug("(%d) Creating team channel '%s' below %d", sid, team_channel_name, server_cid)
|
||||||
team_cid = mumble_server.addChannel(team_channel_name, server_cid)
|
team_cid = mumble_server.addChannel(team_channel_name, server_cid)
|
||||||
self.db.registerChannel(sid, team_cid, game, server, team)
|
self.db.registerChannel(sid, team_cid, game, server, team)
|
||||||
@@ -511,7 +519,7 @@ class source(MumoModule):
|
|||||||
relevant = self.db.channelsFor(sid, cur_game, cur_server)
|
relevant = self.db.channelsFor(sid, cur_game, cur_server)
|
||||||
|
|
||||||
for _, cur_cid, _, _, cur_team in relevant:
|
for _, cur_cid, _, _, cur_team in relevant:
|
||||||
if cur_team == None:
|
if cur_team == self.db.NO_TEAM:
|
||||||
server_channel_cid = cur_cid
|
server_channel_cid = cur_cid
|
||||||
|
|
||||||
if self.users.usingChannel(sid, cur_cid):
|
if self.users.usingChannel(sid, cur_cid):
|
||||||
@@ -656,10 +664,23 @@ class source(MumoModule):
|
|||||||
|
|
||||||
self.log().debug("(%d) Channel %d removed.", sid, cid)
|
self.log().debug("(%d) Channel %d removed.", sid, cid)
|
||||||
self.db.dropChannel(sid, cid)
|
self.db.dropChannel(sid, cid)
|
||||||
|
|
||||||
|
def channelStateChanged(self, server, state, context=None):
|
||||||
|
"""
|
||||||
|
Updates channel name mappings when needed.
|
||||||
|
"""
|
||||||
|
cid = state.id
|
||||||
|
sid = server.id()
|
||||||
|
name = state.name
|
||||||
|
channel = self.db.channelForCid(sid, cid)
|
||||||
|
if channel:
|
||||||
|
_, _, game, server, team = channel
|
||||||
|
self.db.mapName(name, sid, game, server, team)
|
||||||
|
self.log().debug("(%d) Name mapping for channel %d updated to '%s'", sid, cid, name)
|
||||||
|
|
||||||
def userTextMessage(self, server, user, message, current=None): pass
|
def userTextMessage(self, server, user, message, current=None): pass
|
||||||
def channelCreated(self, server, state, context=None): pass
|
def channelCreated(self, server, state, context=None): pass
|
||||||
def channelStateChanged(self, server, state, context=None): pass
|
|
||||||
|
|
||||||
#
|
#
|
||||||
#--- Meta callback functions
|
#--- Meta callback functions
|
||||||
|
|||||||
@@ -44,6 +44,14 @@ class StateMock():
|
|||||||
self.channel = cid
|
self.channel = cid
|
||||||
self.session = session
|
self.session = session
|
||||||
self.userid = userid
|
self.userid = userid
|
||||||
|
|
||||||
|
class ChannelStateMock():
|
||||||
|
def __init__(self, cid, name, parent, groups, acls):
|
||||||
|
self.id = cid
|
||||||
|
self.name = name
|
||||||
|
self.parent = parent
|
||||||
|
self.groups = groups
|
||||||
|
self.acls = acls
|
||||||
|
|
||||||
class ServerMock():
|
class ServerMock():
|
||||||
def __init__(self, sid):
|
def __init__(self, sid):
|
||||||
@@ -59,19 +67,20 @@ class ServerMock():
|
|||||||
def addChannel(self, name, parent):
|
def addChannel(self, name, parent):
|
||||||
self.uid += 1
|
self.uid += 1
|
||||||
assert(not self.uid in self.channels)
|
assert(not self.uid in self.channels)
|
||||||
self.channels[self.uid] = {'name' : name,
|
self.channels[self.uid] = ChannelStateMock(self.uid,
|
||||||
'parent' : parent,
|
name,
|
||||||
'groups' : {},
|
parent,
|
||||||
'acls' : [] }
|
{},
|
||||||
|
[])
|
||||||
return self.uid
|
return self.uid
|
||||||
|
|
||||||
def addUserToGroup(self, cid, session, group):
|
def addUserToGroup(self, cid, session, group):
|
||||||
c = self._getChan(cid)
|
c = self._getChan(cid)
|
||||||
|
|
||||||
if session in c['groups']:
|
if session in c.groups:
|
||||||
c['groups'][session].add(group)
|
c.groups[session].add(group)
|
||||||
else:
|
else:
|
||||||
c['groups'][session] = set([group])
|
c.groups[session] = set([group])
|
||||||
|
|
||||||
def _getChan(self, cid):
|
def _getChan(self, cid):
|
||||||
if not cid in self.channels:
|
if not cid in self.channels:
|
||||||
@@ -80,16 +89,14 @@ class ServerMock():
|
|||||||
return self.channels[cid]
|
return self.channels[cid]
|
||||||
|
|
||||||
def getChannelState(self, cid):
|
def getChannelState(self, cid):
|
||||||
self._getChan(cid)
|
return self._getChan(cid)
|
||||||
|
|
||||||
return {'fake': True}
|
|
||||||
|
|
||||||
def setState(self, state):
|
def setState(self, state):
|
||||||
self.user_state.append(state)
|
self.user_state.append(state)
|
||||||
|
|
||||||
def setACL(self, cid, acls, groups, inherit):
|
def setACL(self, cid, acls, groups, inherit):
|
||||||
c = self._getChan(cid)
|
c = self._getChan(cid)
|
||||||
c['acls'] = acls
|
c.acls = acls
|
||||||
|
|
||||||
def _reset(self):
|
def _reset(self):
|
||||||
self.uid = 1000
|
self.uid = 1000
|
||||||
@@ -202,7 +209,7 @@ class Test(unittest.TestCase):
|
|||||||
self.assertEqual(self.mm.serverCB['callback'], self.s)
|
self.assertEqual(self.mm.serverCB['callback'], self.s)
|
||||||
|
|
||||||
def resetDB(self):
|
def resetDB(self):
|
||||||
self.s.db.db.reset()
|
self.s.db.reset()
|
||||||
|
|
||||||
def resetState(self):
|
def resetState(self):
|
||||||
self.resetDB()
|
self.resetDB()
|
||||||
@@ -308,13 +315,13 @@ class Test(unittest.TestCase):
|
|||||||
|
|
||||||
c = mumble_server.channels
|
c = mumble_server.channels
|
||||||
|
|
||||||
self.assertEqual(c[prev + 1]["parent"], 0)
|
self.assertEqual(c[prev + 1].parent, 0)
|
||||||
self.assertEqual(c[prev + 2]["parent"], prev + 1)
|
self.assertEqual(c[prev + 2].parent, prev + 1)
|
||||||
self.assertEqual(c[prev + 3]["parent"], prev + 2)
|
self.assertEqual(c[prev + 3].parent, prev + 2)
|
||||||
|
|
||||||
self.assertEqual(c[prev + 1]["name"], "Team Fortress 2")
|
self.assertEqual(c[prev + 1].name, "Team Fortress 2")
|
||||||
self.assertEqual(c[prev + 2]["name"], "Test tf [A-1:123]")
|
self.assertEqual(c[prev + 2].name, "Test tf [A-1:123]")
|
||||||
self.assertEqual(c[prev + 3]["name"], "Red")
|
self.assertEqual(c[prev + 3].name, "Red")
|
||||||
|
|
||||||
sid = mumble_server.id()
|
sid = mumble_server.id()
|
||||||
|
|
||||||
@@ -327,9 +334,9 @@ class Test(unittest.TestCase):
|
|||||||
|
|
||||||
c = mumble_server.channels
|
c = mumble_server.channels
|
||||||
|
|
||||||
self.checkACLThings(c[prev + 3]['acls'], [{'group' : '~source_tf_[A-1:123]_3'}])
|
self.checkACLThings(c[prev + 3].acls, [{'group' : '~source_tf_[A-1:123]_3'}])
|
||||||
self.checkACLThings(c[prev + 2]['acls'], [{'group' : '~source_tf_[A-1:123]'}])
|
self.checkACLThings(c[prev + 2].acls, [{'group' : '~source_tf_[A-1:123]'}])
|
||||||
self.checkACLThings(c[prev + 1]['acls'], [{},
|
self.checkACLThings(c[prev + 1].acls, [{},
|
||||||
{'group' : '~source_tf'}])
|
{'group' : '~source_tf'}])
|
||||||
|
|
||||||
#print self.s.db.db.execute("SELECT * FROM source").fetchall()
|
#print self.s.db.db.execute("SELECT * FROM source").fetchall()
|
||||||
@@ -399,13 +406,13 @@ class Test(unittest.TestCase):
|
|||||||
user = source.User(user_state, {'team':TEAM_BLUE}, "tf", "[A-1:123]")
|
user = source.User(user_state, {'team':TEAM_BLUE}, "tf", "[A-1:123]")
|
||||||
self.s.moveUser(self.mserv, user)
|
self.s.moveUser(self.mserv, user)
|
||||||
c = mumble_server.channels
|
c = mumble_server.channels
|
||||||
self.assertEqual(c[prev + 1]["parent"], BASE_SID)
|
self.assertEqual(c[prev + 1].parent, BASE_SID)
|
||||||
self.assertEqual(c[prev + 2]["parent"], GAME_SID)
|
self.assertEqual(c[prev + 2].parent, GAME_SID)
|
||||||
self.assertEqual(c[prev + 3]["parent"], SERVER_SID)
|
self.assertEqual(c[prev + 3].parent, SERVER_SID)
|
||||||
|
|
||||||
self.assertEqual(c[prev + 1]["name"], "Team Fortress 2")
|
self.assertEqual(c[prev + 1].name, "Team Fortress 2")
|
||||||
self.assertEqual(c[prev + 2]["name"], "Test tf [A-1:123]")
|
self.assertEqual(c[prev + 2].name, "Test tf [A-1:123]")
|
||||||
self.assertEqual(c[prev + 3]["name"], "Blue")
|
self.assertEqual(c[prev + 3].name, "Blue")
|
||||||
self.assertEqual(len(c), 3)
|
self.assertEqual(len(c), 3)
|
||||||
|
|
||||||
self.assertEqual(user_state.channel, TEAM_RED_SID)
|
self.assertEqual(user_state.channel, TEAM_RED_SID)
|
||||||
@@ -414,8 +421,8 @@ class Test(unittest.TestCase):
|
|||||||
user.identity['team'] = TEAM_RED
|
user.identity['team'] = TEAM_RED
|
||||||
self.s.moveUser(self.mserv, user)
|
self.s.moveUser(self.mserv, user)
|
||||||
|
|
||||||
self.assertEqual(c[prev + 4]["parent"], SERVER_SID)
|
self.assertEqual(c[prev + 4].parent, SERVER_SID)
|
||||||
self.assertEqual(c[prev + 4]["name"], "Red")
|
self.assertEqual(c[prev + 4].name, "Red")
|
||||||
self.assertEqual(len(c), 4)
|
self.assertEqual(len(c), 4)
|
||||||
|
|
||||||
self.assertEqual(user_state.channel, TEAM_BLUE_SID)
|
self.assertEqual(user_state.channel, TEAM_BLUE_SID)
|
||||||
@@ -436,8 +443,6 @@ class Test(unittest.TestCase):
|
|||||||
self.assertEqual(len(self.s.db.registeredChannels()), 3)
|
self.assertEqual(len(self.s.db.registeredChannels()), 3)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
def testSetACLsForGameChannel(self):
|
def testSetACLsForGameChannel(self):
|
||||||
self.resetState()
|
self.resetState()
|
||||||
|
|
||||||
@@ -445,7 +450,7 @@ class Test(unittest.TestCase):
|
|||||||
cid = mumble_server.addChannel("test", 1); game = "dod"
|
cid = mumble_server.addChannel("test", 1); game = "dod"
|
||||||
|
|
||||||
self.s.setACLsForGameChannel(mumble_server, cid, game)
|
self.s.setACLsForGameChannel(mumble_server, cid, game)
|
||||||
acls = mumble_server.channels[cid]['acls']
|
acls = mumble_server.channels[cid].acls
|
||||||
|
|
||||||
self.checkACLThings(acls, [{'applyHere' : True,
|
self.checkACLThings(acls, [{'applyHere' : True,
|
||||||
'applySubs' : True,
|
'applySubs' : True,
|
||||||
@@ -468,7 +473,7 @@ class Test(unittest.TestCase):
|
|||||||
mumble_server = self.mserv
|
mumble_server = self.mserv
|
||||||
cid = mumble_server.addChannel("test", 1); game = "tf"; server = "[A-1:SomeServer]"
|
cid = mumble_server.addChannel("test", 1); game = "tf"; server = "[A-1:SomeServer]"
|
||||||
self.s.setACLsForServerChannel(mumble_server, cid, game, server)
|
self.s.setACLsForServerChannel(mumble_server, cid, game, server)
|
||||||
acls = mumble_server.channels[cid]['acls']
|
acls = mumble_server.channels[cid].acls
|
||||||
|
|
||||||
self.checkACLThings(acls, [{'applyHere' : True,
|
self.checkACLThings(acls, [{'applyHere' : True,
|
||||||
'applySubs' : False,
|
'applySubs' : False,
|
||||||
@@ -485,7 +490,7 @@ class Test(unittest.TestCase):
|
|||||||
cid = mumble_server.addChannel("test", 1); game = "tf"; server = "[A-1:SomeServer]"; team = 2
|
cid = mumble_server.addChannel("test", 1); game = "tf"; server = "[A-1:SomeServer]"; team = 2
|
||||||
|
|
||||||
self.s.setACLsForTeamChannel(mumble_server, cid, game, server, team)
|
self.s.setACLsForTeamChannel(mumble_server, cid, game, server, team)
|
||||||
acls = mumble_server.channels[cid]['acls']
|
acls = mumble_server.channels[cid].acls
|
||||||
|
|
||||||
self.checkACLThings(acls, [{'applyHere' : True,
|
self.checkACLThings(acls, [{'applyHere' : True,
|
||||||
'applySubs' : False,
|
'applySubs' : False,
|
||||||
@@ -506,11 +511,32 @@ class Test(unittest.TestCase):
|
|||||||
# Test
|
# Test
|
||||||
self.s.addToGroups(mumble_server, session, game, server, team)
|
self.s.addToGroups(mumble_server, session, game, server, team)
|
||||||
|
|
||||||
groups = mumble_server.channels[prev + 1]['groups'][session]
|
groups = mumble_server.channels[prev + 1].groups[session]
|
||||||
self.assertIn("source_cstrike", groups)
|
self.assertIn("source_cstrike", groups)
|
||||||
self.assertIn("source_cstrike_[A-1:12345]", groups)
|
self.assertIn("source_cstrike_[A-1:12345]", groups)
|
||||||
self.assertIn("source_cstrike_[A-1:12345]_1", groups)
|
self.assertIn("source_cstrike_[A-1:12345]_1", groups)
|
||||||
|
|
||||||
|
def testChannelNameMapping(self):
|
||||||
|
self.resetState()
|
||||||
|
|
||||||
|
mumble_server = self.mserv
|
||||||
|
|
||||||
|
game = 'cstrike'; server = '[A-1:12345]'; team = 1
|
||||||
|
self.s.getOrCreateChannelFor(mumble_server, game, server, team)
|
||||||
|
cids = []
|
||||||
|
for c in mumble_server.channels.itervalues():
|
||||||
|
c.name = str(c.id)
|
||||||
|
self.s.channelStateChanged(mumble_server, c)
|
||||||
|
cids.append(c.id)
|
||||||
|
|
||||||
|
mumble_server._reset()
|
||||||
|
self.s.validateChannelDB()
|
||||||
|
self.assertEqual(len(mumble_server.channels), 0)
|
||||||
|
self.assertEqual(len(self.s.db.registeredChannels()), 0)
|
||||||
|
|
||||||
|
self.s.getOrCreateChannelFor(mumble_server, game, server, team)
|
||||||
|
for cid in cids:
|
||||||
|
self.assertEqual(mumble_server._getChan(cid).name, str(cid))
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
#logging.basicConfig(level = logging.DEBUG)
|
#logging.basicConfig(level = logging.DEBUG)
|
||||||
|
|||||||
Reference in New Issue
Block a user