Skip to content
Merged
Show file tree
Hide file tree
Changes from 4 commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
20 changes: 20 additions & 0 deletions .github/workflows/black-formatter.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
name: Code Style

on:
push:
branches:
- master
pull_request:
schedule:
- cron: '0 12 * * 4'

jobs:
black_formatter:
name: Black Formatter
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3

- uses: psf/black@stable
with:
options: "--check --verbose"
186 changes: 101 additions & 85 deletions Events.py
Original file line number Diff line number Diff line change
Expand Up @@ -24,10 +24,17 @@ class EventType(Enum):
# client events ...
server_events = [EventType.SERVER_EDITED, EventType.CLIENT_ENTER, EventType.CLIENT_LEFT]
text_events = [EventType.TEXT_MESSAGE]
channel_events = [EventType.CLIENT_ENTER, EventType.CLIENT_LEFT, EventType.CLIENT_MOVED,
EventType.CHANNEL_DESC_CHANGED, EventType.CHANNEL_EDITED,
EventType.CHANNEL_CREATED, EventType.CHANNEL_MOVED,
EventType.CHANNEL_DELETED, EventType.CHANNEL_PASSWORD_CHANGED]
channel_events = [
EventType.CLIENT_ENTER,
EventType.CLIENT_LEFT,
EventType.CLIENT_MOVED,
EventType.CHANNEL_DESC_CHANGED,
EventType.CHANNEL_EDITED,
EventType.CHANNEL_CREATED,
EventType.CHANNEL_MOVED,
EventType.CHANNEL_DELETED,
EventType.CHANNEL_PASSWORD_CHANGED,
]


class ReasonID(IntEnum):
Expand All @@ -42,10 +49,11 @@ class ReasonID(IntEnum):
SERVER_SHUTDOWN = 11


class TS3Event():
class TS3Event:
"""
Event class for Teamspeak 3 events. This is a stub for all other events.
"""

event_type = EventType.UNKNOWN

def __init__(self, data, event_type=None):
Expand All @@ -70,7 +78,7 @@ def __getattr__(self, item):
return self._data[item]


