From 97f48129518ed507bd29280703fe79e74bf90536 Mon Sep 17 00:00:00 2001 From: nico Date: Wed, 11 Dec 2019 23:18:47 +0100 Subject: initial cleanup * split up main method into separate event handler + add CodeFactor to README + add flake8 and pytest github action --- .github/workflows/pythonapp.yml | 30 ++++++++++++++ README.md | 1 + TSGroupAssigner/group_assign.py | 89 ++++++++++++++++++++++------------------- 3 files changed, 79 insertions(+), 41 deletions(-) create mode 100644 .github/workflows/pythonapp.yml diff --git a/.github/workflows/pythonapp.yml b/.github/workflows/pythonapp.yml new file mode 100644 index 0000000..213ae39 --- /dev/null +++ b/.github/workflows/pythonapp.yml @@ -0,0 +1,30 @@ +name: Python application + +on: [push] + +jobs: + build: + + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v1 + - name: Set up Python 3.8 + uses: actions/setup-python@v1 + with: + python-version: 3.8 + - name: Install dependencies + run: | + python -m pip install --upgrade pip + pip install -r requirements.txt + - name: Lint with flake8 + run: | + pip install flake8 + # stop the build if there are Python syntax errors or undefined names + flake8 . --count --select=E9,F63,F7,F82 --show-source --statistics + # exit-zero treats all errors as warnings. The GitHub editor is 127 chars wide + flake8 . --count --exit-zero --max-complexity=10 --max-line-length=127 --statistics + - name: Test with pytest + run: | + pip install pytest + pytest diff --git a/README.md b/README.md index fbb4ee1..bd5729e 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,5 @@ # TeamSpeak GroupAssigner +[![CodeFactor](https://www.codefactor.io/repository/github/mightybroccoli/tsgroupassigner/badge)](https://www.codefactor.io/repository/github/mightybroccoli/tsgroupassigner) ## Overview TSGroupAssigner is a module which allows to automatically assign server groups to voice clients, if they connect within diff --git a/TSGroupAssigner/group_assign.py b/TSGroupAssigner/group_assign.py index 073ba45..f933129 100644 --- a/TSGroupAssigner/group_assign.py +++ b/TSGroupAssigner/group_assign.py @@ -85,10 +85,8 @@ class GroupAssigner: return True # if date range is exceeded shutdown gracefully - else: - # terminate possible open connections - logging.info('the current date exceeds the configured date range -- exiting') - self.__disconnect() + logging.info('the current date exceeds the configured date range -- exiting') + self.__disconnect() def __sleepstart(self): """ @@ -113,8 +111,51 @@ class GroupAssigner: time.sleep(remaindelta.seconds + 1) # if the date is too far back raise DateException + raise DateException('target date is too far in the future') + + def __notifycliententerview(self, data: dict): + # return all non voice clients without reasonid 0 + if data['client_type'] != '0' or data['reasonid'] != '0': + return + + # check if the current date is still eligible + self.__datecheck() + + cldbid = data['client_database_id'] + user_grps = data['client_servergroups'].split(sep=',') + + msg = '{client_nickname}:{client_database_id} connected - member of {client_servergroups}' + logging.debug(msg.format(**data)) + + # only try to add nonmembers to group + if str(self.gid) not in user_grps: + + try: + # Usage: servergroupaddclient sgid={groupID} cldbid={clientDBID} + # cmd = self.conn.servergroupaddclient(sgid=self.gid, cldbid=cldbid) + cmd = self.conn.clientdbinfo(cldbid=cldbid) + + if cmd.error['id'] != '0': + logging.error(cmd.data[0].decode("utf-8")) + + # log process + logging.info('{client_nickname}:{client_database_id} added to {gid}'.format(**data, gid=self.gid)) + + # log possible key errors while the teamspeak 5 client is not fully working + except KeyError as err: + logging.error([err, data]) + + def __eventhandler(self, event: str, data: dict): + """ + event handler which separates events to their specific handlers + """ + # client enter events + if event == "notifycliententerview": + self.__notifycliententerview(data) + + # all other events return to main else: - raise DateException('target date is too far in the future') + return def start(self): # eol to start process ahead of time @@ -145,39 +186,5 @@ class GroupAssigner: pass else: - # only parse entering clients info - if event.event == "notifycliententerview": - # is the event still eligible - self.__datecheck() - - # skip query clients -- query client = 1 , voice client = 0 - if event[0]['client_type'] == '0': - - # reasonid should be 0 not sure why though - if event[0]["reasonid"] == "0": - - cldbid = event.parsed[0]['client_database_id'] - user_grps = event.parsed[0]['client_servergroups'].split(sep=',') - - msg = '{client_nickname}:{client_database_id} connected - member of {client_servergroups}' - logging.debug(msg.format(**event[0])) - - # only try to add nonmembers to group - if str(self.gid) not in user_grps: - - # https://yat.qa/ressourcen/server-query-kommentare/ - # Usage: servergroupaddclient sgid={groupID} cldbid={clientDBID} - try: - cmd = self.conn.servergroupaddclient(sgid=self.gid, cldbid=cldbid) - - if cmd.error['id'] != '0': - logging.error(cmd.data[0].decode("utf-8")) - - # log process - msg = '{client_nickname}:{client_database_id} added to {gid}' - logging.info(msg.format(**event[0], gid=self.gid)) - - # log possible key errors while the teamspeak 5 client is not fully working - except KeyError: - logging.error(str(event.parsed)) - pass + # handle incoming events + self.__eventhandler(event.event, event.parsed[0]) -- cgit v1.2.3-18-g5258 From cb84351270041449ee8a8984758e7e3ef86ea590 Mon Sep 17 00:00:00 2001 From: nico Date: Thu, 12 Dec 2019 23:15:45 +0100 Subject: test code and small init corrections + added pytest test cases * fixed TSGroupAssigner module init file --- TSGroupAssigner/__init__.py | 3 ++- setup.py | 1 - tests/__init__.py | 0 tests/test_group_assign.py | 56 +++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 58 insertions(+), 2 deletions(-) create mode 100644 tests/__init__.py create mode 100644 tests/test_group_assign.py diff --git a/TSGroupAssigner/__init__.py b/TSGroupAssigner/__init__.py index a41cd05..04fc467 100644 --- a/TSGroupAssigner/__init__.py +++ b/TSGroupAssigner/__init__.py @@ -1,3 +1,4 @@ # -*- coding: utf-8 -*- -from TSGroupAssigner.group_assign import GroupAssigner +from .group_assign import GroupAssigner +from .group_assign import DateException diff --git a/setup.py b/setup.py index f296015..6136fdc 100644 --- a/setup.py +++ b/setup.py @@ -4,7 +4,6 @@ from setuptools import setup, find_packages with open("README.md", "r") as fh: long_description = fh.read() - setup( name='TSGroupAssigner', version='0.0.1', diff --git a/tests/__init__.py b/tests/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/tests/test_group_assign.py b/tests/test_group_assign.py new file mode 100644 index 0000000..1f86574 --- /dev/null +++ b/tests/test_group_assign.py @@ -0,0 +1,56 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +import datetime as dt + +import pytest + +from TSGroupAssigner import GroupAssigner, DateException + +# sample input +creds = { + 'host': 'localhost', + 'port': 10011, + 'user': 'serveradmin', + 'password': '5up3r_53cr37', + 'sid': 1, + 'gid': 24 +} + + +class TestGroupAssigner: + def test_missing_input(self): + """ + this should fail due to missing arguments + """ + with pytest.raises(TypeError): + GroupAssigner().start() + + def test_sleepstart_startdate(self): + # startdate is too far in the future sleepstart should produce a DateException + + # start date 3 days in the future + startdate = dt.date.today() + dt.timedelta(days=3) + duration = dt.timedelta() + + with pytest.raises(DateException): + GroupAssigner(date=startdate, delta=duration,**creds).start() + + def test_datecheck_enddate(self): + # this should produce a exit code 0 SystemExit as the end date is in the past + + # start date 2 days in the past + startdate = dt.date.today() + dt.timedelta(days=-2) + duration = dt.timedelta() + + with pytest.raises(SystemExit): + GroupAssigner(date=startdate, delta=duration,**creds).start() + + def test_connect_noconnection(self): + # connect should fail with ConnectionRefusedError + + # start date is today + startdate = dt.date.today() + duration = dt.timedelta() + + with pytest.raises(ConnectionRefusedError): + GroupAssigner(date=startdate, delta=duration,**creds).start() -- cgit v1.2.3-18-g5258 From 6f19f160ef0d2d72c1db35abcf03ee28a3982d7c Mon Sep 17 00:00:00 2001 From: nico Date: Thu, 12 Dec 2019 23:20:59 +0100 Subject: code fixup + add contextlib.suppress to further improve readability - remove unnecessary return from if clause * added back else case --- TSGroupAssigner/group_assign.py | 19 ++++++++----------- tests/test_group_assign.py | 5 ++--- 2 files changed, 10 insertions(+), 14 deletions(-) diff --git a/TSGroupAssigner/group_assign.py b/TSGroupAssigner/group_assign.py index f933129..9f43d35 100644 --- a/TSGroupAssigner/group_assign.py +++ b/TSGroupAssigner/group_assign.py @@ -4,6 +4,7 @@ import datetime as dt import logging import sys import time +from contextlib import suppress import ts3 @@ -97,7 +98,6 @@ class GroupAssigner: # start date already reached proceed if self.startdate <= now: logging.debug('start date is already reached -- not eligible to sleepstart continue') - return # if startdate within the next 24h proceed to sleepstart elif now >= self.startdate - dt.timedelta(days=1): @@ -110,8 +110,9 @@ class GroupAssigner: logging.debug('target date will be reached in {sec} seconds -- sleeping'.format(sec=remaindelta.seconds)) time.sleep(remaindelta.seconds + 1) - # if the date is too far back raise DateException - raise DateException('target date is too far in the future') + else: + # if the date is too far back raise DateException + raise DateException('target date is too far in the future') def __notifycliententerview(self, data: dict): # return all non voice clients without reasonid 0 @@ -177,14 +178,10 @@ class GroupAssigner: while True: self.conn.send_keepalive() - try: - # wait for an event to be thrown + # suppress TimeoutError exceptions + with suppress(ts3.query.TS3TimeoutError): + # wait for events event = self.conn.wait_for_event(timeout=60) - # process TeamSpeak Telnet timeout - except ts3.query.TS3TimeoutError: - pass - - else: - # handle incoming events + # handover event to eventhandler self.__eventhandler(event.event, event.parsed[0]) diff --git a/tests/test_group_assign.py b/tests/test_group_assign.py index 1f86574..c3529a0 100644 --- a/tests/test_group_assign.py +++ b/tests/test_group_assign.py @@ -19,9 +19,8 @@ creds = { class TestGroupAssigner: def test_missing_input(self): - """ - this should fail due to missing arguments - """ + # the main class is missing arguments and should fail with a TypeError + with pytest.raises(TypeError): GroupAssigner().start() -- cgit v1.2.3-18-g5258 From 9b964690e79b5a4366e43fde01c6594de693be4d Mon Sep 17 00:00:00 2001 From: nico Date: Thu, 19 Dec 2019 18:15:47 +0100 Subject: package finish up * update setup.py * better format the main __init__ file * move exceptions to separate file for maintainability * small corrections --- TSGroupAssigner/__init__.py | 8 +++++++- TSGroupAssigner/exceptions.py | 8 ++++++++ TSGroupAssigner/group_assign.py | 17 ++++++++--------- setup.py | 24 +++++++++++++++--------- tests/test_group_assign.py | 6 +++--- 5 files changed, 41 insertions(+), 22 deletions(-) create mode 100644 TSGroupAssigner/exceptions.py diff --git a/TSGroupAssigner/__init__.py b/TSGroupAssigner/__init__.py index 04fc467..e434073 100644 --- a/TSGroupAssigner/__init__.py +++ b/TSGroupAssigner/__init__.py @@ -1,4 +1,10 @@ # -*- coding: utf-8 -*- +# version +__version__ = "0.0.1" + +# modules from .group_assign import GroupAssigner -from .group_assign import DateException + +# utils +from .exceptions import DateException diff --git a/TSGroupAssigner/exceptions.py b/TSGroupAssigner/exceptions.py new file mode 100644 index 0000000..a0bb55b --- /dev/null +++ b/TSGroupAssigner/exceptions.py @@ -0,0 +1,8 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- + +__all__ = ['DateException'] + + +class DateException(Exception): + """Exceptions thrown if configured date is out of range""" diff --git a/TSGroupAssigner/group_assign.py b/TSGroupAssigner/group_assign.py index 9f43d35..1f9fdbb 100644 --- a/TSGroupAssigner/group_assign.py +++ b/TSGroupAssigner/group_assign.py @@ -8,9 +8,9 @@ from contextlib import suppress import ts3 +from .exceptions import DateException -class DateException(Exception): - """raise this if the date delta exceeds the configured range""" +__all__ = ['GroupAssigner'] class GroupAssigner: @@ -107,7 +107,7 @@ class GroupAssigner: # calculate remaining time delta remaindelta = starttime - now - logging.debug('target date will be reached in {sec} seconds -- sleeping'.format(sec=remaindelta.seconds)) + logging.debug(f'target date will be reached in {remaindelta.seconds} seconds -- sleeping') time.sleep(remaindelta.seconds + 1) else: @@ -119,9 +119,6 @@ class GroupAssigner: if data['client_type'] != '0' or data['reasonid'] != '0': return - # check if the current date is still eligible - self.__datecheck() - cldbid = data['client_database_id'] user_grps = data['client_servergroups'].split(sep=',') @@ -133,8 +130,7 @@ class GroupAssigner: try: # Usage: servergroupaddclient sgid={groupID} cldbid={clientDBID} - # cmd = self.conn.servergroupaddclient(sgid=self.gid, cldbid=cldbid) - cmd = self.conn.clientdbinfo(cldbid=cldbid) + cmd = self.conn.servergroupaddclient(sgid=self.gid, cldbid=cldbid) if cmd.error['id'] != '0': logging.error(cmd.data[0].decode("utf-8")) @@ -142,7 +138,7 @@ class GroupAssigner: # log process logging.info('{client_nickname}:{client_database_id} added to {gid}'.format(**data, gid=self.gid)) - # log possible key errors while the teamspeak 5 client is not fully working + # log possible key errors while the teamspeak 5 client is not fully released except KeyError as err: logging.error([err, data]) @@ -150,6 +146,9 @@ class GroupAssigner: """ event handler which separates events to their specific handlers """ + # check if event is still eligible + self.__datecheck() + # client enter events if event == "notifycliententerview": self.__notifycliententerview(data) diff --git a/setup.py b/setup.py index 6136fdc..3fbb8aa 100644 --- a/setup.py +++ b/setup.py @@ -1,25 +1,31 @@ # -*- coding: utf-8 -*- from setuptools import setup, find_packages +from TSGroupAssigner import __version__ + with open("README.md", "r") as fh: long_description = fh.read() setup( name='TSGroupAssigner', - version='0.0.1', - packages=find_packages(exclude=['tests', 'tests.*']), - keywords='automation TeamSpeak teamspeak ts3 ts3server ts', + version=__version__, url='https://github.com/mightyBroccoli/TSGroupAssigner', - license='GPLv3', author='nico wellpott', author_email='nico@magicbroccoli.de', - description='date based TeamSpeak Group Assigner', - long_description=long_description, - python_requires='>=3.7', classifiers=[ 'Programming Language :: Python :: 3', 'Intended Audience :: System Administrators', 'Operating System :: Unix', - 'License :: OSI Approved :: GNU General Public License v3 (GPLv3)' - ] + 'License :: OSI Approved :: GNU General Public License v3 (GPLv3)', + "Topic :: Communications", + "Topic :: Internet" + ], + license='GPLv3', + description='date based TeamSpeak Group Assigner', + long_description=long_description, + long_description_content_type='text/markdown', + keywords='automation TeamSpeak teamspeak ts3 ts3server ts', + install_requires='ts3>=1.0.11', + packages=find_packages(exclude=("tests",)), + python_requires='>=3.6' ) diff --git a/tests/test_group_assign.py b/tests/test_group_assign.py index c3529a0..150aa7b 100644 --- a/tests/test_group_assign.py +++ b/tests/test_group_assign.py @@ -32,7 +32,7 @@ class TestGroupAssigner: duration = dt.timedelta() with pytest.raises(DateException): - GroupAssigner(date=startdate, delta=duration,**creds).start() + GroupAssigner(date=startdate, delta=duration, **creds).start() def test_datecheck_enddate(self): # this should produce a exit code 0 SystemExit as the end date is in the past @@ -42,7 +42,7 @@ class TestGroupAssigner: duration = dt.timedelta() with pytest.raises(SystemExit): - GroupAssigner(date=startdate, delta=duration,**creds).start() + GroupAssigner(date=startdate, delta=duration, **creds).start() def test_connect_noconnection(self): # connect should fail with ConnectionRefusedError @@ -52,4 +52,4 @@ class TestGroupAssigner: duration = dt.timedelta() with pytest.raises(ConnectionRefusedError): - GroupAssigner(date=startdate, delta=duration,**creds).start() + GroupAssigner(date=startdate, delta=duration, **creds).start() -- cgit v1.2.3-18-g5258 From 43a03eaf920c1371d033feaf6679771b6c3016a5 Mon Sep 17 00:00:00 2001 From: nico Date: Sat, 21 Dec 2019 15:49:54 +0100 Subject: readability improvements * update function names to indicate what they are doing * update docstrings to their correct format --- TSGroupAssigner/group_assign.py | 78 ++++++++++++++++++----------------------- 1 file changed, 34 insertions(+), 44 deletions(-) diff --git a/TSGroupAssigner/group_assign.py b/TSGroupAssigner/group_assign.py index 1f9fdbb..c3ae371 100644 --- a/TSGroupAssigner/group_assign.py +++ b/TSGroupAssigner/group_assign.py @@ -33,30 +33,18 @@ class GroupAssigner: self.delta = delta def __connect(self): - """ - establish query connection and return connection handler - """ - try: - # connect to the telnet interface - self.conn = ts3.query.TS3Connection(self.host, self.port) + """ establish query connection and return connection handler """ + # connect to the telnet interface + self.conn = ts3.query.TS3Connection(self.host, self.port) - # login - self.conn.login(client_login_name=self.user, client_login_password=self.pw) + # login + self.conn.login(client_login_name=self.user, client_login_password=self.pw) - # select specified sid - self.conn.use(sid=self.sid) - - # break if credentials are invalid - except ts3.query.TS3QueryError as TS3QueryError: - # log error line and reraise - logging.error(TS3QueryError) - raise TS3QueryError + # select specified sid + self.conn.use(sid=self.sid) def __disconnect(self): - """ - method to gracefully logout and disconnect the connection - this should only be called if the exit is intentional - """ + """ gracefully logout and disconnect the connection, this should only be called if the exit is intentional """ try: self.conn.logout() self.conn.quit() @@ -67,17 +55,14 @@ class GroupAssigner: # broad exception if something unexpected happens except ts3.TS3Error as TS3Error: - # log error and reraise exception + # log exception logging.error(TS3Error) - raise TS3Error # exit sys.exit() - def __datecheck(self): - """ - method to check if the current date is still in the configured date range - """ + def __checkdate(self): + """ method to check if the current date is still in the configured date range """ now = dt.date.today() # check if target date is in the configured range @@ -89,10 +74,8 @@ class GroupAssigner: logging.info('the current date exceeds the configured date range -- exiting') self.__disconnect() - def __sleepstart(self): - """ - method to check if the process is eligible to sleepstart - """ + def __start_sleepstart(self): + """ method to check if the process is eligible to sleepstart """ now = dt.date.today() # start date already reached proceed @@ -115,6 +98,10 @@ class GroupAssigner: raise DateException('target date is too far in the future') def __notifycliententerview(self, data: dict): + """ + event thrown if a client connects to the server + :param data: dictionary containing users info + """ # return all non voice clients without reasonid 0 if data['client_type'] != '0' or data['reasonid'] != '0': return @@ -142,34 +129,37 @@ class GroupAssigner: except KeyError as err: logging.error([err, data]) - def __eventhandler(self, event: str, data: dict): - """ - event handler which separates events to their specific handlers - """ + def __handle_event(self, event: str, data: dict): + """ event handler which separates events to their specific handlers """ # check if event is still eligible - self.__datecheck() + self.__checkdate() # client enter events if event == "notifycliententerview": self.__notifycliententerview(data) - # all other events return to main - else: - return - def start(self): + """ main entry point to start the bot """ # eol to start process ahead of time - self.__sleepstart() + self.__start_sleepstart() # proceed only if target date is inside the date range - if self.__datecheck(): - # init connection - self.__connect() + if self.__checkdate(): + try: + # init connection + self.__connect() + + # break if credentials are invalid + except ts3.query.TS3QueryError as err: + # log error + logging.error(err) + self.__disconnect() # start processing self.__main() def __main(self): + """ bots main loop """ # register for "server" notify event self.conn.servernotifyregister(event="server") @@ -183,4 +173,4 @@ class GroupAssigner: event = self.conn.wait_for_event(timeout=60) # handover event to eventhandler - self.__eventhandler(event.event, event.parsed[0]) + self.__handle_event(event.event, event.parsed[0]) -- cgit v1.2.3-18-g5258 From a604e18853c3be192e439889b30a372f18740230 Mon Sep 17 00:00:00 2001 From: nico Date: Sun, 22 Dec 2019 04:05:41 +0100 Subject: setup is difficult * inversed checkdate to simplify * finished setup.py + add MANIFEST file --- MANIFEST.in | 3 +++ TSGroupAssigner/__init__.py | 2 +- TSGroupAssigner/group_assign.py | 45 ++++++++++++++++++++++------------------- setup.py | 28 +++++++++++++++++-------- 4 files changed, 48 insertions(+), 30 deletions(-) create mode 100644 MANIFEST.in diff --git a/MANIFEST.in b/MANIFEST.in new file mode 100644 index 0000000..4ac345f --- /dev/null +++ b/MANIFEST.in @@ -0,0 +1,3 @@ +include README.md +include LICENCE.md +include requirements.txt \ No newline at end of file diff --git a/TSGroupAssigner/__init__.py b/TSGroupAssigner/__init__.py index e434073..6feef67 100644 --- a/TSGroupAssigner/__init__.py +++ b/TSGroupAssigner/__init__.py @@ -1,7 +1,7 @@ # -*- coding: utf-8 -*- # version -__version__ = "0.0.1" +__version__ = "0.1" # modules from .group_assign import GroupAssigner diff --git a/TSGroupAssigner/group_assign.py b/TSGroupAssigner/group_assign.py index c3ae371..c39711d 100644 --- a/TSGroupAssigner/group_assign.py +++ b/TSGroupAssigner/group_assign.py @@ -21,16 +21,18 @@ class GroupAssigner: self.port = port self.user = user self.pw = password - self.sid = sid - # group + # server and group id + self.sid = sid self.gid = gid # start date and delta self.sleepstart = date - dt.timedelta(days=1) self.startdate = date self.enddate = date + delta - self.delta = delta + + # init connection handler + self.conn = None def __connect(self): """ establish query connection and return connection handler """ @@ -54,9 +56,9 @@ class GroupAssigner: pass # broad exception if something unexpected happens - except ts3.TS3Error as TS3Error: + except ts3.TS3Error as err: # log exception - logging.error(TS3Error) + logging.error(err) # exit sys.exit() @@ -65,15 +67,15 @@ class GroupAssigner: """ method to check if the current date is still in the configured date range """ now = dt.date.today() - # check if target date is in the configured range - if self.startdate <= now <= self.enddate: - logging.debug('target date within configured date range') - return True - + # check if still in the configured range + if not self.startdate <= now <= self.enddate: # if date range is exceeded shutdown gracefully logging.info('the current date exceeds the configured date range -- exiting') self.__disconnect() + # else continue + logging.debug('heartbeat - target date within configured date range') + def __start_sleepstart(self): """ method to check if the process is eligible to sleepstart """ now = dt.date.today() @@ -144,19 +146,20 @@ class GroupAssigner: self.__start_sleepstart() # proceed only if target date is inside the date range - if self.__checkdate(): - try: - # init connection - self.__connect() + self.__checkdate() + + try: + # init connection + self.__connect() - # break if credentials are invalid - except ts3.query.TS3QueryError as err: - # log error - logging.error(err) - self.__disconnect() + # break if credentials are invalid + except ts3.query.TS3QueryError as err: + # log error + logging.error(err) + self.__disconnect() - # start processing - self.__main() + # start processing + self.__main() def __main(self): """ bots main loop """ diff --git a/setup.py b/setup.py index 3fbb8aa..2bccdd9 100644 --- a/setup.py +++ b/setup.py @@ -3,6 +3,7 @@ from setuptools import setup, find_packages from TSGroupAssigner import __version__ +# long readme with open("README.md", "r") as fh: long_description = fh.read() @@ -13,19 +14,30 @@ setup( author='nico wellpott', author_email='nico@magicbroccoli.de', classifiers=[ - 'Programming Language :: Python :: 3', 'Intended Audience :: System Administrators', - 'Operating System :: Unix', + 'Natural Language :: English', 'License :: OSI Approved :: GNU General Public License v3 (GPLv3)', - "Topic :: Communications", - "Topic :: Internet" - ], + 'Operating System :: Unix', + 'Programming Language :: Python :: 3', + 'Programming Language :: Python :: 3.6', + 'Programming Language :: Python :: 3.7', + 'Programming Language :: Python :: 3.8', + 'Programming Language :: Python :: Implementation :: CPython', + 'Topic :: Communications', + 'Topic :: Internet' + ], license='GPLv3', description='date based TeamSpeak Group Assigner', long_description=long_description, long_description_content_type='text/markdown', keywords='automation TeamSpeak teamspeak ts3 ts3server ts', - install_requires='ts3>=1.0.11', - packages=find_packages(exclude=("tests",)), - python_requires='>=3.6' + install_requires=[ + 'ts3>=1.0.11,<2' + ], + packages=find_packages(exclude=('tests',)), + python_requires='>=3.6', + project_urls={ + 'Source': 'https://github.com/mightyBroccoli/TSGroupAssigner', + 'Issue-Tracker': 'https://github.com/mightyBroccoli/TSGroupAssigner/issues' + } ) -- cgit v1.2.3-18-g5258 From 3a25e6234e62574096379782622743d57d9a53ec Mon Sep 17 00:00:00 2001 From: nico Date: Sun, 22 Dec 2019 04:11:55 +0100 Subject: spelling * small spelling changes --- TSGroupAssigner/group_assign.py | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/TSGroupAssigner/group_assign.py b/TSGroupAssigner/group_assign.py index c39711d..589b820 100644 --- a/TSGroupAssigner/group_assign.py +++ b/TSGroupAssigner/group_assign.py @@ -69,9 +69,9 @@ class GroupAssigner: # check if still in the configured range if not self.startdate <= now <= self.enddate: - # if date range is exceeded shutdown gracefully - logging.info('the current date exceeds the configured date range -- exiting') - self.__disconnect() + # if date range is exceeded shutdown gracefully + logging.info('the current date exceeds the configured date range -- exiting') + self.__disconnect() # else continue logging.debug('heartbeat - target date within configured date range') @@ -116,6 +116,7 @@ class GroupAssigner: # only try to add nonmembers to group if str(self.gid) not in user_grps: + logging.debug(f'{data["client_nickname"]} is not member of {self.gid}') try: # Usage: servergroupaddclient sgid={groupID} cldbid={clientDBID} @@ -125,7 +126,7 @@ class GroupAssigner: logging.error(cmd.data[0].decode("utf-8")) # log process - logging.info('{client_nickname}:{client_database_id} added to {gid}'.format(**data, gid=self.gid)) + logging.info('add {client_nickname}:{client_database_id} to {gid}'.format(**data, gid=self.gid)) # log possible key errors while the teamspeak 5 client is not fully released except KeyError as err: @@ -154,7 +155,7 @@ class GroupAssigner: # break if credentials are invalid except ts3.query.TS3QueryError as err: - # log error + # log error and disconnect logging.error(err) self.__disconnect() @@ -162,7 +163,7 @@ class GroupAssigner: self.__main() def __main(self): - """ bots main loop """ + """ main loop """ # register for "server" notify event self.conn.servernotifyregister(event="server") -- cgit v1.2.3-18-g5258