diff --git a/alliance_auth/settings.py.example b/alliance_auth/settings.py.example
index 9268722b..cbcd7b06 100755
--- a/alliance_auth/settings.py.example
+++ b/alliance_auth/settings.py.example
@@ -186,6 +186,7 @@ ENABLE_ALLIANCE_FORUM = True
ENABLE_ALLIANCE_JABBER = True
ENABLE_ALLIANCE_MUMBLE = True
ENABLE_ALLIANCE_IPBOARD = False
+ENABLE_ALLIANCE_TEAMSPEAK3 = False
#####################
# Blue service Setup
@@ -199,6 +200,7 @@ ENABLE_BLUE_FORUM = False
ENABLE_BLUE_JABBER = False
ENABLE_BLUE_MUMBLE = True
ENABLE_BLUE_IPBOARD = False
+ENABLE_BLUE_TEAMSPEAK3 = False
#########################
# Alliance Configuration
@@ -264,3 +266,20 @@ BROADCAST_USER_PASSWORD = "somepassword"
MUMBLE_URL = "someurl.com"
MUMBLE_SERVER_ID = 1
+######################################
+# Teamspeak3 Configuration
+######################################
+# TEAMSPEAK3_SERVER_IP - Teamspeak3 server ip
+# TEAMSPEAK3_SERVER_PORT - Teamspeak3 server port
+# TEAMSPEAK3_SERVERQUERY_USER - Teamspeak3 serverquery username
+# TEAMSPEAK3_SERVERQUERY_PASSWORD - Teamspeak3 serverquery password
+# TEAMSPEAK3_VIRTUAL_SERVER - Virtual server id
+# TEAMSPEAK3_AUTHED_GROUP_ID - Default authed group id
+# TEAMSPEAK3_PUBLIC_URL - teamspeak3 public url used for link creation
+######################################
+TEAMSPEAK3_SERVER_IP = '127.0.0.1'
+TEAMSPEAK3_SERVER_PORT = 10011
+TEAMSPEAK3_SERVERQUERY_USER = 'serveradmin'
+TEAMSPEAK3_SERVERQUERY_PASSWORD = 'passwordhere'
+TEAMSPEAK3_VIRTUAL_SERVER = 1
+TEAMSPEAK3_PUBLIC_URL = 'someaddress.com'
\ No newline at end of file
diff --git a/alliance_auth/urls.py b/alliance_auth/urls.py
index 3ea2bf27..b2663708 100755
--- a/alliance_auth/urls.py
+++ b/alliance_auth/urls.py
@@ -114,6 +114,14 @@ urlpatterns = patterns('',
url(r'^reset_ipboard_password/$', 'services.views.reset_ipboard_password',
name='auth_reset_ipboard_password'),
+ # Teamspeak3 service control
+ url(r'^activate_teamspeak3/$', 'services.views.activate_teamspeak3',
+ name='auth_activate_teamspeak3'),
+ url(r'^deactivate_teamspeak3/$', 'services.views.deactivate_teamspeak3',
+ name='auth_deactivate_teamspeak3'),
+ url(r'reset_teamspeak3_perm/$', 'services.views.reset_teamspeak3_perm',
+ name='auth_reset_teamspeak3_perm'),
+
# Tools
url(r'^tool/fleet_formatter_tool/$', 'services.views.fleet_formatter_view',
name='auth_fleet_format_tool_view'),
diff --git a/authentication/managers.py b/authentication/managers.py
index e4359e81..cee8b1f9 100755
--- a/authentication/managers.py
+++ b/authentication/managers.py
@@ -65,6 +65,14 @@ class AuthServicesInfoManager:
authserviceinfo.ipboard_password = password
authserviceinfo.save(update_fields=['ipboard_username', 'ipboard_password'])
+ @staticmethod
+ def update_user_teamspeak3_info(uid, perm_key, user):
+ if User.objects.filter(username=user.username).exists():
+ authserviceinfo = AuthServicesInfoManager.__get_or_create(user)
+ authserviceinfo.teamspeak3_uid = uid
+ authserviceinfo.teamspeak3_perm_key = perm_key
+ authserviceinfo.save(update_fields=['teamspeak3_uid', 'teamspeak3_perm_key'])
+
@staticmethod
def update_is_blue(is_blue, user):
if User.objects.filter(username=user.username).exists():
diff --git a/authentication/models.py b/authentication/models.py
index ab64ea76..2b8cfd2d 100755
--- a/authentication/models.py
+++ b/authentication/models.py
@@ -11,6 +11,8 @@ class AuthServicesInfo(models.Model):
jabber_password = models.CharField(max_length=254, default="")
mumble_username = models.CharField(max_length=254, default="")
mumble_password = models.CharField(max_length=254, default="")
+ teamspeak3_uid = models.CharField(max_length=254, default="")
+ teamspeak3_perm_key = models.CharField(max_length=254, default="")
main_char_id = models.CharField(max_length=64, default="")
is_blue = models.BooleanField(default=False)
user = models.ForeignKey(User)
diff --git a/celerytask/tasks.py b/celerytask/tasks.py
index 6d77c4a9..15111bb6 100755
--- a/celerytask/tasks.py
+++ b/celerytask/tasks.py
@@ -8,6 +8,7 @@ from services.managers.openfire_manager import OpenfireManager
from services.managers.mumble_manager import MumbleManager
from services.managers.phpbb3_manager import Phpbb3Manager
from services.managers.ipboard_manager import IPBoardManager
+from services.managers.teamspeak3_manager import Teamspeak3Manager
from authentication.models import AuthServicesInfo
from eveonline.managers import EveManager
from services.managers.eve_api_manager import EveApiManager
@@ -69,6 +70,19 @@ def update_ipboard_groups(user):
IPBoardManager.update_groups(authserviceinfo.ipboard_username, groups)
+def update_teamspeak3_groups(user):
+ syncgroups = SyncGroupCache.objects.filter(user=user)
+ authserviceinfo = AuthServicesInfo.objects.get(user=user)
+ groups = []
+ for syncgroup in syncgroups:
+ groups.append(str(syncgroup.groupname))
+
+ if len(groups) == 0:
+ groups.append('empty')
+
+ Teamspeak3Manager.update_groups(authserviceinfo.teamspeak3_uid, groups)
+
+
def add_to_databases(user, groups, syncgroups):
authserviceinfo = None
try:
@@ -90,14 +104,16 @@ def add_to_databases(user, groups, syncgroups):
update = True
if update:
- if authserviceinfo.jabber_username != "":
+ if authserviceinfo.jabber_username and authserviceinfo.jabber_username != "":
update_jabber_groups(user)
- if authserviceinfo.mumble_username != "":
+ if authserviceinfo.mumble_username and authserviceinfo.mumble_username != "":
update_mumble_groups(user)
- if authserviceinfo.forum_username != "":
+ if authserviceinfo.forum_username and authserviceinfo.forum_username != "":
update_forum_groups(user)
- if authserviceinfo.ipboard_username != "":
+ if authserviceinfo.ipboard_username and authserviceinfo.ipboard_username != "":
update_ipboard_groups(user)
+ if authserviceinfo.teamspeak3_uid and authserviceinfo.teamspeak3_uid != "":
+ update_teamspeak3_groups(user)
def remove_from_databases(user, groups, syncgroups):
@@ -117,14 +133,16 @@ def remove_from_databases(user, groups, syncgroups):
update = True
if update:
- if authserviceinfo.jabber_username != "":
+ if authserviceinfo.jabber_username and authserviceinfo.jabber_username != "":
update_jabber_groups(user)
- if authserviceinfo.mumble_username != "":
+ if authserviceinfo.mumble_username and authserviceinfo.mumble_username != "":
update_mumble_groups(user)
- if authserviceinfo.forum_username != "":
+ if authserviceinfo.forum_username and authserviceinfo.forum_username != "":
update_forum_groups(user)
- if authserviceinfo.ipboard_username != "":
+ if authserviceinfo.ipboard_username and authserviceinfo.ipboard_username != "":
update_ipboard_groups(user)
+ if authserviceinfo.teamspeak3_uid and authserviceinfo.teamspeak3_uid != "":
+ update_teamspeak3_groups(user)
# Run every minute
diff --git a/portal/views.py b/portal/views.py
old mode 100644
new mode 100755
index 1bc092af..5af18fc1
--- a/portal/views.py
+++ b/portal/views.py
@@ -6,6 +6,8 @@ from eveonline.managers import EveManager
from authentication.managers import AuthServicesInfoManager
+
+
# Create your views here.
def index_view(request):
return render_to_response('public/index.html', None, context_instance=RequestContext(request))
diff --git a/requirements.txt b/requirements.txt
index 15cdbb38..72b6116a 100755
--- a/requirements.txt
+++ b/requirements.txt
@@ -12,3 +12,4 @@ django-evolution
django-bootstrap-form
django-celery
+git+git://github.com/nikdoof/python-ts3.git
\ No newline at end of file
diff --git a/services/managers/teamspeak3_manager.py b/services/managers/teamspeak3_manager.py
new file mode 100755
index 00000000..92429020
--- /dev/null
+++ b/services/managers/teamspeak3_manager.py
@@ -0,0 +1,221 @@
+from django.conf import settings
+
+from services.managers.util.ts3 import TS3Server
+
+
+class Teamspeak3Manager:
+ def __init__(self):
+ pass
+
+ @staticmethod
+ def __get_created_server():
+ server = TS3Server(settings.TEAMSPEAK3_SERVER_IP, settings.TEAMSPEAK3_SERVER_PORT)
+ server.login(settings.TEAMSPEAK3_SERVERQUERY_USER, settings.TEAMSPEAK3_SERVERQUERY_PASSWORD)
+ server.use(settings.TEAMSPEAK3_VIRTUAL_SERVER)
+ return server
+
+ @staticmethod
+ def __santatize_username(username):
+ sanatized = username.replace(" ", "_")
+ sanatized = sanatized.replace("'", "")
+ return sanatized.lower()
+
+ @staticmethod
+ def __generate_username(username, corp_ticker):
+ return "[" + corp_ticker + "]" + username
+
+ @staticmethod
+ def __generate_username_blue(username, corp_ticker):
+ return "[BLUE][" + corp_ticker + "]" + username
+
+ @staticmethod
+ def _get_userid(uid):
+ server = Teamspeak3Manager.__get_created_server()
+ ret = server.send_command('customsearch', {'ident': 'sso_uid', 'pattern': uid})
+ if ret and 'keys' in ret and 'cldbid' in ret['keys']:
+ return ret['keys']['cldbid']
+
+ @staticmethod
+ def _group_id_by_name(groupname):
+ server = Teamspeak3Manager.__get_created_server()
+ group_cache = server.send_command('servergrouplist')
+ for group in group_cache:
+ if group['keys']['name'] == groupname:
+ return group['keys']['sgid']
+
+ return None
+
+ @staticmethod
+ def _create_group(groupname):
+ server = Teamspeak3Manager.__get_created_server()
+ sgid = Teamspeak3Manager._group_id_by_name(groupname)
+ if not sgid:
+ ret = server.send_command('servergroupadd', {'name': groupname})
+ Teamspeak3Manager.__group_cache = None
+ sgid = ret['keys']['sgid']
+ server.send_command('servergroupaddperm',
+ {'sgid': sgid, 'permsid': 'i_group_needed_modify_power', 'permvalue': 75,
+ 'permnegated': 0, 'permskip': 0})
+ server.send_command('servergroupaddperm',
+ {'sgid': sgid, 'permsid': 'i_group_needed_member_add_power', 'permvalue': 100,
+ 'permnegated': 0, 'permskip': 0})
+ server.send_command('servergroupaddperm',
+ {'sgid': sgid, 'permsid': 'i_group_needed_member_remove_power', 'permvalue': 100,
+ 'permnegated': 0, 'permskip': 0})
+ return sgid
+
+ @staticmethod
+ def _user_group_list(cldbid):
+ server = Teamspeak3Manager.__get_created_server()
+ groups = server.send_command('servergroupsbyclientid', {'cldbid': cldbid})
+ outlist = {}
+
+ if type(groups) == list:
+ for group in groups:
+ outlist[group['keys']['name']] = group['keys']['sgid']
+ elif type(groups) == dict:
+ outlist[groups['keys']['name']] = groups['keys']['sgid']
+
+ return outlist
+
+ @staticmethod
+ def _group_list():
+ server = Teamspeak3Manager.__get_created_server()
+ group_cache = server.send_command('servergrouplist')
+ outlist = {}
+ for group in group_cache:
+ outlist[group['keys']['name']] = group['keys']['sgid']
+ return outlist
+
+ @staticmethod
+ def _add_user_to_group(uid, groupname):
+ server = Teamspeak3Manager.__get_created_server()
+ server_groups = Teamspeak3Manager._group_list()
+ user_groups = Teamspeak3Manager._user_group_list(uid)
+
+ if not groupname in server_groups:
+ Teamspeak3Manager._create_group(groupname)
+ if not groupname in user_groups:
+ server.send_command('servergroupaddclient',
+ {'sgid': Teamspeak3Manager._group_id_by_name(groupname), 'cldbid': uid})
+
+ @staticmethod
+ def _remove_user_from_group(uid, groupname):
+ server = Teamspeak3Manager.__get_created_server()
+ server_groups = Teamspeak3Manager._group_list()
+ user_groups = Teamspeak3Manager._user_group_list(uid)
+
+ if groupname in server_groups:
+ Teamspeak3Manager._create_group(groupname)
+ if groupname in user_groups:
+ server.send_command('servergroupdelclient',
+ {'sgid': Teamspeak3Manager._group_id_by_name(groupname), 'cldbid': uid})
+
+ @staticmethod
+ def add_user(username, corp_ticker):
+ username_clean = Teamspeak3Manager.__generate_username(Teamspeak3Manager.__santatize_username(username),
+ corp_ticker)
+ server = Teamspeak3Manager.__get_created_server()
+ token = ""
+
+ server_groups = Teamspeak3Manager._group_list()
+ if not settings.DEFAULT_ALLIANCE_GROUP in server_groups:
+ Teamspeak3Manager._create_group(settings.DEFAULT_ALLIANCE_GROUP)
+
+ alliange_group_id = Teamspeak3Manager._group_id_by_name(settings.DEFAULT_ALLIANCE_GROUP)
+
+ ret = server.send_command('tokenadd', {'tokentype': 0, 'tokenid1': alliange_group_id, 'tokenid2': 0,
+ 'tokendescription': username_clean,
+ 'tokencustomset': "ident=sso_uid value=%s" % username_clean})
+
+ try:
+ if 'keys' in ret:
+ if 'token' in ret['keys']:
+ token = ret['keys']['token']
+ except:
+ pass
+
+ return username_clean, token
+
+ @staticmethod
+ def add_blue_user(username, corp_ticker):
+ username_clean = Teamspeak3Manager.__generate_username_blue(Teamspeak3Manager.__santatize_username(username),
+ corp_ticker)
+ server = Teamspeak3Manager.__get_created_server()
+ token = ""
+
+ server_groups = Teamspeak3Manager._group_list()
+ if not settings.DEFAULT_BLUE_GROUP in server_groups:
+ Teamspeak3Manager._create_group(settings.DEFAULT_BLUE_GROUP)
+
+ blue_group_id = Teamspeak3Manager._group_id_by_name(settings.DEFAULT_BLUE_GROUP)
+
+ ret = server.send_command('tokenadd', {'tokentype': 0, 'tokenid1': blue_group_id, 'tokenid2': 0,
+ 'tokendescription': username_clean,
+ 'tokencustomset': "ident=sso_uid value=%s" % username_clean})
+
+ try:
+ if 'keys' in ret:
+ if 'token' in ret['keys']:
+ token = ret['keys']['token']
+
+ except:
+ pass
+
+ return username_clean, token
+
+ @staticmethod
+ def delete_user(uid):
+ server = Teamspeak3Manager.__get_created_server()
+ user = Teamspeak3Manager._get_userid(uid)
+ if user:
+ for client in server.send_command('clientlist'):
+ if client['keys']['client_database_id'] == user:
+ server.send_command('clientkick', {'clid': client['keys']['clid'], 'reasonid': 5,
+ 'reasonmsg': 'Auth service deleted'})
+
+ ret = server.send_command('clientdbdelete', {'cldbid': user})
+ if ret == '0':
+ return True
+ else:
+ return True
+
+ @staticmethod
+ def check_user_exists(uid):
+ if Teamspeak3Manager._get_userid(uid):
+ return True
+
+ return False
+
+ @staticmethod
+ def generate_new_permissionkey(uid, username, corpticker):
+ Teamspeak3Manager.delete_user(uid)
+ return Teamspeak3Manager.add_user(username, corpticker)
+
+ @staticmethod
+ def generate_new_blue_permissionkey(uid, username, corpticker):
+ Teamspeak3Manager.delete_user(uid)
+ return Teamspeak3Manager.add_blue_user(username, corpticker)
+
+ @staticmethod
+ def update_groups(uid, groups):
+ userid = Teamspeak3Manager._get_userid(uid)
+ if userid:
+ server_groups = Teamspeak3Manager._group_list()
+ user_groups = set(Teamspeak3Manager._user_group_list(userid))
+ act_groups = set([g.replace(' ', '-') for g in groups])
+ addgroups = act_groups - user_groups
+ remgroups = user_groups - act_groups
+
+ print userid
+ print addgroups
+ print remgroups
+
+ for g in addgroups:
+ if not g in server_groups.keys():
+ Teamspeak3Manager._create_group(g)
+ Teamspeak3Manager._add_user_to_group(userid, g)
+
+ for g in remgroups:
+ Teamspeak3Manager._remove_user_from_group(userid, g)
+
diff --git a/services/managers/util/__init__.py b/services/managers/util/__init__.py
new file mode 100755
index 00000000..8fdaf87a
--- /dev/null
+++ b/services/managers/util/__init__.py
@@ -0,0 +1 @@
+__author__ = 'r4stl1n'
diff --git a/services/managers/util/ts3.py b/services/managers/util/ts3.py
new file mode 100755
index 00000000..9b1c55fb
--- /dev/null
+++ b/services/managers/util/ts3.py
@@ -0,0 +1,244 @@
+import socket
+import logging
+
+
+class ConnectionError():
+ def __init__(self, ip, port):
+ self.ip = ip
+ self.port = port
+
+ def __str__(self):
+ return 'Error connecting to host %s port %s' % (self.ip, self.port)
+
+
+ts3_escape = {'/': r"\/",
+ ' ': r'\s',
+ '|': r'\p',
+ "\a": r'\a',
+ "\b": r'\b',
+ "\f": r'\f',
+ "\n": r'\n',
+ "\r": r'\r',
+ "\t": r'\t',
+ "\v": r'\v'}
+
+
+class TS3Proto():
+ bytesin = 0
+ bytesout = 0
+
+ _connected = False
+
+ def __init__(self):
+ self._log = logging.getLogger('%s.%s' % (__name__, self.__class__.__name__))
+ pass
+
+ def connect(self, ip, port):
+ s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
+ try:
+ s.connect((ip, port))
+ except:
+ # raise ConnectionError(ip, port)
+ raise
+ else:
+ self._sock = s
+ self._sockfile = s.makefile('r', 0)
+
+ data = self._sockfile.readline()
+ if data.strip() == "TS3":
+ self._sockfile.readline()
+ self._connected = True
+ return True
+
+ def disconnect(self):
+ self.send_command("quit")
+ self._sock.close()
+ self._sock = None
+ self._connected = False
+ self._log.info('Disconnected')
+
+ def send_command(self, command, keys=None, opts=None):
+ cmd = self.construct_command(command, keys=keys, opts=opts)
+ self.send('%s\n' % cmd)
+
+ data = []
+
+ while True:
+ resp = self._sockfile.readline()
+ resp = self.parse_command(resp)
+ if not 'command' in resp:
+ data.append(resp)
+ else:
+ break
+
+ if resp['command'] == 'error':
+ if data and resp['keys']['id'] == '0':
+ if len(data) > 1:
+ return data
+ else:
+ return data[0]
+ else:
+ return resp['keys']['id']
+
+ def construct_command(self, command, keys=None, opts=None):
+ """
+ Constructs a TS3 formatted command string
+ Keys can have a single nested list to construct a nested parameter
+ @param command: Command list
+ @type command: string
+ @param keys: Key/Value pairs
+ @type keys: dict
+ @param opts: Options
+ @type opts: list
+ """
+
+ cstr = [command]
+
+ # Add the keys and values, escape as needed
+ if keys:
+ for key in keys:
+ if isinstance(keys[key], list):
+ ncstr = []
+ for nest in keys[key]:
+ ncstr.append("%s=%s" % (key, self._escape_str(nest)))
+ cstr.append("|".join(ncstr))
+ else:
+ cstr.append("%s=%s" % (key, self._escape_str(keys[key])))
+
+ # Add in options
+ if opts:
+ for opt in opts:
+ cstr.append("-%s" % opt)
+
+ return " ".join(cstr)
+
+ def parse_command(self, commandstr):
+ """
+ Parses a TS3 command string into command/keys/opts tuple
+ @param commandstr: Command string
+ @type commandstr: string
+ """
+
+ if len(commandstr.split('|')) > 1:
+ vals = []
+ for cmd in commandstr.split('|'):
+ vals.append(self.parse_command(cmd))
+ return vals
+
+ cmdlist = commandstr.strip().split(' ')
+ command = None
+ keys = {}
+ opts = []
+
+ for key in cmdlist:
+ v = key.strip().split('=')
+ if len(v) > 1:
+ # Key
+ if len > 2:
+ # Fix the stupidities in TS3 escaping
+ v = [v[0], '='.join(v[1:])]
+ key, value = v
+ keys[key] = self._unescape_str(value)
+ elif v[0][0] == '-':
+ # Option
+ opts.append(v[0][1:])
+ else:
+ command = v[0]
+
+ d = {'keys': keys, 'opts': opts}
+ if command:
+ d['command'] = command
+ return d
+
+ @staticmethod
+ def _escape_str(value):
+ """
+ Escape a value into a TS3 compatible string
+ @param value: Value
+ @type value: string/int
+ """
+
+ if isinstance(value, int): return "%d" % value
+ value = value.replace("\\", r'\\')
+ for i, j in ts3_escape.iteritems():
+ value = value.replace(i, j)
+ return value
+
+ @staticmethod
+ def _unescape_str(value):
+ """
+ Unescape a TS3 compatible string into a normal string
+ @param value: Value
+ @type value: string/int
+ """
+
+ if isinstance(value, int): return "%d" % value
+ value = value.replace(r"\\", "\\")
+ for i, j in ts3_escape.iteritems():
+ value = value.replace(j, i)
+ return value
+
+
+ def send(self, payload):
+ if self._connected:
+ self._log.debug('Sent: %s' % payload)
+ self._sockfile.write(payload)
+
+
+class TS3Server(TS3Proto):
+ def __init__(self, ip, port, id=0, sock=None):
+ """
+ Abstraction class for TS3 Servers
+ @param ip: IP Address
+ @type ip: str
+ @param port: Port Number
+ @type port: int
+ """
+ TS3Proto.__init__(self)
+
+ if not sock:
+ if self.connect(ip, port) and id > 0:
+ self.use(id)
+ else:
+ self._sock = sock
+ self._sockfile = sock.makefile('r', 0)
+ self._connected = True
+
+ def login(self, username, password):
+ """
+ Login to the TS3 Server
+ @param username: Username
+ @type username: str
+ @param password: Password
+ @type password: str
+ """
+ d = self.send_command('login', keys={'client_login_name': username, 'client_login_password': password})
+ if d == 0:
+ self._log.info('Login Successful')
+ return True
+ return False
+
+ def serverlist(self):
+ """
+ Get a list of all Virtual Servers on the connected TS3 instance
+ """
+ if self._connected:
+ return self.send_command('serverlist')
+
+ def gm(self, msg):
+ """
+ Send a global message to the current Virtual Server
+ @param msg: Message
+ @type ip: str
+ """
+ if self._connected:
+ return self.send_command('gm', keys={'msg': msg})
+
+ def use(self, id):
+ """
+ Use a particular Virtual Server instance
+ @param id: Virtual Server ID
+ @type id: int
+ """
+ if self._connected and id > 0:
+ self.send_command('use', keys={'sid': id})
\ No newline at end of file
diff --git a/services/views.py b/services/views.py
index 64e35eb0..26e1e775 100755
--- a/services/views.py
+++ b/services/views.py
@@ -3,23 +3,25 @@ from django.shortcuts import HttpResponseRedirect
from django.shortcuts import render_to_response
from django.contrib.auth.decorators import login_required
from django.contrib.auth.decorators import permission_required
+from django.contrib.auth.decorators import user_passes_test
from managers.openfire_manager import OpenfireManager
from managers.phpbb3_manager import Phpbb3Manager
from managers.mumble_manager import MumbleManager
from managers.ipboard_manager import IPBoardManager
+from managers.teamspeak3_manager import Teamspeak3Manager
from authentication.managers import AuthServicesInfoManager
from eveonline.managers import EveManager
from celerytask.tasks import update_jabber_groups
from celerytask.tasks import update_mumble_groups
from celerytask.tasks import update_forum_groups
from celerytask.tasks import update_ipboard_groups
+from celerytask.tasks import update_teamspeak3_groups
from forms import JabberBroadcastForm
from forms import FleetFormatterForm
-from django.contrib.auth.decorators import user_passes_test
-
from util import check_if_user_has_permission
+
@login_required
def fleet_formatter_view(request):
if request.method == 'POST':
@@ -150,7 +152,6 @@ def reset_ipboard_password(request):
return HttpResponseRedirect("/dashboard")
-
@login_required
@user_passes_test(service_blue_alliance_test)
def activate_jabber(request):
@@ -228,3 +229,55 @@ def reset_mumble_password(request):
AuthServicesInfoManager.update_user_mumble_info(authinfo.mumble_username, result, request.user)
return HttpResponseRedirect("/services/")
return HttpResponseRedirect("/")
+
+
+@login_required
+@user_passes_test(service_blue_alliance_test)
+def activate_teamspeak3(request):
+ authinfo = AuthServicesInfoManager.get_auth_service_info(request.user)
+ character = EveManager.get_character_by_id(authinfo.main_char_id)
+ if check_if_user_has_permission(request.user, "blue_member"):
+ result = Teamspeak3Manager.add_blue_user(character.character_name, character.corporation_ticker)
+ else:
+ result = Teamspeak3Manager.add_user(character.character_name, character.corporation_ticker)
+
+ # if its empty we failed
+ if result[0] is not "":
+ AuthServicesInfoManager.update_user_teamspeak3_info(result[0], result[1], request.user)
+ update_teamspeak3_groups(request.user)
+ return HttpResponseRedirect("/services/")
+ return HttpResponseRedirect("/dashboard")
+
+
+@login_required
+@user_passes_test(service_blue_alliance_test)
+def deactivate_teamspeak3(request):
+ authinfo = AuthServicesInfoManager.get_auth_service_info(request.user)
+ result = Teamspeak3Manager.delete_user(authinfo.teamspeak3_uid)
+ # if false we failed
+ if result:
+ AuthServicesInfoManager.update_user_teamspeak3_info("", "", request.user)
+ return HttpResponseRedirect("/services/")
+ return HttpResponseRedirect("/")
+
+
+@login_required
+@user_passes_test(service_blue_alliance_test)
+def reset_teamspeak3_perm(request):
+ authinfo = AuthServicesInfoManager.get_auth_service_info(request.user)
+ character = EveManager.get_character_by_id(authinfo.main_char_id)
+
+ Teamspeak3Manager.delete_user(authinfo.teamspeak3_uid)
+
+ if check_if_user_has_permission(request.user, "blue_member"):
+ result = Teamspeak3Manager.generate_new_blue_permissionkey(authinfo.teamspeak3_uid, character.character_name,
+ character.corporation_ticker)
+ else:
+ result = Teamspeak3Manager.generate_new_permissionkey(authinfo.teamspeak3_uid, character.character_name,
+ character.corporation_ticker)
+
+ # if blank we failed
+ if result != "":
+ AuthServicesInfoManager.update_user_teamspeak3_info(result[0], result[1], request.user)
+ return HttpResponseRedirect("/services/")
+ return HttpResponseRedirect("/")
\ No newline at end of file
diff --git a/templates/registered/services.html b/templates/registered/services.html
index 1e784aab..240ef538 100755
--- a/templates/registered/services.html
+++ b/templates/registered/services.html
@@ -8,171 +8,63 @@
{% block content %}
-
- {% if perms.auth.blue_member %}
-
-
- Service |
- Username |
- Password |
- Domain |
- Action |
-
- {% if ENABLE_BLUE_FORUM %}
- Forums |
- {{ authinfo.forum_username }} |
- {{ authinfo.forum_password }} |
- {{ FORUM_URL }} |
-
- {% ifequal authinfo.forum_username "" %}
-
+
+ {% if perms.auth.blue_member %}
+
+
+ Service |
+ Username |
+ Password |
+ Domain |
+ Action |
+
+ {% if ENABLE_BLUE_FORUM %}
+ Forums |
+ {{ authinfo.forum_username }} |
+ {{ authinfo.forum_password }} |
+ {{ FORUM_URL }} |
+
+ {% ifequal authinfo.forum_username "" %}
+
-
- {% else %}
-
+ class="glyphicon glyphicon-ok">
+
+ {% else %}
+
-
-
+ class="glyphicon glyphicon-refresh">
+
+
-
- {% endifequal %}
- |
- {% endif %}
- {% if ENABLE_BLUE_IPBOARD %}
- IPBoard Forums |
- {{ authinfo.ipboard_username }} |
- {{ authinfo.ipboard_password }} |
- {{ FORUM_URL }} |
-
- {% ifequal authinfo.ipboard_username "" %}
-
+ class="glyphicon glyphicon-remove">
+
+ {% endifequal %}
+ |
+ {% endif %}
+ {% if ENABLE_BLUE_IPBOARD %}
+ IPBoard Forums |
+ {{ authinfo.ipboard_username }} |
+ {{ authinfo.ipboard_password }} |
+ {{ FORUM_URL }} |
+
+ {% ifequal authinfo.ipboard_username "" %}
+
-
- {% else %}
-
+ class="glyphicon glyphicon-ok">
+
+ {% else %}
+
-
-
+ class="glyphicon glyphicon-refresh">
+
+
-
- {% endifequal %}
- |
- {% endif %}
- {% if ENABLE_BLUE_JABBER %}
-
- Jabber |
- {{ authinfo.jabber_username }} |
- {{ authinfo.jabber_password }} |
- {{ JABBER_URL }} |
-
- {% ifequal authinfo.jabber_username "" %}
-
-
-
- {% else %}
-
-
-
-
-
-
- {% endifequal %}
- |
-
- {% endif %}
- {% if ENABLE_BLUE_MUMBLE %}
-
- Mumble |
- {{ authinfo.mumble_username }} |
- {{ authinfo.mumble_password }} |
- {{ MUMBLE_URL }} |
-
- {% ifequal authinfo.mumble_username "" %}
-
-
-
- {% else %}
-
-
-
-
-
-
- {% endifequal %}
- |
-
- {% endif %}
-
- {% elif perms.auth.alliance_member %}
-
-
- Service |
- Username |
- Password |
- Domain |
- Action |
-
- {% if ENABLE_ALLIANCE_FORUM %}
-
- Forums |
- {{ authinfo.forum_username }} |
- {{ authinfo.forum_password }} |
- {{ FORUM_URL }} |
-
- {% ifequal authinfo.forum_username "" %}
-
-
-
- {% else %}
-
-
-
-
-
-
- {% endifequal %}
- |
-
- {% endif %}
- {% if ENABLE_ALLIANCE_IPBOARD %}
- IPBoard Forums |
- {{ authinfo.ipboard_username }} |
- {{ authinfo.ipboard_password }} |
- {{ FORUM_URL }} |
-
- {% ifequal authinfo.ipboard_username "" %}
-
-
-
- {% else %}
-
-
-
-
-
-
- {% endifequal %}
- |
- {% endif %}
- {% if ENABLE_ALLIANCE_JABBER %}
+ class="glyphicon glyphicon-remove">
+
+ {% endifequal %}
+
+ {% endif %}
+ {% if ENABLE_BLUE_JABBER %}
Jabber |
{{ authinfo.jabber_username }} |
@@ -196,8 +88,8 @@
{% endifequal %}
- {% endif %}
- {% if ENABLE_ALLIANCE_MUMBLE %}
+ {% endif %}
+ {% if ENABLE_BLUE_MUMBLE %}
Mumble |
{{ authinfo.mumble_username }} |
@@ -221,11 +113,195 @@
{% endifequal %}
- {% endif %}
-
- {% else %}
- You are not in the alliance
- {% endif %}
+ {% endif %}
+ {% if ENABLE_BLUE_TEAMSPEAK3 %}
+ |
+ Service |
+ Unique ID |
+ PermissionKey |
+ Quick Link |
+ Action |
+
+
+ Teamspeak 3 |
+ {{ authinfo.teamspeak3_uid }} |
+ {{ authinfo.teamspeak3_perm_key }} |
+
+ {% ifequal authinfo.teamspeak3_uid "" %}
+ {% else %}
+ Teamspeak3
+ Link
+ {% endifequal %}
+ |
+
+ {% ifequal authinfo.teamspeak3_uid "" %}
+
+
+
+ {% else %}
+
+
+
+
+
+
+ {% endifequal %}
+ |
+
+ {% endif %}
+
+ {% elif perms.auth.alliance_member %}
+
+
+ Service |
+ Username |
+ Password |
+ Domain |
+ Action |
+
+ {% if ENABLE_ALLIANCE_FORUM %}
+
+ Forums |
+ {{ authinfo.forum_username }} |
+ {{ authinfo.forum_password }} |
+ {{ FORUM_URL }} |
+
+ {% ifequal authinfo.forum_username "" %}
+
+
+
+ {% else %}
+
+
+
+
+
+
+ {% endifequal %}
+ |
+
+ {% endif %}
+ {% if ENABLE_ALLIANCE_IPBOARD %}
+ IPBoard Forums |
+ {{ authinfo.ipboard_username }} |
+ {{ authinfo.ipboard_password }} |
+ {{ FORUM_URL }} |
+
+ {% ifequal authinfo.ipboard_username "" %}
+
+
+
+ {% else %}
+
+
+
+
+
+
+ {% endifequal %}
+ |
+ {% endif %}
+ {% if ENABLE_ALLIANCE_JABBER %}
+
+ Jabber |
+ {{ authinfo.jabber_username }} |
+ {{ authinfo.jabber_password }} |
+ {{ JABBER_URL }} |
+
+ {% ifequal authinfo.jabber_username "" %}
+
+
+
+ {% else %}
+
+
+
+
+
+
+ {% endifequal %}
+ |
+
+ {% endif %}
+ {% if ENABLE_ALLIANCE_MUMBLE %}
+
+ Mumble |
+ {{ authinfo.mumble_username }} |
+ {{ authinfo.mumble_password }} |
+ {{ MUMBLE_URL }} |
+
+ {% ifequal authinfo.mumble_username "" %}
+
+
+
+ {% else %}
+
+
+
+
+
+
+ {% endifequal %}
+ |
+
+ {% endif %}
+ {% if ENABLE_ALLIANCE_TEAMSPEAK3 %}
+
+ Service |
+ Unique ID |
+ PermissionKey |
+ Quick Link |
+ Action |
+
+
+ Teamspeak 3 |
+ {{ authinfo.teamspeak3_uid }} |
+ {{ authinfo.teamspeak3_perm_key }} |
+
+ {% ifequal authinfo.teamspeak3_uid "" %}
+ {% else %}
+ Teamspeak3
+ Link
+ {% endifequal %}
+ |
+
+ {% ifequal authinfo.teamspeak3_uid "" %}
+
+
+
+ {% else %}
+
+
+
+
+
+
+ {% endifequal %}
+ |
+
+ {% endif %}
+
+ {% else %}
+
You are not in the alliance
+ {% endif %}
{% endblock content %}
diff --git a/util/common_task.py b/util/common_task.py
index 733c78f2..5c613447 100755
--- a/util/common_task.py
+++ b/util/common_task.py
@@ -6,6 +6,7 @@ from services.managers.openfire_manager import OpenfireManager
from services.managers.phpbb3_manager import Phpbb3Manager
from services.managers.mumble_manager import MumbleManager
from services.managers.ipboard_manager import IPBoardManager
+from services.managers.teamspeak3_manager import Teamspeak3Manager
def add_user_to_group(user, groupname):
@@ -37,6 +38,9 @@ def deactivate_services(user):
if authinfo.ipboard_username and authinfo.ipboard_username != "":
IPBoardManager.disable_user(authinfo.ipboard_username)
AuthServicesInfoManager.update_user_forum_info("", "", user)
+ if authinfo.teamspeak3_uid and authinfo.teamspeak3_uid != "":
+ Teamspeak3Manager.delete_user(authinfo.teamspeak3_uid)
+ AuthServicesInfoManager.update_user_teamspeak3_info("", "", user)
def generate_corp_group_name(corpname):
diff --git a/util/context_processors.py b/util/context_processors.py
index 1792a233..c3b1689e 100755
--- a/util/context_processors.py
+++ b/util/context_processors.py
@@ -21,9 +21,12 @@ def domain_url(request):
'ENABLE_ALLIANCE_JABBER': settings.ENABLE_ALLIANCE_JABBER,
'ENABLE_ALLIANCE_MUMBLE': settings.ENABLE_ALLIANCE_MUMBLE,
'ENABLE_ALLIANCE_IPBOARD': settings.ENABLE_ALLIANCE_IPBOARD,
+ 'ENABLE_ALLIANCE_TEAMSPEAK3': settings.ENABLE_ALLIANCE_TEAMSPEAK3,
'ENABLE_BLUE_JABBER': settings.ENABLE_BLUE_JABBER,
'ENABLE_BLUE_FORUM': settings.ENABLE_BLUE_FORUM,
'ENABLE_BLUE_MUMBLE': settings.ENABLE_BLUE_MUMBLE,
'ENABLE_BLUE_IPBOARD': settings.ENABLE_BLUE_IPBOARD,
+ 'ENABLE_BLUE_TEAMSPEAK3': settings.ENABLE_BLUE_TEAMSPEAK3,
+ 'TEAMSPEAK3_PUBLIC_URL': settings.TEAMSPEAK3_PUBLIC_URL,
'JACK_KNIFE_URL': settings.JACK_KNIFE_URL,
'CURRENT_UTC_TIME': timezone.now()}
\ No newline at end of file