Source code for sni.teamspeak.jobs

"""
Recurrent teamspeak jobs
"""

import logging
from typing import List

from ts3.query import TS3Connection, TS3QueryError

from sni.scheduler import scheduler
from sni.user.models import Group, User
from sni.conf import CONFIGURATION as conf
import sni.utils as utils

from .teamspeak import (
    cached_teamspeak_query,
    client_list,
    close_teamspeak_connection,
    ensure_group,
    new_teamspeak_connection,
)


[docs]@scheduler.scheduled_job("interval", minutes=30) def message_registered_clients_with_wrong_name(): """ Iterates through all users that are registered in Teamspeak, and checks their nickname. If it doesn't match, sends a message. """ connection = new_teamspeak_connection() for ts_client in client_list(connection): if ts_client.client_nickname.startswith(conf.teamspeak.bot_name): # TS client is probably the bot continue usr: User = User.objects( teamspeak_cldbid=ts_client.client_database_id ).first() if usr is None: # TS client is unknown continue tickered_name = usr.tickered_name if ts_client.client_nickname != tickered_name: logging.debug( "Wrong nickname found %s; should be %s", ts_client.client_nickname, tickered_name, ) message = ( f"Hello {ts_client.client_nickname}. " + "Please change your Teamspeak nickname to " + f'"{tickered_name}" (without the quotes). Thank you :)' + " -- SeAT Navy Issue Teamspeak Bot; This is an automated" + " message, please do not respond." ) utils.catch_all( connection.sendtextmessage, f"Failed to notify teamspeak user {ts_client.client_nickname}", kwargs={ "targetmode": 1, "target": ts_client.clid, "msg": message, }, ) close_teamspeak_connection(connection)
[docs]@scheduler.scheduled_job("interval", minutes=10) def map_teamspeak_groups(): """ Creates all groups on Teamspeak. """ connection = new_teamspeak_connection() for grp in Group.objects(map_to_teamspeak=True): logging.debug("Mapping group %s to Teamspeak", grp.group_name) tsgrp = ensure_group(connection, grp.group_name) grp.teamspeak_sgid = tsgrp.sgid grp.save() close_teamspeak_connection(connection)
[docs]@scheduler.scheduled_job("interval", minutes=10) def update_teamspeak_groups(): """ Updates group memberships on Teamspeak """ connection = new_teamspeak_connection() for grp in Group.objects(map_to_teamspeak=True, teamspeak_sgid__ne=None): logging.debug("Updating Teamspeak group %s", grp.group_name) current_cldbids: List[int] = [ int(raw["cldbid"]) for raw in cached_teamspeak_query( connection, TS3Connection.servergroupclientlist, 300, kwargs={"sgid": grp.teamspeak_sgid}, ) ] allowed_cldbids: List[int] = [ usr.teamspeak_cldbid for usr in grp.members if usr.teamspeak_cldbid is not None ] for cldbid in current_cldbids: if cldbid in allowed_cldbids: continue try: connection.servergroupdelclient( cldbid=cldbid, sgid=grp.teamspeak_sgid, ) except TS3QueryError as error: logging.error( "Could not remove client %d from Teamspeak group %s: %s", cldbid, grp.group_name, str(error), ) for cldbid in allowed_cldbids: if cldbid in current_cldbids: continue try: connection.servergroupaddclient( sgid=grp.teamspeak_sgid, cldbid=cldbid, ) except TS3QueryError as error: logging.error( "Could not add client %d to Teamspeak group %s: %s", cldbid, grp.group_name, str(error), ) close_teamspeak_connection(connection)