import os os.chdir(os.path.abspath(os.path.split(__file__)[0])) activate_this = os.path.join(os.path.split(__file__)[0], 'venv', 'bin', 'activate_this.py') execfile(activate_this, dict(__file__=activate_this)) import ts3 from datetime import datetime, timedelta from app import app, db, models def idle_mover(server, cfg): exempt_cids = [] permid_response = server.send_command('permidgetbyname', keys={'permsid': 'i_channel_needed_join_power'}) if permid_response.is_successful: join_permid = permid_response.data[0]['permid'] def exempt_check(cid): # check flags flag_response = server.send_command('channelinfo', keys={'cid': cid}) if flag_response.is_successful: if flag_response.data[0]['channel_needed_talk_power'] != '0': return True permid_response = server.send_command('channelpermlist', keys={'cid': cid}) if permid_response.is_successful: for perm in permid_response.data: if perm['permid'] == join_permid and perm['permvalue'] != '0': return True return False list_response = server.send_command('channellist') if list_response.is_successful: for channel in list_response.data: if exempt_check(channel['cid']): exempt_cids.append(channel['cid']) # get destination response = server.send_command('channelfind', keys={'pattern': 'AFK'}) if response.is_successful: afk_channel = response.data[0] # Get list of clients clientlist = server.send_command('clientlist', opts=['times']).data for client in clientlist: clientinfo = server.send_command('clientinfo', {'clid':client['clid']}) if clientinfo.is_successful: client['client_unique_identifier'] = clientinfo.data[0]['client_unique_identifier'] else: raise UserWarning('Could not find the clientinfo for %s' % client['clid']) # move idlers to afk channel for client in clientlist: if( int(client['client_idle_time']) > cfg['TS3_MAX_IDLETIME']): if client['cid'] not in exempt_cids: # Have TeamSpeak move AFK user to appropriate channel server.send_command('clientmove', keys={'clid': client['clid'], 'cid': afk_channel['cid']}) def store_active_data(server, cfg): # Get exempt channels (AFK, passworded, join powers) exempt_cids = [] permid_response = server.send_command('permidgetbyname', keys={'permsid': 'i_channel_needed_join_power'}) if permid_response.is_successful: join_permid = permid_response.data[0]['permid'] def exempt_check(cid): # Check flags flag_response = server.send_command('channelinfo', keys={'cid': cid}) if flag_response.is_successful: if flag_response.data[0]['channel_flag_password'] != '0': return True if flag_response.data[0]['channel_needed_talk_power'] != '0': return True permid_response = server.send_command('channelpermlist', keys={'cid': cid}) if permid_response.is_successful: for perm in permid_response.data: if perm['permid'] == join_permid and perm['permvalue'] != '0': return True return False list_response = server.send_command('channellist') if list_response.is_successful: for channel in list_response.data: if exempt_check(channel['cid']): exempt_cids.append(channel['cid']) # Get list of clients clientlist = server.send_command('clientlist', opts=("country",)).data # Remove the server_query and afk/moderated clients clientlist = filter(lambda client: client['client_type'] == '0' and client['cid'] not in exempt_cids, clientlist) # Compile the important information clients = {} for client in clientlist: clientinfo = server.send_command('clientdbinfo', {'cldbid': client['client_database_id']}) if clientinfo.is_successful: clients[clientinfo.data[0]['client_unique_identifier']] = {'country': client['client_country']} else: raise UserWarning('Could not find the clientdbinfo for %s' % client['client_database_id']) # Update the data tsdata = models.TeamspeakData(clients) db.session.add(tsdata) db.session.commit() def process_ts3_events(server, cfg): # Get list of clients clientlist = server.clientlist() for clid, client in clientlist.iteritems(): clientinfo = server.send_command('clientinfo', {'clid':clid}) if clientinfo.is_successful: client['client_unique_identifier'] = clientinfo.data[0]['client_unique_identifier'] else: raise UserWarning('Could not find clientinfo for %s' % clid) # Process any active events for clid, client in clientlist.iteritems(): u = models.User.query.filter_by(teamspeak_id=client['client_unique_identifier']).first() e = models.Event.query.filter(models.Event.start_time <= datetime.utcnow(), models.Event.end_time > datetime.utcnow()).all() if u and e: for event in e: if client['cid'] in event.cids: event.add_participant(u) # Add channels for upcoming events e = models.Event.query.filter(models.Event.start_time >= datetime.utcnow(), \ models.Event.start_time <= (datetime.utcnow() + timedelta(minutes=60))).all() for event in e: if not event.cids: print("Adding channels for event {}".format(event.name)) event.create_channels() # Remove channels for expired events e = models.Event.query.filter(models.Event.start_time > (datetime.utcnow() - timedelta(hours=24)), \ models.Event.end_time < (datetime.utcnow() - timedelta(minutes=60))).all() for event in e: current_time = datetime.utcnow() remove_time = event.end_time + timedelta(minutes=60) warn_time = event.end_time + timedelta(minutes=30) time_left = remove_time - current_time message = "This event channel is temporary and will be removed in {} minutes.".format(divmod(time_left.days * 86400 + time_left.seconds, 60)[0]) if event.cids: if current_time > remove_time: print("Removing channels for event: {}".format(event.name)) event.remove_channels() elif current_time > warn_time: for cid in event.cids: clients = [client for client in clientlist.values() if int(client['cid']) == int(cid)] for client in clients: print("Warning {} about expired event {}".format(client['client_nickname'], event.name)) server.clientpoke(client['clid'], message) def award_idle_ts3_points(server, cfg): # Get exempt channels (AFK, passwords, join power) exempt_cids = [] permid_response = server.send_command('permidgetbyname', keys={'permsid': 'i_channel_needed_join_power'}) if permid_response.is_successful: join_permid = permid_response.data[0]['permid'] def exempt_check(cid): # Check flags flag_response = server.send_command('channelinfo', keys={'cid':cid}) if flag_response.is_successful: if flag_response.data[0]['channel_flag_password'] != '0': return True if flag_response.data[0]['channel_needed_talk_power'] !='0': return True permid_response = server.send_command('channelpermlist', keys={'cid': cid}) if permid_response.is_successful: for perm in permid_response.data: if perm['permid'] == join_permid and perm['permvalue'] != '0': return True return False list_response = server.send_command('channellist') if list_response.is_successful: for channel in list_response.data: if exempt_check(channel['cid']): exempt_cids.append(channel['cid']) # Get list of clients clientlist = server.clientlist() for clid, client in clientlist.iteritems(): clientinfo = server.send_command('clientinfo', {'clid': clid}) if clientinfo.is_successful: client['client_unique_identifier'] = clientinfo.data[0]['client_unique_identifier'] else: raise UserWarning('Could not find the clientinfo for %s' % clid) # Update the data active_users = set() for client in clientlist.values(): with open('clientlist.txt', 'ab') as f: f.write(client['client_nickname']+'\n\r\t'+\ client['client_unique_identifier']+'\n\r') if client['cid'] not in exempt_cids: doob = models.User.query.filter_by(teamspeak_id=client['client_unique_identifier']).first() if doob: doob.update_connection() active_users.add(doob) doobs = set(models.User.query.filter(models.User.ts3_starttime != None).all()) ''' print doobs, active_users for doob in doobs.intersection(active_users): print(doob.nickname) doob.finalize_connection() ''' if __name__ == "__main__": cfg = {} cfg = app.config server = ts3.TS3Server(cfg['TS3_HOST'], cfg['TS3_PORT']) server.login(cfg['TS3_USERNAME'], cfg['TS3_PASSWORD']) server.use(1) idle_mover(server, cfg) store_active_data(server, cfg) process_ts3_events(server, cfg) award_idle_ts3_points(server, cfg)