class EventParser():
class EventParser:
@staticmethod
def parse_event(event, event_type):
"""
Expand All @@ -86,7 +94,7 @@ def parse_event(event, event_type):
parsed_event = TextMessageEvent(event)
return parsed_event
if EventType.CLIENT_MOVED.value == event_type:
if 'invokerid' in event:
if "invokerid" in event:
parsed_event = ClientMovedEvent(event)
else:
parsed_event = ClientMovedSelfEvent(event)
Expand All @@ -95,8 +103,10 @@ def parse_event(event, event_type):
parsed_event = ClientEnteredEvent(event)
return parsed_event
if EventType.CLIENT_LEFT.value == event_type:
reason_id = int(event.get("reasonid", '-1'))
if reason_id == int(ReasonID.SERVER_KICK) or reason_id == int(ReasonID.CHANNEL_KICK):
reason_id = int(event.get("reasonid", "-1"))
if reason_id == int(ReasonID.SERVER_KICK) or reason_id == int(
ReasonID.CHANNEL_KICK
):
parsed_event = ClientKickedEvent(event)
elif reason_id == int(ReasonID.BAN):
parsed_event = ClientBannedEvent(event)
Expand Down Expand Up @@ -169,12 +179,12 @@ class ChannelEditedEvent(TS3Event):

def __init__(self, data):
super().__init__(data)
self._channel_id = data.get('cid', '-1')
self._channel_topic = data.get('channel_topic', '')
self._invoker_id = data.get('invokerid', '-1')
self._invoker_name = data.get('invokername', '')
self._invoker_uid = data.get('invokeruid', '-1')
self._reason_id = data.get('reasonid', '-1')
self._channel_id = data.get("cid", "-1")
self._channel_topic = data.get("channel_topic", "")
self._invoker_id = data.get("invokerid", "-1")
self._invoker_name = data.get("invokername", "")
self._invoker_uid = data.get("invokeruid", "-1")
self._reason_id = data.get("reasonid", "-1")

@property
def channel_id(self):
Expand Down Expand Up @@ -206,12 +216,12 @@ class ChannelCreatedEvent(TS3Event):

def __init__(self, data):
super().__init__(data)
self._channel_id = data.get('cid', '-1')
self._channel_topic = data.get('channel_topic', '')
self._invoker_id = data.get('invokerid', '-1')
self._invoker_name = data.get('invokername', '')
self._invoker_uid = data.get('invokeruid', '-1')
self._reason_id = data.get('reasonid', '-1')
self._channel_id = data.get("cid", "-1")
self._channel_topic = data.get("channel_topic", "")
self._invoker_id = data.get("invokerid", "-1")
self._invoker_name = data.get("invokername", "")
self._invoker_uid = data.get("invokeruid", "-1")
self._reason_id = data.get("reasonid", "-1")

@property
def channel_id(self):
Expand All @@ -237,15 +247,16 @@ def invoker_uid(self):
def reason_id(self):
return self._reason_id


class ChannelDeletedEvent(TS3Event):
event_type = EventType.CHANNEL_DELETED

def __init__(self, data):
super().__init__(data)
self._channel_id = data.get('cid', '-1')
self._invoker_id = data.get('invokerid', '-1')
self._invoker_name = data.get('invokername', '')
self._invoker_uid = data.get('invokeruid', '-1')
self._channel_id = data.get("cid", "-1")
self._invoker_id = data.get("invokerid", "-1")
self._invoker_name = data.get("invokername", "")
self._invoker_uid = data.get("invokeruid", "-1")

@property
def channel_id(self):
Expand All @@ -263,23 +274,24 @@ def invoker_name(self):
def invoker_uid(self):
return self._invoker_uid


class ChannelMovedEvent(TS3Event):
event_type = EventType.CHANNEL_MOVED

def __init__(self, data):
super().__init__(data)
self._cid = data.get('cid', '-1')
self._cpid = data.get('cpid', '-1')
self._order = data.get('order', '-1')
self._reasonid = data.get('reasonid', '-1')
self._invoker_id = data.get('invokerid', '-1')
self._invoker_name = data.get('invokername', '')
self._invoker_uid = data.get('invokeruid', '-1')
self._cid = data.get("cid", "-1")
self._cpid = data.get("cpid", "-1")
self._order = data.get("order", "-1")
self._reasonid = data.get("reasonid", "-1")
self._invoker_id = data.get("invokerid", "-1")
self._invoker_name = data.get("invokername", "")
self._invoker_uid = data.get("invokeruid", "-1")

@property
def channel_id(self):
return self._cid

@property
def channel_pid(self):
return self._cpid
Expand All @@ -304,23 +316,25 @@ def invoker_name(self):
def invoker_uid(self):
return self._invoker_uid


class ChannelDescriptionEditedEvent(TS3Event):
event_type = EventType.CHANNEL_DESC_CHANGED

def __init__(self, data):
super().__init__(data)
self._channel_id = int(data.get('cid', '-1'))
self._channel_id = int(data.get("cid", "-1"))

@property
def channel_id(self):
return self._channel_id


class ChannelPasswordChangedEvent(TS3Event):
event_type = EventType.CHANNEL_PASSWORD_CHANGED

def __init__(self, data):
super().__init__(data)
self._channel_id = int(data.get('cid', '-1'))
self._channel_id = int(data.get("cid", "-1"))

@property
def channel_id(self):
Expand All @@ -333,25 +347,27 @@ class ClientEnteredEvent(TS3Event):
def __init__(self, data):
super().__init__(data)
try:
self._client_id = int(data.get('clid', '-1'))
self._client_name = data.get('client_nickname', '')
self._client_uid = data.get('client_unique_identifier', '')
self._client_description = data.get('client_description', '')
self._client_country = data.get('client_country', '')
self._client_away = data.get('client_away', '')
self._client_away_msg = data.get('client_away_message', '')
self._client_input_muted = data.get('client_input_muted', '')
self._client_output_muted = data.get('client_output_muted', '')
self._client_outputonly_muted = data.get('client_outputonly_muted', '')
self._client_input_hardware = data.get('client_input_hardware', '')
self._client_output_hardware = data.get('client_output_hardware', '')
self._target_channel_id = int(data.get('ctid', '-1'))
self._from_channel_id = int(data.get('cfid', '-1'))
self._reason_id = int(data.get('reasonid', '-1'))
self._client_is_recording = data.get('client_is_recording', '')
self._client_dbid = data.get('client_database_id', '')
self._client_servergroups = data.get('client_servergroups', '')
self._client_channel_group_id = int(data.get('client_channel_group_id', '-1'))
self._client_id = int(data.get("clid", "-1"))
self._client_name = data.get("client_nickname", "")
self._client_uid = data.get("client_unique_identifier", "")
self._client_description = data.get("client_description", "")
self._client_country = data.get("client_country", "")
self._client_away = data.get("client_away", "")
self._client_away_msg = data.get("client_away_message", "")
self._client_input_muted = data.get("client_input_muted", "")
self._client_output_muted = data.get("client_output_muted", "")
self._client_outputonly_muted = data.get("client_outputonly_muted", "")
self._client_input_hardware = data.get("client_input_hardware", "")
self._client_output_hardware = data.get("client_output_hardware", "")
self._target_channel_id = int(data.get("ctid", "-1"))
self._from_channel_id = int(data.get("cfid", "-1"))
self._reason_id = int(data.get("reasonid", "-1"))
self._client_is_recording = data.get("client_is_recording", "")
self._client_dbid = data.get("client_database_id", "")
self._client_servergroups = data.get("client_servergroups", "")
self._client_channel_group_id = int(
data.get("client_channel_group_id", "-1")
)
except:
self._logger.error("Failed to parse ClientEnterEvent:")
self._logger.error(data)
Expand Down Expand Up @@ -442,11 +458,11 @@ class ClientLeftEvent(TS3Event):

def __init__(self, data):
super().__init__(data)
self._client_id = int(data.get('clid', '-1'))
self._target_channel_id = int(data.get('ctid', '-1'))
self._from_channel_id = int(data.get('cfid', '-1'))
self._reason_id = int(data.get('reasonid', '-1'))
self._reason_msg = data.get('reasonmsg', '')
self._client_id = int(data.get("clid", "-1"))
self._target_channel_id = int(data.get("ctid", "-1"))
self._from_channel_id = int(data.get("cfid", "-1"))
self._reason_id = int(data.get("reasonid", "-1"))
self._reason_msg = data.get("reasonmsg", "")

@property
def client_id(self):
Expand All @@ -468,9 +484,9 @@ def reason_msg(self):
class ClientKickedEvent(ClientLeftEvent):
def __init__(self, data):
super().__init__(data)
self._invoker_id = int(data.get('invokerid', '-1'))
self._invoker_name = data.get('invokername', '')
self._invoker_uid = data.get('invokeruid', '')
self._invoker_id = int(data.get("invokerid", "-1"))
self._invoker_name = data.get("invokername", "")
self._invoker_uid = data.get("invokeruid", "")

@property
def invoker_id(self):
Expand All @@ -488,7 +504,7 @@ def invoker_uid(self):
class ClientBannedEvent(ClientKickedEvent):
def __init__(self, data):
super().__init__(data)
self._ban_time = int(data.get("bantime", '-1'))
self._ban_time = int(data.get("bantime", "-1"))

@property
def ban_time(self):
Expand All @@ -500,12 +516,12 @@ class ClientMovedEvent(TS3Event):

def __init__(self, data):
super().__init__(data)
self._client_id = int(data.get('clid', '-1'))
self._target_channel_id = int(data.get('ctid', '-1'))
self._reason_id = int(data.get('reasonid', '-1'))
self._invoker_id = int(data.get('invokerid', '-1'))
self._invoker_name = data.get('invokername', '')
self._invoker_uid = data.get('invokeruid', '')
self._client_id = int(data.get("clid", "-1"))
self._target_channel_id = int(data.get("ctid", "-1"))
self._reason_id = int(data.get("reasonid", "-1"))
self._invoker_id = int(data.get("invokerid", "-1"))
self._invoker_name = data.get("invokername", "")
self._invoker_uid = data.get("invokeruid", "")

@property
def client_id(self):
Expand Down Expand Up @@ -537,9 +553,9 @@ class ClientMovedSelfEvent(TS3Event):

def __init__(self, data):
super().__init__(data)
self._client_id = int(data.get('clid', '-1'))
self._target_channel_id = int(data.get('ctid', '-1'))
self._reason_id = int(data.get('reasonid', '-1'))
self._client_id = int(data.get("clid", "-1"))
self._target_channel_id = int(data.get("ctid", "-1"))
self._reason_id = int(data.get("reasonid", "-1"))

@property
def client_id(self):
Expand All @@ -559,18 +575,18 @@ class TextMessageEvent(TS3Event):

def __init__(self, data):
super().__init__(data)
if data.get('targetmode') == '1':
self._targetmode = 'Private'
self._target = data.get('target')
elif data.get('targetmode') == '2':
self._targetmode = 'Channel'
elif data.get('targetmode') == '3':
self._targetmode = 'Server'

self._message = data.get('msg')
self._invoker_id = int(data.get('invokerid', '-1'))
self._invoker_name = data.get('invokername', '')
self._invoker_uid = data.get('invokeruid', '-1')
if data.get("targetmode") == "1":
self._targetmode = "Private"
self._target = data.get("target")
elif data.get("targetmode") == "2":
self._targetmode = "Channel"
elif data.get("targetmode") == "3":
self._targetmode = "Server"

self._message = data.get("msg")
self._invoker_id = int(data.get("invokerid", "-1"))
self._invoker_name = data.get("invokername", "")
self._invoker_uid = data.get("invokeruid", "-1")

@property
def invoker_id(self):
Expand All @@ -594,6 +610,6 @@ def targetmode(self):

@property
def target(self):
if self.targetmode == 'Private':
if self.targetmode == "Private":
return self._target
return None
3 changes: 3 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,8 @@
# Simple Python API for the Teamspeak 3 Server Query API

[![CodeQL](https://github.com/Murgeye/teamspeak3-python-api/actions/workflows/codeql-analysis.yml/badge.svg?branch=master)](https://github.com/Murgeye/teamspeak3-python-api/actions/workflows/codeql-analysis.yml?query=branch%3Amaster)
[![Code Style](https://github.com/Murgeye/teamspeak3-python-api/actions/workflows/black-formatter.yml/badge.svg?branch=master)](https://github.com/Murgeye/teamspeak3-python-api/actions/workflows/black-formatter.yml?query=branch%3Amaster)

Python 3 API that allows interactive access to the Teamspeak 3 Server Query interface.

# Installation
Expand Down
Loading