From 7b93a4fce9fe2591328542fb9887a7ff18214f0f Mon Sep 17 00:00:00 2001 From: George Date: Thu, 21 May 2026 17:14:58 +0530 Subject: [PATCH] feat: --ADDED MUMBLE server cap --- MumbleServer.ice | 958 +++ MumbleServer/ACL.py | 59 + MumbleServer/ACLList.py | 12 + MumbleServer/Ban.py | 67 + MumbleServer/BanList.py | 12 + MumbleServer/CertificateDer.py | 10 + MumbleServer/CertificateList.py | 12 + MumbleServer/Channel.py | 67 + MumbleServer/ChannelInfo.py | 31 + MumbleServer/ChannelList.py | 12 + MumbleServer/ChannelMap.py | 12 + MumbleServer/ConfigMap.py | 10 + MumbleServer/ContextChannel.py | 18 + MumbleServer/ContextServer.py | 18 + MumbleServer/ContextUser.py | 18 + MumbleServer/DBState.py | 33 + MumbleServer/Group.py | 67 + MumbleServer/GroupList.py | 12 + MumbleServer/GroupNameList.py | 10 + MumbleServer/IdList.py | 10 + MumbleServer/IdMap.py | 10 + MumbleServer/IntList.py | 10 + MumbleServer/InternalErrorException.py | 35 + MumbleServer/InvalidCallbackException.py | 35 + MumbleServer/InvalidChannelException.py | 35 + MumbleServer/InvalidInputDataException.py | 35 + MumbleServer/InvalidListenerException.py | 35 + MumbleServer/InvalidSecretException.py | 35 + MumbleServer/InvalidServerException.py | 35 + MumbleServer/InvalidSessionException.py | 35 + MumbleServer/InvalidTextureException.py | 35 + MumbleServer/InvalidUserException.py | 35 + MumbleServer/LogEntry.py | 39 + MumbleServer/LogList.py | 12 + MumbleServer/Meta.py | 837 ++ MumbleServer/MetaCallback.py | 242 + MumbleServer/MetaCallback_forward.py | 10 + MumbleServer/Meta_forward.py | 10 + MumbleServer/NameList.py | 10 + MumbleServer/NameMap.py | 10 + MumbleServer/NestingLimitException.py | 35 + MumbleServer/NetAddress.py | 10 + MumbleServer/PermissionBan.py | 18 + MumbleServer/PermissionEnter.py | 18 + MumbleServer/PermissionKick.py | 18 + MumbleServer/PermissionLinkChannel.py | 18 + MumbleServer/PermissionMakeChannel.py | 18 + MumbleServer/PermissionMakeTempChannel.py | 18 + MumbleServer/PermissionMove.py | 18 + MumbleServer/PermissionMuteDeafen.py | 18 + MumbleServer/PermissionRegister.py | 18 + MumbleServer/PermissionRegisterSelf.py | 18 + MumbleServer/PermissionSpeak.py | 18 + MumbleServer/PermissionTextMessage.py | 18 + MumbleServer/PermissionTraverse.py | 18 + MumbleServer/PermissionWhisper.py | 18 + MumbleServer/PermissionWrite.py | 18 + MumbleServer/ReadOnlyModeException.py | 35 + MumbleServer/ResetUserContent.py | 18 + MumbleServer/Server.py | 4209 ++++++++++ MumbleServer/ServerAuthenticator.py | 531 ++ MumbleServer/ServerAuthenticator_forward.py | 10 + MumbleServer/ServerBootedException.py | 35 + MumbleServer/ServerCallback.py | 565 ++ MumbleServer/ServerCallback_forward.py | 10 + MumbleServer/ServerContextCallback.py | 180 + MumbleServer/ServerContextCallback_forward.py | 10 + MumbleServer/ServerException.py | 32 + MumbleServer/ServerFailureException.py | 35 + MumbleServer/ServerList.py | 12 + MumbleServer/ServerUpdatingAuthenticator.py | 462 ++ .../ServerUpdatingAuthenticator_forward.py | 10 + MumbleServer/Server_forward.py | 10 + MumbleServer/TextMessage.py | 55 + MumbleServer/Texture.py | 10 + MumbleServer/Tree.py | 68 + MumbleServer/TreeList.py | 12 + MumbleServer/Tree_forward.py | 10 + MumbleServer/User.py | 153 + MumbleServer/UserInfo.py | 46 + MumbleServer/UserInfoMap.py | 12 + MumbleServer/UserList.py | 12 + MumbleServer/UserMap.py | 12 + MumbleServer/WriteOnlyException.py | 35 + MumbleServer/__init__.py | 241 + MumbleServer/__pycache__/ACL.cpython-312.pyc | Bin 0 -> 2134 bytes .../__pycache__/ACLList.cpython-312.pyc | Bin 0 -> 461 bytes MumbleServer/__pycache__/Ban.cpython-312.pyc | Bin 0 -> 2076 bytes .../__pycache__/BanList.cpython-312.pyc | Bin 0 -> 461 bytes .../CertificateDer.cpython-312.pyc | Bin 0 -> 457 bytes .../CertificateList.cpython-312.pyc | Bin 0 -> 508 bytes .../__pycache__/Channel.cpython-312.pyc | Bin 0 -> 2404 bytes .../__pycache__/ChannelInfo.cpython-312.pyc | Bin 0 -> 946 bytes .../__pycache__/ChannelList.cpython-312.pyc | Bin 0 -> 482 bytes .../__pycache__/ChannelMap.cpython-312.pyc | Bin 0 -> 520 bytes .../__pycache__/ConfigMap.cpython-312.pyc | Bin 0 -> 477 bytes .../ContextChannel.cpython-312.pyc | Bin 0 -> 312 bytes .../__pycache__/ContextServer.cpython-312.pyc | Bin 0 -> 310 bytes .../__pycache__/ContextUser.cpython-312.pyc | Bin 0 -> 305 bytes .../__pycache__/DBState.cpython-312.pyc | Bin 0 -> 957 bytes .../__pycache__/Group.cpython-312.pyc | Bin 0 -> 2327 bytes .../__pycache__/GroupList.cpython-312.pyc | Bin 0 -> 471 bytes .../__pycache__/GroupNameList.cpython-312.pyc | Bin 0 -> 456 bytes .../__pycache__/IdList.cpython-312.pyc | Bin 0 -> 428 bytes .../__pycache__/IdMap.cpython-312.pyc | Bin 0 -> 469 bytes .../__pycache__/IntList.cpython-312.pyc | Bin 0 -> 431 bytes .../InternalErrorException.cpython-312.pyc | Bin 0 -> 1190 bytes .../InvalidCallbackException.cpython-312.pyc | Bin 0 -> 1174 bytes .../InvalidChannelException.cpython-312.pyc | Bin 0 -> 1298 bytes .../InvalidInputDataException.cpython-312.pyc | Bin 0 -> 1181 bytes .../InvalidListenerException.cpython-312.pyc | Bin 0 -> 1198 bytes .../InvalidSecretException.cpython-312.pyc | Bin 0 -> 1183 bytes .../InvalidServerException.cpython-312.pyc | Bin 0 -> 1245 bytes .../InvalidSessionException.cpython-312.pyc | Bin 0 -> 1283 bytes .../InvalidTextureException.cpython-312.pyc | Bin 0 -> 1172 bytes .../InvalidUserException.cpython-312.pyc | Bin 0 -> 1152 bytes .../__pycache__/LogEntry.cpython-312.pyc | Bin 0 -> 1235 bytes .../__pycache__/LogList.cpython-312.pyc | Bin 0 -> 471 bytes MumbleServer/__pycache__/Meta.cpython-312.pyc | Bin 0 -> 29921 bytes .../__pycache__/MetaCallback.cpython-312.pyc | Bin 0 -> 9298 bytes .../MetaCallback_forward.cpython-312.pyc | Bin 0 -> 410 bytes .../__pycache__/Meta_forward.cpython-312.pyc | Bin 0 -> 386 bytes .../__pycache__/NameList.cpython-312.pyc | Bin 0 -> 440 bytes .../__pycache__/NameMap.cpython-312.pyc | Bin 0 -> 478 bytes .../NestingLimitException.cpython-312.pyc | Bin 0 -> 1187 bytes .../__pycache__/NetAddress.cpython-312.pyc | Bin 0 -> 445 bytes .../__pycache__/PermissionBan.cpython-312.pyc | Bin 0 -> 310 bytes .../PermissionEnter.cpython-312.pyc | Bin 0 -> 314 bytes .../PermissionKick.cpython-312.pyc | Bin 0 -> 312 bytes .../PermissionLinkChannel.cpython-312.pyc | Bin 0 -> 327 bytes .../PermissionMakeChannel.cpython-312.pyc | Bin 0 -> 327 bytes .../PermissionMakeTempChannel.cpython-312.pyc | Bin 0 -> 335 bytes .../PermissionMove.cpython-312.pyc | Bin 0 -> 312 bytes .../PermissionMuteDeafen.cpython-312.pyc | Bin 0 -> 325 bytes .../PermissionRegister.cpython-312.pyc | Bin 0 -> 321 bytes .../PermissionRegisterSelf.cpython-312.pyc | Bin 0 -> 329 bytes .../PermissionSpeak.cpython-312.pyc | Bin 0 -> 314 bytes .../PermissionTextMessage.cpython-312.pyc | Bin 0 -> 327 bytes .../PermissionTraverse.cpython-312.pyc | Bin 0 -> 321 bytes .../PermissionWhisper.cpython-312.pyc | Bin 0 -> 319 bytes .../PermissionWrite.cpython-312.pyc | Bin 0 -> 314 bytes .../ReadOnlyModeException.cpython-312.pyc | Bin 0 -> 1229 bytes .../ResetUserContent.cpython-312.pyc | Bin 0 -> 317 bytes .../__pycache__/Server.cpython-312.pyc | Bin 0 -> 149024 bytes .../ServerAuthenticator.cpython-312.pyc | Bin 0 -> 23276 bytes ...erverAuthenticator_forward.cpython-312.pyc | Bin 0 -> 431 bytes .../ServerBootedException.cpython-312.pyc | Bin 0 -> 1266 bytes .../ServerCallback.cpython-312.pyc | Bin 0 -> 20457 bytes .../ServerCallback_forward.cpython-312.pyc | Bin 0 -> 416 bytes .../ServerContextCallback.cpython-312.pyc | Bin 0 -> 7617 bytes ...verContextCallback_forward.cpython-312.pyc | Bin 0 -> 437 bytes .../ServerException.cpython-312.pyc | Bin 0 -> 998 bytes .../ServerFailureException.cpython-312.pyc | Bin 0 -> 1205 bytes .../__pycache__/ServerList.cpython-312.pyc | Bin 0 -> 488 bytes ...erverUpdatingAuthenticator.cpython-312.pyc | Bin 0 -> 17871 bytes ...atingAuthenticator_forward.cpython-312.pyc | Bin 0 -> 455 bytes .../Server_forward.cpython-312.pyc | Bin 0 -> 392 bytes .../__pycache__/TextMessage.cpython-312.pyc | Bin 0 -> 1785 bytes .../__pycache__/Texture.cpython-312.pyc | Bin 0 -> 432 bytes MumbleServer/__pycache__/Tree.cpython-312.pyc | Bin 0 -> 2141 bytes .../__pycache__/TreeList.cpython-312.pyc | Bin 0 -> 474 bytes .../__pycache__/Tree_forward.cpython-312.pyc | Bin 0 -> 383 bytes MumbleServer/__pycache__/User.cpython-312.pyc | Bin 0 -> 6173 bytes .../__pycache__/UserInfo.cpython-312.pyc | Bin 0 -> 1262 bytes .../__pycache__/UserInfoMap.cpython-312.pyc | Bin 0 -> 539 bytes .../__pycache__/UserList.cpython-312.pyc | Bin 0 -> 466 bytes .../__pycache__/UserMap.cpython-312.pyc | Bin 0 -> 504 bytes .../WriteOnlyException.cpython-312.pyc | Bin 0 -> 1175 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 6590 bytes MumbleServer_ice.py | 6804 +++++++++++++++++ __pycache__/Mumble_pb2.cpython-312.pyc | Bin 10448 -> 0 bytes audioKiller.py | 40 + mumble_server_config.py | 230 + rec.py | 7 +- sniffer.py | 95 + test.py | 94 + 176 files changed, 17400 insertions(+), 3 deletions(-) create mode 100644 MumbleServer.ice create mode 100644 MumbleServer/ACL.py create mode 100644 MumbleServer/ACLList.py create mode 100644 MumbleServer/Ban.py create mode 100644 MumbleServer/BanList.py create mode 100644 MumbleServer/CertificateDer.py create mode 100644 MumbleServer/CertificateList.py create mode 100644 MumbleServer/Channel.py create mode 100644 MumbleServer/ChannelInfo.py create mode 100644 MumbleServer/ChannelList.py create mode 100644 MumbleServer/ChannelMap.py create mode 100644 MumbleServer/ConfigMap.py create mode 100644 MumbleServer/ContextChannel.py create mode 100644 MumbleServer/ContextServer.py create mode 100644 MumbleServer/ContextUser.py create mode 100644 MumbleServer/DBState.py create mode 100644 MumbleServer/Group.py create mode 100644 MumbleServer/GroupList.py create mode 100644 MumbleServer/GroupNameList.py create mode 100644 MumbleServer/IdList.py create mode 100644 MumbleServer/IdMap.py create mode 100644 MumbleServer/IntList.py create mode 100644 MumbleServer/InternalErrorException.py create mode 100644 MumbleServer/InvalidCallbackException.py create mode 100644 MumbleServer/InvalidChannelException.py create mode 100644 MumbleServer/InvalidInputDataException.py create mode 100644 MumbleServer/InvalidListenerException.py create mode 100644 MumbleServer/InvalidSecretException.py create mode 100644 MumbleServer/InvalidServerException.py create mode 100644 MumbleServer/InvalidSessionException.py create mode 100644 MumbleServer/InvalidTextureException.py create mode 100644 MumbleServer/InvalidUserException.py create mode 100644 MumbleServer/LogEntry.py create mode 100644 MumbleServer/LogList.py create mode 100644 MumbleServer/Meta.py create mode 100644 MumbleServer/MetaCallback.py create mode 100644 MumbleServer/MetaCallback_forward.py create mode 100644 MumbleServer/Meta_forward.py create mode 100644 MumbleServer/NameList.py create mode 100644 MumbleServer/NameMap.py create mode 100644 MumbleServer/NestingLimitException.py create mode 100644 MumbleServer/NetAddress.py create mode 100644 MumbleServer/PermissionBan.py create mode 100644 MumbleServer/PermissionEnter.py create mode 100644 MumbleServer/PermissionKick.py create mode 100644 MumbleServer/PermissionLinkChannel.py create mode 100644 MumbleServer/PermissionMakeChannel.py create mode 100644 MumbleServer/PermissionMakeTempChannel.py create mode 100644 MumbleServer/PermissionMove.py create mode 100644 MumbleServer/PermissionMuteDeafen.py create mode 100644 MumbleServer/PermissionRegister.py create mode 100644 MumbleServer/PermissionRegisterSelf.py create mode 100644 MumbleServer/PermissionSpeak.py create mode 100644 MumbleServer/PermissionTextMessage.py create mode 100644 MumbleServer/PermissionTraverse.py create mode 100644 MumbleServer/PermissionWhisper.py create mode 100644 MumbleServer/PermissionWrite.py create mode 100644 MumbleServer/ReadOnlyModeException.py create mode 100644 MumbleServer/ResetUserContent.py create mode 100644 MumbleServer/Server.py create mode 100644 MumbleServer/ServerAuthenticator.py create mode 100644 MumbleServer/ServerAuthenticator_forward.py create mode 100644 MumbleServer/ServerBootedException.py create mode 100644 MumbleServer/ServerCallback.py create mode 100644 MumbleServer/ServerCallback_forward.py create mode 100644 MumbleServer/ServerContextCallback.py create mode 100644 MumbleServer/ServerContextCallback_forward.py create mode 100644 MumbleServer/ServerException.py create mode 100644 MumbleServer/ServerFailureException.py create mode 100644 MumbleServer/ServerList.py create mode 100644 MumbleServer/ServerUpdatingAuthenticator.py create mode 100644 MumbleServer/ServerUpdatingAuthenticator_forward.py create mode 100644 MumbleServer/Server_forward.py create mode 100644 MumbleServer/TextMessage.py create mode 100644 MumbleServer/Texture.py create mode 100644 MumbleServer/Tree.py create mode 100644 MumbleServer/TreeList.py create mode 100644 MumbleServer/Tree_forward.py create mode 100644 MumbleServer/User.py create mode 100644 MumbleServer/UserInfo.py create mode 100644 MumbleServer/UserInfoMap.py create mode 100644 MumbleServer/UserList.py create mode 100644 MumbleServer/UserMap.py create mode 100644 MumbleServer/WriteOnlyException.py create mode 100644 MumbleServer/__init__.py create mode 100644 MumbleServer/__pycache__/ACL.cpython-312.pyc create mode 100644 MumbleServer/__pycache__/ACLList.cpython-312.pyc create mode 100644 MumbleServer/__pycache__/Ban.cpython-312.pyc create mode 100644 MumbleServer/__pycache__/BanList.cpython-312.pyc create mode 100644 MumbleServer/__pycache__/CertificateDer.cpython-312.pyc create mode 100644 MumbleServer/__pycache__/CertificateList.cpython-312.pyc create mode 100644 MumbleServer/__pycache__/Channel.cpython-312.pyc create mode 100644 MumbleServer/__pycache__/ChannelInfo.cpython-312.pyc create mode 100644 MumbleServer/__pycache__/ChannelList.cpython-312.pyc create mode 100644 MumbleServer/__pycache__/ChannelMap.cpython-312.pyc create mode 100644 MumbleServer/__pycache__/ConfigMap.cpython-312.pyc create mode 100644 MumbleServer/__pycache__/ContextChannel.cpython-312.pyc create mode 100644 MumbleServer/__pycache__/ContextServer.cpython-312.pyc create mode 100644 MumbleServer/__pycache__/ContextUser.cpython-312.pyc create mode 100644 MumbleServer/__pycache__/DBState.cpython-312.pyc create mode 100644 MumbleServer/__pycache__/Group.cpython-312.pyc create mode 100644 MumbleServer/__pycache__/GroupList.cpython-312.pyc create mode 100644 MumbleServer/__pycache__/GroupNameList.cpython-312.pyc create mode 100644 MumbleServer/__pycache__/IdList.cpython-312.pyc create mode 100644 MumbleServer/__pycache__/IdMap.cpython-312.pyc create mode 100644 MumbleServer/__pycache__/IntList.cpython-312.pyc create mode 100644 MumbleServer/__pycache__/InternalErrorException.cpython-312.pyc create mode 100644 MumbleServer/__pycache__/InvalidCallbackException.cpython-312.pyc create mode 100644 MumbleServer/__pycache__/InvalidChannelException.cpython-312.pyc create mode 100644 MumbleServer/__pycache__/InvalidInputDataException.cpython-312.pyc create mode 100644 MumbleServer/__pycache__/InvalidListenerException.cpython-312.pyc create mode 100644 MumbleServer/__pycache__/InvalidSecretException.cpython-312.pyc create mode 100644 MumbleServer/__pycache__/InvalidServerException.cpython-312.pyc create mode 100644 MumbleServer/__pycache__/InvalidSessionException.cpython-312.pyc create mode 100644 MumbleServer/__pycache__/InvalidTextureException.cpython-312.pyc create mode 100644 MumbleServer/__pycache__/InvalidUserException.cpython-312.pyc create mode 100644 MumbleServer/__pycache__/LogEntry.cpython-312.pyc create mode 100644 MumbleServer/__pycache__/LogList.cpython-312.pyc create mode 100644 MumbleServer/__pycache__/Meta.cpython-312.pyc create mode 100644 MumbleServer/__pycache__/MetaCallback.cpython-312.pyc create mode 100644 MumbleServer/__pycache__/MetaCallback_forward.cpython-312.pyc create mode 100644 MumbleServer/__pycache__/Meta_forward.cpython-312.pyc create mode 100644 MumbleServer/__pycache__/NameList.cpython-312.pyc create mode 100644 MumbleServer/__pycache__/NameMap.cpython-312.pyc create mode 100644 MumbleServer/__pycache__/NestingLimitException.cpython-312.pyc create mode 100644 MumbleServer/__pycache__/NetAddress.cpython-312.pyc create mode 100644 MumbleServer/__pycache__/PermissionBan.cpython-312.pyc create mode 100644 MumbleServer/__pycache__/PermissionEnter.cpython-312.pyc create mode 100644 MumbleServer/__pycache__/PermissionKick.cpython-312.pyc create mode 100644 MumbleServer/__pycache__/PermissionLinkChannel.cpython-312.pyc create mode 100644 MumbleServer/__pycache__/PermissionMakeChannel.cpython-312.pyc create mode 100644 MumbleServer/__pycache__/PermissionMakeTempChannel.cpython-312.pyc create mode 100644 MumbleServer/__pycache__/PermissionMove.cpython-312.pyc create mode 100644 MumbleServer/__pycache__/PermissionMuteDeafen.cpython-312.pyc create mode 100644 MumbleServer/__pycache__/PermissionRegister.cpython-312.pyc create mode 100644 MumbleServer/__pycache__/PermissionRegisterSelf.cpython-312.pyc create mode 100644 MumbleServer/__pycache__/PermissionSpeak.cpython-312.pyc create mode 100644 MumbleServer/__pycache__/PermissionTextMessage.cpython-312.pyc create mode 100644 MumbleServer/__pycache__/PermissionTraverse.cpython-312.pyc create mode 100644 MumbleServer/__pycache__/PermissionWhisper.cpython-312.pyc create mode 100644 MumbleServer/__pycache__/PermissionWrite.cpython-312.pyc create mode 100644 MumbleServer/__pycache__/ReadOnlyModeException.cpython-312.pyc create mode 100644 MumbleServer/__pycache__/ResetUserContent.cpython-312.pyc create mode 100644 MumbleServer/__pycache__/Server.cpython-312.pyc create mode 100644 MumbleServer/__pycache__/ServerAuthenticator.cpython-312.pyc create mode 100644 MumbleServer/__pycache__/ServerAuthenticator_forward.cpython-312.pyc create mode 100644 MumbleServer/__pycache__/ServerBootedException.cpython-312.pyc create mode 100644 MumbleServer/__pycache__/ServerCallback.cpython-312.pyc create mode 100644 MumbleServer/__pycache__/ServerCallback_forward.cpython-312.pyc create mode 100644 MumbleServer/__pycache__/ServerContextCallback.cpython-312.pyc create mode 100644 MumbleServer/__pycache__/ServerContextCallback_forward.cpython-312.pyc create mode 100644 MumbleServer/__pycache__/ServerException.cpython-312.pyc create mode 100644 MumbleServer/__pycache__/ServerFailureException.cpython-312.pyc create mode 100644 MumbleServer/__pycache__/ServerList.cpython-312.pyc create mode 100644 MumbleServer/__pycache__/ServerUpdatingAuthenticator.cpython-312.pyc create mode 100644 MumbleServer/__pycache__/ServerUpdatingAuthenticator_forward.cpython-312.pyc create mode 100644 MumbleServer/__pycache__/Server_forward.cpython-312.pyc create mode 100644 MumbleServer/__pycache__/TextMessage.cpython-312.pyc create mode 100644 MumbleServer/__pycache__/Texture.cpython-312.pyc create mode 100644 MumbleServer/__pycache__/Tree.cpython-312.pyc create mode 100644 MumbleServer/__pycache__/TreeList.cpython-312.pyc create mode 100644 MumbleServer/__pycache__/Tree_forward.cpython-312.pyc create mode 100644 MumbleServer/__pycache__/User.cpython-312.pyc create mode 100644 MumbleServer/__pycache__/UserInfo.cpython-312.pyc create mode 100644 MumbleServer/__pycache__/UserInfoMap.cpython-312.pyc create mode 100644 MumbleServer/__pycache__/UserList.cpython-312.pyc create mode 100644 MumbleServer/__pycache__/UserMap.cpython-312.pyc create mode 100644 MumbleServer/__pycache__/WriteOnlyException.cpython-312.pyc create mode 100644 MumbleServer/__pycache__/__init__.cpython-312.pyc create mode 100644 MumbleServer_ice.py delete mode 100644 __pycache__/Mumble_pb2.cpython-312.pyc create mode 100644 audioKiller.py create mode 100644 mumble_server_config.py create mode 100644 test.py diff --git a/MumbleServer.ice b/MumbleServer.ice new file mode 100644 index 0000000..426f27c --- /dev/null +++ b/MumbleServer.ice @@ -0,0 +1,958 @@ +// Copyright The Mumble Developers. All rights reserved. +// Use of this source code is governed by a BSD-style license +// that can be found in the LICENSE file at the root of the +// Mumble source tree or at . + +/** + * + * Information and control of the Mumble server. Each server has + * one {@link Meta} interface that controls global information, and + * each virtual server has a {@link Server} interface. + * + **/ + + +module MumbleServer +{ + + /** A network address in IPv6 format. + **/ + ["python:seq:tuple"] sequence NetAddress; + + /** A connected user. + **/ + struct User { + /** Session ID. This identifies the connection to the server. */ + int session; + /** User ID. -1 if the user is anonymous. */ + int userid; + /** Is user muted by the server? */ + bool mute; + /** Is user deafened by the server? If true, this implies mute. */ + bool deaf; + /** Is the user suppressed by the server? This means the user is not muted, but does not have speech privileges in the current channel. */ + bool suppress; + /** Is the user a priority speaker? */ + bool prioritySpeaker; + /** Is the user self-muted? */ + bool selfMute; + /** Is the user self-deafened? If true, this implies mute. */ + bool selfDeaf; + /** Is the User recording? (This flag is read-only and cannot be changed using setState().) **/ + bool recording; + /** Channel ID the user is in. Matches {@link Channel.id}. */ + int channel; + /** The name of the user. */ + string name; + /** Seconds user has been online. */ + int onlinesecs; + /** Average transmission rate in bytes per second over the last few seconds. */ + int bytespersec; + /** Legacy client version. */ + int version; + /** New client version. (See https://github.com/mumble-voip/mumble/issues/5827) */ + long version2; + /** Client release. For official releases, this equals the version. For snapshots and git compiles, this will be something else. */ + string release; + /** Client OS. */ + string os; + /** Client OS Version. */ + string osversion; + /** Plugin Identity. This will be the user's unique ID inside the current game. */ + string identity; + /** + Base64-encoded Plugin context. This is a binary blob identifying the game and team the user is on. + + The used Base64 alphabet is the one specified in RFC 2045. + + Before Mumble 1.3.0, this string was not Base64-encoded. This could cause problems for some Ice + implementations, such as the .NET implementation. + + If you need the exact string that is used by Mumble, you can get it by Base64-decoding this string. + + If you simply need to detect whether two users are in the same game world, string comparisons will + continue to work as before. + */ + string context; + /** User comment. Shown as tooltip for this user. */ + string comment; + /** Client address. */ + NetAddress address; + /** TCP only. True until UDP connectivity is established. */ + bool tcponly; + /** Idle time. This is how many seconds it is since the user last spoke. Other activity is not counted. */ + int idlesecs; + /** UDP Ping Average. This is the average ping for the user via UDP over the duration of the connection. */ + float udpPing; + /** TCP Ping Average. This is the average ping for the user via TCP over the duration of the connection. */ + float tcpPing; + }; + + sequence IntList; + + /** A text message between users. + **/ + struct TextMessage { + /** Sessions (connected users) who were sent this message. */ + IntList sessions; + /** Channels who were sent this message. */ + IntList channels; + /** Trees of channels who were sent this message. */ + IntList trees; + /** The contents of the message. */ + string text; + }; + + /** A channel. + **/ + struct Channel { + /** Channel ID. This is unique per channel, and the root channel is always id 0. */ + int id; + /** Name of the channel. There can not be two channels with the same parent that has the same name. */ + string name; + /** ID of parent channel, or -1 if this is the root channel. */ + int parent; + /** List of id of linked channels. */ + IntList links; + /** Description of channel. Shown as tooltip for this channel. */ + string description; + /** Channel is temporary, and will be removed when the last user leaves it. Read-only. */ + bool temporary; + /** Position of the channel which is used in Client for sorting. */ + int position; + }; + + /** A group. Groups are defined per channel, and can inherit members from parent channels. + **/ + struct Group { + /** Group name */ + string name; + /** Is this group inherited from a parent channel? Read-only. */ + bool inherited; + /** Does this group inherit members from parent channels? */ + bool inherit; + /** Can subchannels inherit members from this group? */ + bool inheritable; + /** List of users to add to the group. */ + IntList add; + /** List of inherited users to remove from the group. */ + IntList remove; + /** Current members of the group, including inherited members. Read-only. */ + IntList members; + }; + + /** Write access to channel control. Implies all other permissions (except Speak). */ + const int PermissionWrite = 0x01; + /** Traverse channel. Without this, a client cannot reach subchannels, no matter which privileges he has there. */ + const int PermissionTraverse = 0x02; + /** Enter channel. */ + const int PermissionEnter = 0x04; + /** Speak in channel. */ + const int PermissionSpeak = 0x08; + /** Whisper to channel. This is different from Speak, so you can set up different permissions. */ + const int PermissionWhisper = 0x100; + /** Mute and deafen other users in this channel. */ + const int PermissionMuteDeafen = 0x10; + /** Move users from channel. You need this permission in both the source and destination channel to move another user. */ + const int PermissionMove = 0x20; + /** Make new channel as a subchannel of this channel. */ + const int PermissionMakeChannel = 0x40; + /** Make new temporary channel as a subchannel of this channel. */ + const int PermissionMakeTempChannel = 0x400; + /** Link this channel. You need this permission in both the source and destination channel to link channels, or in either channel to unlink them. */ + const int PermissionLinkChannel = 0x80; + /** Send text message to channel. */ + const int PermissionTextMessage = 0x200; + /** Kick user from server. Only valid on root channel. */ + const int PermissionKick = 0x10000; + /** Ban user from server. Only valid on root channel. */ + const int PermissionBan = 0x20000; + /** Register and unregister users. Only valid on root channel. */ + const int PermissionRegister = 0x40000; + /** Register and unregister users. Only valid on root channel. */ + const int PermissionRegisterSelf = 0x80000; + /** Reset the comment or avatar of a user. Only valid on root channel. */ + const int ResetUserContent = 0x100000; + + + /** Access Control List for a channel. ACLs are defined per channel, and can be inherited from parent channels. + **/ + struct ACL { + /** Does the ACL apply to this channel? */ + bool applyHere; + /** Does the ACL apply to subchannels? */ + bool applySubs; + /** Is this ACL inherited from a parent channel? Read-only. */ + bool inherited; + /** ID of user this ACL applies to. -1 if using a group name. */ + int userid; + /** Group this ACL applies to. Blank if using userid. */ + string group; + /** Binary mask of privileges to allow. */ + int allow; + /** Binary mask of privileges to deny. */ + int deny; + }; + + /** A single ip mask for a ban. + **/ + struct Ban { + /** Address to ban. */ + NetAddress address; + /** Number of bits in ban to apply. */ + int bits; + /** Username associated with ban. */ + string name; + /** Hash of banned user. */ + string hash; + /** Reason for ban. */ + string reason; + /** Date ban was applied in unix time format. */ + int start; + /** Duration of ban. */ + int duration; + }; + + /** A entry in the log. + **/ + struct LogEntry { + /** Timestamp in UNIX time_t */ + int timestamp; + /** The log message. */ + string txt; + }; + + class Tree; + sequence TreeList; + + enum ChannelInfo { ChannelDescription, ChannelPosition }; + enum UserInfo { UserName, UserEmail, UserComment, UserHash, UserPassword, UserLastActive, UserKDFIterations }; + + dictionary UserMap; + dictionary ChannelMap; + sequence ChannelList; + sequence UserList; + sequence GroupList; + sequence ACLList; + sequence LogList; + sequence BanList; + sequence IdList; + sequence NameList; + dictionary NameMap; + dictionary IdMap; + sequence Texture; + dictionary ConfigMap; + sequence GroupNameList; + sequence CertificateDer; + sequence CertificateList; + + /** User information map. + * Older versions of ice-php can't handle enums as keys. If you are using one of these, replace 'UserInfo' with 'byte'. + */ + + dictionary UserInfoMap; + + /** User and subchannel state. Read-only. + **/ + class Tree { + /** Channel definition of current channel. */ + Channel c; + /** List of subchannels. */ + TreeList children; + /** Users in this channel. */ + UserList users; + }; + + /** Different states of the underlying database */ + enum DBState { Normal, ReadOnly }; + + exception ServerException {}; + /** Thrown if the server encounters an internal error while processing the request */ + exception InternalErrorException extends ServerException {}; + /** This is thrown when you specify an invalid session. This may happen if the user has disconnected since your last call to {@link Server.getUsers}. See {@link User.session} */ + exception InvalidSessionException extends ServerException {}; + /** This is thrown when you specify an invalid channel id. This may happen if the channel was removed by another provess. It can also be thrown if you try to add an invalid channel. */ + exception InvalidChannelException extends ServerException {}; + /** This is thrown when you try to do an operation on a server that does not exist. This may happen if someone has removed the server. */ + exception InvalidServerException extends ServerException {}; + /** This happens if you try to fetch user or channel state on a stopped server, if you try to stop an already stopped server or start an already started server. */ + exception ServerBootedException extends ServerException {}; + /** This is thrown if {@link Server.start} fails, and should generally be the cause for some concern. */ + exception ServerFailureException extends ServerException {}; + /** This is thrown when you specify an invalid userid. */ + exception InvalidUserException extends ServerException {}; + /** This is thrown when you try to set an invalid texture. */ + exception InvalidTextureException extends ServerException {}; + /** This is thrown when you supply an invalid callback. */ + exception InvalidCallbackException extends ServerException {}; + /** This is thrown when you supply the wrong secret in the calling context. */ + exception InvalidSecretException extends ServerException {}; + /** This is thrown when the channel operation would exceed the channel nesting limit */ + exception NestingLimitException extends ServerException {}; + /** This is thrown when you ask the server to disclose something that should be secret. */ + exception WriteOnlyException extends ServerException {}; + /** This is thrown when invalid input data was specified. */ + exception InvalidInputDataException extends ServerException {}; + /** This is thrown when the referenced channel listener does not actually exist */ + exception InvalidListenerException extends ServerException {}; + /** This is thrown when the server has its database in read-only mode and whatever you requested is incompatible with that. */ + exception ReadOnlyModeException extends ServerException {}; + + /** Callback interface for servers. You can supply an implementation of this to receive notification + * messages from the server. + * If an added callback ever throws an exception or goes away, it will be automatically removed. + * Please note that all callbacks are done asynchronously; the server does not wait for the callback to + * complete before continuing processing. + * Note that callbacks are removed when a server is stopped, so you should have a callback for + * {@link MetaCallback.started} which calls {@link Server.addCallback}. + * @see MetaCallback + * @see Server.addCallback + */ + interface ServerCallback { + /** Called when a user connects to the server. + * @param state State of connected user. + */ + idempotent void userConnected(User state); + /** Called when a user disconnects from the server. The user has already been removed, so you can no longer use methods like {@link Server.getState} + * to retrieve the user's state. + * @param state State of disconnected user. + */ + idempotent void userDisconnected(User state); + /** Called when a user state changes. This is called if the user moves, is renamed, is muted, deafened etc. + * @param state New state of user. + */ + idempotent void userStateChanged(User state); + /** Called when user writes a text message + * @param state the User sending the message + * @param message the TextMessage the user has sent + */ + idempotent void userTextMessage(User state, TextMessage message); + /** Called when a new channel is created. + * @param state State of new channel. + */ + idempotent void channelCreated(Channel state); + /** Called when a channel is removed. The channel has already been removed, you can no longer use methods like {@link Server.getChannelState} + * @param state State of removed channel. + */ + idempotent void channelRemoved(Channel state); + /** Called when a new channel state changes. This is called if the channel is moved, renamed or if new links are added. + * @param state New state of channel. + */ + idempotent void channelStateChanged(Channel state); + }; + + /** Context for actions in the Server menu. */ + const int ContextServer = 0x01; + /** Context for actions in the Channel menu. */ + const int ContextChannel = 0x02; + /** Context for actions in the User menu. */ + const int ContextUser = 0x04; + + /** Callback interface for context actions. You need to supply one of these for {@link Server.addContext}. + * If an added callback ever throws an exception or goes away, it will be automatically removed. + * Please note that all callbacks are done asynchronously; the server does not wait for the callback to + * complete before continuing processing. + */ + interface ServerContextCallback { + /** Called when a context action is performed. + * @param action Action to be performed. + * @param usr User which initiated the action. + * @param session If nonzero, session of target user. + * @param channelid If not -1, id of target channel. + */ + idempotent void contextAction(string action, User usr, int session, int channelid); + }; + + /** Callback interface for server authentication. You need to supply one of these for {@link Server.setAuthenticator}. + * If an added callback ever throws an exception or goes away, it will be automatically removed. + * Please note that unlike {@link ServerCallback} and {@link ServerContextCallback}, these methods are called + * synchronously. If the response lags, the entire server will lag. + * Also note that, as the method calls are synchronous, making a call to {@link Server} or {@link Meta} will + * deadlock the server. + */ + interface ServerAuthenticator { + /** Called to authenticate a user. If you do not know the username in question, always return -2 from this + * method to fall through to normal database authentication. + * Note that if authentication succeeds, the server will create a record of the user in it's database, reserving + * the username and id so it cannot be used for normal database authentication. + * The data in the certificate (name, email addresses etc), as well as the list of signing certificates, + * should only be trusted if certstrong is true. + * + * Internally, the server treats usernames as case-insensitive. It is recommended + * that authenticators do the same. the server checks if a username is in use when + * a user connects. If the connecting user is registered, the other username is + * kicked. If the connecting user is not registered, the connecting user is not + * allowed to join the server. + * + * @param name Username to authenticate. + * @param pw Password to authenticate with. + * @param certificates List of der encoded certificates the user connected with. + * @param certhash Hash of user certificate, as used by the server internally when matching. + * @param certstrong True if certificate was valid and signed by a trusted CA. + * @param newname Set this to change the username from the supplied one. + * @param groups List of groups on the root channel that the user will be added to for the duration of the connection. + * @return UserID of authenticated user, -1 for authentication failures, -2 for unknown user (fallthrough), + * -3 for authentication failures where the data could (temporarily) not be verified. + */ + idempotent int authenticate(string name, string pw, CertificateList certificates, string certhash, bool certstrong, out string newname, out GroupNameList groups); + + /** Fetch information about a user. This is used to retrieve information like email address, keyhash etc. If you + * want the server to take care of this information itself, simply return false to fall through. + * @param id User id. + * @param info Information about user. This needs to include at least "name". + * @return true if information is present, false to fall through. + */ + idempotent bool getInfo(int id, out UserInfoMap info); + + /** Map a name to a user id. + * @param name Username to map. + * @return User id or -2 for unknown name. + */ + idempotent int nameToId(string name); + + /** Map a user id to a username. + * @param id User id to map. + * @return Name of user or empty string for unknown id. + */ + idempotent string idToName(int id); + + /** Map a user to a custom Texture. + * @param id User id to map. + * @return User texture or an empty texture for unknown users or users without textures. + */ + idempotent Texture idToTexture(int id); + }; + + /** Callback interface for server authentication and registration. This allows you to support both authentication + * and account updating. + * You do not need to implement this if all you want is authentication, you only need this if other scripts + * connected to the same server calls e.g. {@link Server.setTexture}. + * Almost all of these methods support fall through, meaning the server should continue the operation against its + * own database. + */ + interface ServerUpdatingAuthenticator extends ServerAuthenticator { + /** Register a new user. + * @param info Information about user to register. + * @return User id of new user, -1 for registration failure, or -2 to fall through. + */ + int registerUser(UserInfoMap info); + + /** Unregister a user. + * @param id Userid to unregister. + * @return 1 for successful unregistration, 0 for unsuccessful unregistration, -1 to fall through. + */ + int unregisterUser(int id); + + /** Get a list of registered users matching filter. + * @param filter Substring usernames must contain. If empty, return all registered users. + * @return List of matching registered users. + */ + idempotent NameMap getRegisteredUsers(string filter); + + /** Set additional information for user registration. + * @param id Userid of registered user. + * @param info Information to set about user. This should be merged with existing information. + * @return 1 for successful update, 0 for unsuccessful update, -1 to fall through. + */ + idempotent int setInfo(int id, UserInfoMap info); + + /** Set texture (now called avatar) of user registration. + * @param id registrationId of registered user. + * @param tex New texture. + * @return 1 for successful update, 0 for unsuccessful update, -1 to fall through. + */ + idempotent int setTexture(int id, Texture tex); + }; + + /** Per-server interface. This includes all methods for configuring and altering + * the state of a single virtual server. You can retrieve a pointer to this interface + * from one of the methods in {@link Meta}. + **/ + ["amd"] interface Server { + /** Shows if the server currently running (accepting users). + * + * @return Run-state of server. + */ + idempotent bool isRunning() throws InvalidSecretException; + + /** Start server. */ + void start() throws ServerBootedException, ServerFailureException, InvalidSecretException, ReadOnlyModeException; + + /** Stop server. + * Note: Server will be restarted on application restart unless explicitly disabled + * with setConf("boot", false) + */ + void stop() throws ServerBootedException, InvalidSecretException, ReadOnlyModeException; + + /** Delete server and all it's configuration. */ + void delete() throws ServerBootedException, InvalidSecretException, ReadOnlyModeException; + + /** Fetch the server id. + * + * @return Unique server id. + */ + idempotent int id() throws InvalidSecretException; + + /** Add a callback. The callback will receive notifications about changes to users and channels. + * + * @param cb Callback interface which will receive notifications. + * @see removeCallback + */ + void addCallback(ServerCallback *cb) throws ServerBootedException, InvalidCallbackException, InvalidSecretException; + + /** Remove a callback. + * + * @param cb Callback interface to be removed. + * @see addCallback + */ + void removeCallback(ServerCallback *cb) throws ServerBootedException, InvalidCallbackException, InvalidSecretException; + + /** Set external authenticator. If set, all authentications from clients are forwarded to this + * proxy. + * + * @param auth Authenticator object to perform subsequent authentications. + */ + void setAuthenticator(ServerAuthenticator *auth) throws ServerBootedException, InvalidCallbackException, InvalidSecretException, ReadOnlyModeException; + + /** Retrieve configuration item. + * @param key Configuration key. + * @return Configuration value. If this is empty, see {@link Meta.getDefaultConf} + */ + idempotent string getConf(string key) throws InvalidSecretException, WriteOnlyException, ReadOnlyModeException; + + /** Retrieve all configuration items. + * @return All configured values. If a value isn't set here, the value from {@link Meta.getDefaultConf} is used. + */ + idempotent ConfigMap getAllConf() throws InvalidSecretException, ReadOnlyModeException; + + /** Set a configuration item. + * @param key Configuration key. + * @param value Configuration value. + */ + idempotent void setConf(string key, string value) throws InvalidSecretException, ReadOnlyModeException; + + /** Set superuser password. This is just a convenience for using {@link updateRegistration} on user id 0. + * @param pw Password. + */ + idempotent void setSuperuserPassword(string pw) throws InvalidSecretException, ReadOnlyModeException; + + /** Fetch log entries. + * @param first Lowest numbered entry to fetch. 0 is the most recent item. + * @param last Last entry to fetch. + * @return List of log entries. + */ + idempotent LogList getLog(int first, int last) throws InvalidSecretException, ReadOnlyModeException; + + /** Fetch length of log + * @return Number of entries in log + */ + idempotent int getLogLen() throws InvalidSecretException, ReadOnlyModeException; + + /** Fetch all users. This returns all currently connected users on the server. + * @return List of connected users. + * @see getState + */ + idempotent UserMap getUsers() throws ServerBootedException, InvalidSecretException; + + /** Fetch all channels. This returns all defined channels on the server. The root channel is always channel 0. + * @return List of defined channels. + * @see getChannelState + */ + idempotent ChannelMap getChannels() throws ServerBootedException, InvalidSecretException; + + /** Fetch certificate of user. This returns the complete certificate chain of a user. + * @param session Connection ID of user. See {@link User.session}. + * @return Certificate list of user. + */ + idempotent CertificateList getCertificateList(int session) throws ServerBootedException, InvalidSessionException, InvalidSecretException; + + /** Fetch all channels and connected users as a tree. This retrieves an easy-to-use representation of the server + * as a tree. This is primarily used for viewing the state of the server on a webpage. + * @return Recursive tree of all channels and connected users. + */ + idempotent Tree getTree() throws ServerBootedException, InvalidSecretException; + + /** Fetch all current IP bans on the server. + * @return List of bans. + */ + idempotent BanList getBans() throws ServerBootedException, InvalidSecretException; + + /** Set all current IP bans on the server. This will replace any bans already present, so if you want to add a ban, be sure to call {@link getBans} and then + * append to the returned list before calling this method. + * @param bans List of bans. + */ + idempotent void setBans(BanList bans) throws ServerBootedException, InvalidSecretException, ReadOnlyModeException; + + /** Kick a user. The user is not banned, and is free to rejoin the server. + * @param session Connection ID of user. See {@link User.session}. + * @param reason Text message to show when user is kicked. + */ + void kickUser(int session, string reason) throws ServerBootedException, InvalidSessionException, InvalidSecretException; + + /** Get state of a single connected user. + * @param session Connection ID of user. See {@link User.session}. + * @return State of connected user. + * @see setState + * @see getUsers + */ + idempotent User getState(int session) throws ServerBootedException, InvalidSessionException, InvalidSecretException; + + /** Set user state. You can use this to move, mute and deafen users. + * @param state User state to set. + * @see getState + */ + idempotent void setState(User state) throws ServerBootedException, InvalidSessionException, InvalidChannelException, InvalidSecretException; + + /** Send text message to a single user. + * @param session Connection ID of user. See {@link User.session}. + * @param text Message to send. + * @see sendMessageChannel + */ + void sendMessage(int session, string text) throws ServerBootedException, InvalidSessionException, InvalidSecretException; + + /** Check if user is permitted to perform action. + * @param session Connection ID of user. See {@link User.session}. + * @param channelid ID of Channel. See {@link Channel.id}. + * @param perm Permission bits to check. + * @return true if any of the permissions in perm were set for the user. + */ + bool hasPermission(int session, int channelid, int perm) throws ServerBootedException, InvalidSessionException, InvalidChannelException, InvalidSecretException; + + /** Return users effective permissions + * @param session Connection ID of user. See {@link User.session}. + * @param channelid ID of Channel. See {@link Channel.id}. + * @return bitfield of allowed actions + */ + idempotent int effectivePermissions(int session, int channelid) throws ServerBootedException, InvalidSessionException, InvalidChannelException, InvalidSecretException; + + /** Add a context callback. This is done per user, and will add a context menu action for the user. + * + * @param session Session of user which should receive context entry. + * @param action Action string, a unique name to associate with the action. + * @param text Name of action shown to user. + * @param cb Callback interface which will receive notifications. + * @param ctx Context this should be used in. Needs to be one or a combination of {@link ContextServer}, {@link ContextChannel} and {@link ContextUser}. + * @see removeContextCallback + */ + void addContextCallback(int session, string action, string text, ServerContextCallback *cb, int ctx) throws ServerBootedException, InvalidCallbackException, InvalidSecretException; + + /** Remove a callback. + * + * @param cb Callback interface to be removed. This callback will be removed from all from all users. + * @see addContextCallback + */ + void removeContextCallback(ServerContextCallback *cb) throws ServerBootedException, InvalidCallbackException, InvalidSecretException; + + /** Get state of single channel. + * @param channelid ID of Channel. See {@link Channel.id}. + * @return State of channel. + * @see setChannelState + * @see getChannels + */ + idempotent Channel getChannelState(int channelid) throws ServerBootedException, InvalidChannelException, InvalidSecretException; + + /** Set state of a single channel. You can use this to move or relink channels. + * @param state Channel state to set. + * @see getChannelState + */ + idempotent void setChannelState(Channel state) throws ServerBootedException, InvalidChannelException, InvalidSecretException, NestingLimitException, ReadOnlyModeException; + + /** Remove a channel and all its subchannels. + * @param channelid ID of Channel. See {@link Channel.id}. + */ + void removeChannel(int channelid) throws ServerBootedException, InvalidChannelException, InvalidSecretException, ReadOnlyModeException; + + /** Add a new channel. + * @param name Name of new channel. + * @param parent Channel ID of parent channel. See {@link Channel.id}. + * @return ID of newly created channel. + */ + int addChannel(string name, int parent) throws ServerBootedException, InvalidChannelException, InvalidSecretException, NestingLimitException, ReadOnlyModeException; + + /** Send text message to channel or a tree of channels. + * @param channelid Channel ID of channel to send to. See {@link Channel.id}. + * @param tree If true, the message will be sent to the channel and all its subchannels. + * @param text Message to send. + * @see sendMessage + */ + void sendMessageChannel(int channelid, bool tree, string text) throws ServerBootedException, InvalidChannelException, InvalidSecretException; + + /** Retrieve ACLs and Groups on a channel. + * @param channelid Channel ID of channel to fetch from. See {@link Channel.id}. + * @param acls List of ACLs on the channel. This will include inherited ACLs. + * @param groups List of groups on the channel. This will include inherited groups. + * @param inherit Does this channel inherit ACLs from the parent channel? + */ + idempotent void getACL(int channelid, out ACLList acls, out GroupList groups, out bool inherit) throws ServerBootedException, InvalidChannelException, InvalidSecretException; + + /** Set ACLs and Groups on a channel. Note that this will replace all existing ACLs and groups on the channel. + * @param channelid Channel ID of channel to fetch from. See {@link Channel.id}. + * @param acls List of ACLs on the channel. + * @param groups List of groups on the channel. + * @param inherit Should this channel inherit ACLs from the parent channel? + */ + idempotent void setACL(int channelid, ACLList acls, GroupList groups, bool inherit) throws ServerBootedException, InvalidChannelException, InvalidSecretException, ReadOnlyModeException; + + /** Temporarily add a user to a group on a channel. This state is not saved, and is intended for temporary memberships. + * @param channelid Channel ID of channel to add to. See {@link Channel.id}. + * @param session Connection ID of user. See {@link User.session}. + * @param group Group name to add to. + */ + idempotent void addUserToGroup(int channelid, int session, string group) throws ServerBootedException, InvalidChannelException, InvalidSessionException, InvalidSecretException; + + /** Remove a user from a temporary group membership on a channel. This state is not saved, and is intended for temporary memberships. + * @param channelid Channel ID of channel to add to. See {@link Channel.id}. + * @param session Connection ID of user. See {@link User.session}. + * @param group Group name to remove from. + */ + idempotent void removeUserFromGroup(int channelid, int session, string group) throws ServerBootedException, InvalidChannelException, InvalidSessionException, InvalidSecretException; + + /** Redirect whisper targets for user. If set, whenever a user tries to whisper to group "source", the whisper will be redirected to group "target". + * To remove a redirect pass an empty target string. This is intended for context groups. + * @param session Connection ID of user. See {@link User.session}. + * @param source Group name to redirect from. + * @param target Group name to redirect to. + */ + idempotent void redirectWhisperGroup(int session, string source, string target) throws ServerBootedException, InvalidSessionException, InvalidSecretException; + + /** Map a list of {@link User.userid} to a matching name. + * @param List of ids. + * @return Matching list of names, with an empty string representing invalid or unknown ids. + */ + idempotent NameMap getUserNames(IdList ids) throws ServerBootedException, InvalidSecretException; + + /** Map a list of user names to a matching id. + * @param List of names. + * @reuturn List of matching ids, with -1 representing invalid or unknown user names. + */ + idempotent IdMap getUserIds(NameList names) throws ServerBootedException, InvalidSecretException; + + /** Register a new user. + * @param info Information about new user. Must include at least "name". + * @return The ID of the user. See {@link RegisteredUser.userid}. + */ + int registerUser(UserInfoMap info) throws ServerBootedException, InvalidUserException, InvalidSecretException, ReadOnlyModeException; + + /** Remove a user registration. + * @param userid ID of registered user. See {@link RegisteredUser.userid}. + */ + void unregisterUser(int userid) throws ServerBootedException, InvalidUserException, InvalidSecretException, ReadOnlyModeException; + + /** Update the registration for a user. You can use this to set the email or password of a user, + * and can also use it to change the user's name. + * @param registration Updated registration record. + */ + idempotent void updateRegistration(int userid, UserInfoMap info) throws ServerBootedException, InvalidUserException, InvalidSecretException, ReadOnlyModeException; + + /** Fetch registration for a single user. + * @param userid ID of registered user. See {@link RegisteredUser.userid}. + * @return Registration record. + */ + idempotent UserInfoMap getRegistration(int userid) throws ServerBootedException, InvalidUserException, InvalidSecretException, ReadOnlyModeException; + + /** Fetch a group of registered users. + * @param filter Substring of user name. If blank, will retrieve all registered users. + * @return List of registration records. + */ + idempotent NameMap getRegisteredUsers(string filter) throws ServerBootedException, InvalidSecretException, ReadOnlyModeException; + + /** Verify the password of a user. You can use this to verify a user's credentials. + * @param name User name. See {@link RegisteredUser.name}. + * @param pw User password. + * @return User ID of registered user (See {@link RegisteredUser.userid}), -1 for failed authentication or -2 for unknown usernames. + */ + idempotent int verifyPassword(string name, string pw) throws ServerBootedException, InvalidSecretException, ReadOnlyModeException; + + /** Fetch user texture. Textures are stored as zlib compress()ed 600x60 32-bit BGRA data. + * @param userid ID of registered user. See {@link RegisteredUser.userid}. + * @return Custom texture associated with user or an empty texture. + */ + idempotent Texture getTexture(int userid) throws ServerBootedException, InvalidUserException, InvalidSecretException; + + /** Set a user texture (now called avatar). + * @param userid ID of registered user. See {@link RegisteredUser.userid}. + * @param tex Texture (as a Byte-Array) to set for the user, or an empty texture to remove the existing texture. + */ + idempotent void setTexture(int userid, Texture tex) throws ServerBootedException, InvalidUserException, InvalidTextureException, InvalidSecretException, ReadOnlyModeException; + + /** Get virtual server uptime. + * @return Uptime of the virtual server in seconds + */ + idempotent int getUptime() throws ServerBootedException, InvalidSecretException; + + /** + * Update the server's certificate information. + * + * Reconfigure the running server's TLS socket with the given + * certificate and private key. + * + * The certificate and and private key must be PEM formatted. + * + * New clients will see the new certificate. + * Existing clients will continue to see the certificate the server + * was using when they connected to it. + * + * This method throws InvalidInputDataException if any of the + * following errors happen: + * - Unable to decode the PEM certificate and/or private key. + * - Unable to decrypt the private key with the given passphrase. + * - The certificate and/or private key do not contain RSA keys. + * - The certificate is not usable with the given private key. + */ + idempotent void updateCertificate(string certificate, string privateKey, string passphrase) throws ServerBootedException, InvalidSecretException, InvalidInputDataException, ReadOnlyModeException; + + /** + * Makes the given user start listening to the given channel. + * @param userid The ID of the user + * @param channelid The ID of the channel + */ + idempotent void startListening(int userid, int channelid) throws ServerBootedException, InvalidUserException, ReadOnlyModeException; + + /** + * Makes the given user stop listening to the given channel. + * @param userid The ID of the user + * @param channelid The ID of the channel + */ + idempotent void stopListening(int userid, int channelid) throws ServerBootedException, InvalidUserException, ReadOnlyModeException; + + /** + * @param userid The ID of the user + * @param channelid The ID of the channel + * @returns Whether the given user is currently listening to the given channel + */ + idempotent bool isListening(int userid, int channelid) throws ServerBootedException, InvalidUserException, InvalidSecretException; + + /** + * @param userid The ID of the user + * @returns An ID-list of channels the given user is listening to + */ + idempotent IntList getListeningChannels(int userid) throws ServerBootedException, InvalidSecretException, InvalidUserException; + + /** + * @param channelid The ID of the channel + * @returns An ID-list of users listening to the given channel + */ + idempotent IntList getListeningUsers(int channelid) throws ServerBootedException, InvalidSecretException, InvalidChannelException; + + /** + * @param channelid The ID of the channel + * @param userid The ID of the user + * @returns The volume adjustment set for a listener of the given user in the given channel + */ + idempotent float getListenerVolumeAdjustment(int channelid, int userid) throws ServerBootedException, InvalidUserException, InvalidChannelException; + + /** + * Sets the volume adjustment set for a listener of the given user in the given channel + * @param channelid The ID of the channel + * @param userid The ID of the user + */ + idempotent void setListenerVolumeAdjustment(int channelid, int userid, float volumeAdjustment) throws ServerBootedException, InvalidSecretException, InvalidChannelException, InvalidUserException, ReadOnlyModeException; + + /** + * @param receiverUserIDs list of IDs of the users the message shall be sent to + */ + idempotent void sendWelcomeMessage(IdList receiverUserIDs) throws ServerBootedException, InvalidSecretException, InvalidUserException; + }; + + /** Callback interface for Meta. You can supply an implementation of this to receive notifications + * when servers are stopped or started. + * If an added callback ever throws an exception or goes away, it will be automatically removed. + * Please note that all callbacks are done asynchronously; the server does not wait for the callback to + * complete before continuing processing. + * @see ServerCallback + * @see Meta.addCallback + */ + interface MetaCallback { + /** Called when a server is started. The server is up and running when this event is sent, so all methods that + * need a running server will work. + * @param srv Interface for started server. + */ + void started(Server *srv); + + /** Called when a server is stopped. The server is already stopped when this event is sent, so no methods that + * need a running server will work. + * @param srv Interface for started server. + */ + void stopped(Server *srv); + }; + + sequence ServerList; + + /** This is the meta interface. It is primarily used for retrieving the {@link Server} interfaces for each individual server. + **/ + ["amd"] interface Meta { + /** Fetch interface to specific server. + * @param id Server ID. See {@link Server.getId}. + * @return Interface for specified server, or a null proxy if id is invalid. + */ + idempotent Server *getServer(int id) throws InvalidSecretException; + + /** Create a new server. Call {@link Server.getId} on the returned interface to find it's ID. + * @return Interface for new server. + */ + Server *newServer() throws InvalidSecretException; + + /** Fetch list of all currently running servers. + * @return List of interfaces for running servers. + */ + idempotent ServerList getBootedServers() throws InvalidSecretException; + + /** Fetch list of all defined servers. + * @return List of interfaces for all servers. + */ + idempotent ServerList getAllServers() throws InvalidSecretException; + + /** Fetch default configuration. This returns the configuration items that were set in the configuration file, or + * the built-in default. The individual servers will use these values unless they have been overridden in the + * server specific configuration. The only special case is the port, which defaults to the value defined here + + * the servers ID - 1 (so that virtual server #1 uses the defined port, server #2 uses port+1 etc). + * @return Default configuration of the servers. + */ + idempotent ConfigMap getDefaultConf() throws InvalidSecretException; + + /** Fetch version of the server. + * @param major Major version. + * @param minor Minor version. + * @param patch Patchlevel. + * @param text Textual representation of version. Note that this may not match the {@link major}, {@link minor} and {@link patch} levels, as it + * may be simply the compile date or the SVN revision. This is usually the text you want to present to users. + */ + idempotent void getVersion(out int major, out int minor, out int patch, out string text); + + /** Add a callback. The callback will receive notifications when servers are started or stopped. + * + * @param cb Callback interface which will receive notifications. + */ + void addCallback(MetaCallback *cb) throws InvalidCallbackException, InvalidSecretException; + + /** Remove a callback. + * + * @param cb Callback interface to be removed. + */ + void removeCallback(MetaCallback *cb) throws InvalidCallbackException, InvalidSecretException; + + /** Get the server's uptime. + * @return Uptime of the server in seconds + */ + idempotent int getUptime(); + + /** Get slice file. + * @return Contents of the slice file server compiled with. + */ + idempotent string getSlice(); + + /** Returns a checksum dict for the slice file. + * @return Checksum dict + */ + + /** + * @returns The state the underlying database is currently assumed to be in + */ + idempotent DBState getAssumedDatabaseState() throws InvalidSecretException; + + /** + * Sets the assumed state of the underlying database + */ + idempotent void setAssumedDatabaseState(DBState state) throws InvalidSecretException, ReadOnlyModeException; + }; +}; diff --git a/MumbleServer/ACL.py b/MumbleServer/ACL.py new file mode 100644 index 0000000..d7ccdc1 --- /dev/null +++ b/MumbleServer/ACL.py @@ -0,0 +1,59 @@ +# Copyright (c) ZeroC, Inc. + +# slice2py version 3.8.1 + +from __future__ import annotations +import IcePy + +from dataclasses import dataclass + + +@dataclass(order=True, unsafe_hash=True) +class ACL: + """ + Access Control List for a channel. ACLs are defined per channel, and can be inherited from parent channels. + + Attributes + ---------- + applyHere : bool + Does the ACL apply to this channel? + applySubs : bool + Does the ACL apply to subchannels? + inherited : bool + Is this ACL inherited from a parent channel? Read-only. + userid : int + ID of user this ACL applies to. -1 if using a group name. + group : str + Group this ACL applies to. Blank if using userid. + allow : int + Binary mask of privileges to allow. + deny : int + Binary mask of privileges to deny. + + Notes + ----- + The Slice compiler generated this dataclass from Slice struct ``::MumbleServer::ACL``. + """ + applyHere: bool = False + applySubs: bool = False + inherited: bool = False + userid: int = 0 + group: str = "" + allow: int = 0 + deny: int = 0 + +_MumbleServer_ACL_t = IcePy.defineStruct( + "::MumbleServer::ACL", + ACL, + (), + ( + ("applyHere", (), IcePy._t_bool), + ("applySubs", (), IcePy._t_bool), + ("inherited", (), IcePy._t_bool), + ("userid", (), IcePy._t_int), + ("group", (), IcePy._t_string), + ("allow", (), IcePy._t_int), + ("deny", (), IcePy._t_int) + )) + +__all__ = ["ACL", "_MumbleServer_ACL_t"] diff --git a/MumbleServer/ACLList.py b/MumbleServer/ACLList.py new file mode 100644 index 0000000..655cf58 --- /dev/null +++ b/MumbleServer/ACLList.py @@ -0,0 +1,12 @@ +# Copyright (c) ZeroC, Inc. + +# slice2py version 3.8.1 + +from __future__ import annotations +import IcePy + +from MumbleServer.ACL import _MumbleServer_ACL_t + +_MumbleServer_ACLList_t = IcePy.defineSequence("::MumbleServer::ACLList", (), _MumbleServer_ACL_t) + +__all__ = ["_MumbleServer_ACLList_t"] diff --git a/MumbleServer/Ban.py b/MumbleServer/Ban.py new file mode 100644 index 0000000..3da0c21 --- /dev/null +++ b/MumbleServer/Ban.py @@ -0,0 +1,67 @@ +# Copyright (c) ZeroC, Inc. + +# slice2py version 3.8.1 + +from __future__ import annotations +import IcePy + +from MumbleServer.NetAddress import _MumbleServer_NetAddress_t + +from dataclasses import dataclass +from dataclasses import field + +from typing import TYPE_CHECKING + +if TYPE_CHECKING: + from collections.abc import Buffer + + +@dataclass +class Ban: + """ + A single ip mask for a ban. + + Attributes + ---------- + address : bytes + Address to ban. + bits : int + Number of bits in ban to apply. + name : str + Username associated with ban. + hash : str + Hash of banned user. + reason : str + Reason for ban. + start : int + Date ban was applied in unix time format. + duration : int + Duration of ban. + + Notes + ----- + The Slice compiler generated this dataclass from Slice struct ``::MumbleServer::Ban``. + """ + address: bytes = field(default_factory=bytes) + bits: int = 0 + name: str = "" + hash: str = "" + reason: str = "" + start: int = 0 + duration: int = 0 + +_MumbleServer_Ban_t = IcePy.defineStruct( + "::MumbleServer::Ban", + Ban, + (), + ( + ("address", (), _MumbleServer_NetAddress_t), + ("bits", (), IcePy._t_int), + ("name", (), IcePy._t_string), + ("hash", (), IcePy._t_string), + ("reason", (), IcePy._t_string), + ("start", (), IcePy._t_int), + ("duration", (), IcePy._t_int) + )) + +__all__ = ["Ban", "_MumbleServer_Ban_t"] diff --git a/MumbleServer/BanList.py b/MumbleServer/BanList.py new file mode 100644 index 0000000..2a2b04e --- /dev/null +++ b/MumbleServer/BanList.py @@ -0,0 +1,12 @@ +# Copyright (c) ZeroC, Inc. + +# slice2py version 3.8.1 + +from __future__ import annotations +import IcePy + +from MumbleServer.Ban import _MumbleServer_Ban_t + +_MumbleServer_BanList_t = IcePy.defineSequence("::MumbleServer::BanList", (), _MumbleServer_Ban_t) + +__all__ = ["_MumbleServer_BanList_t"] diff --git a/MumbleServer/CertificateDer.py b/MumbleServer/CertificateDer.py new file mode 100644 index 0000000..7f01576 --- /dev/null +++ b/MumbleServer/CertificateDer.py @@ -0,0 +1,10 @@ +# Copyright (c) ZeroC, Inc. + +# slice2py version 3.8.1 + +from __future__ import annotations +import IcePy + +_MumbleServer_CertificateDer_t = IcePy.defineSequence("::MumbleServer::CertificateDer", (), IcePy._t_byte) + +__all__ = ["_MumbleServer_CertificateDer_t"] diff --git a/MumbleServer/CertificateList.py b/MumbleServer/CertificateList.py new file mode 100644 index 0000000..34a0c89 --- /dev/null +++ b/MumbleServer/CertificateList.py @@ -0,0 +1,12 @@ +# Copyright (c) ZeroC, Inc. + +# slice2py version 3.8.1 + +from __future__ import annotations +import IcePy + +from MumbleServer.CertificateDer import _MumbleServer_CertificateDer_t + +_MumbleServer_CertificateList_t = IcePy.defineSequence("::MumbleServer::CertificateList", (), _MumbleServer_CertificateDer_t) + +__all__ = ["_MumbleServer_CertificateList_t"] diff --git a/MumbleServer/Channel.py b/MumbleServer/Channel.py new file mode 100644 index 0000000..f6ab708 --- /dev/null +++ b/MumbleServer/Channel.py @@ -0,0 +1,67 @@ +# Copyright (c) ZeroC, Inc. + +# slice2py version 3.8.1 + +from __future__ import annotations +import IcePy + +from MumbleServer.IntList import _MumbleServer_IntList_t + +from dataclasses import dataclass +from dataclasses import field + +from typing import TYPE_CHECKING + +if TYPE_CHECKING: + from collections.abc import Buffer + + +@dataclass +class Channel: + """ + A channel. + + Attributes + ---------- + id : int + Channel ID. This is unique per channel, and the root channel is always id 0. + name : str + Name of the channel. There can not be two channels with the same parent that has the same name. + parent : int + ID of parent channel, or -1 if this is the root channel. + links : list[int] + List of id of linked channels. + description : str + Description of channel. Shown as tooltip for this channel. + temporary : bool + Channel is temporary, and will be removed when the last user leaves it. Read-only. + position : int + Position of the channel which is used in Client for sorting. + + Notes + ----- + The Slice compiler generated this dataclass from Slice struct ``::MumbleServer::Channel``. + """ + id: int = 0 + name: str = "" + parent: int = 0 + links: list[int] = field(default_factory=list) + description: str = "" + temporary: bool = False + position: int = 0 + +_MumbleServer_Channel_t = IcePy.defineStruct( + "::MumbleServer::Channel", + Channel, + (), + ( + ("id", (), IcePy._t_int), + ("name", (), IcePy._t_string), + ("parent", (), IcePy._t_int), + ("links", (), _MumbleServer_IntList_t), + ("description", (), IcePy._t_string), + ("temporary", (), IcePy._t_bool), + ("position", (), IcePy._t_int) + )) + +__all__ = ["Channel", "_MumbleServer_Channel_t"] diff --git a/MumbleServer/ChannelInfo.py b/MumbleServer/ChannelInfo.py new file mode 100644 index 0000000..6caf642 --- /dev/null +++ b/MumbleServer/ChannelInfo.py @@ -0,0 +1,31 @@ +# Copyright (c) ZeroC, Inc. + +# slice2py version 3.8.1 + +from __future__ import annotations +import IcePy + +from enum import Enum + +class ChannelInfo(Enum): + """ + Notes + ----- + The Slice compiler generated this enum class from Slice enumeration ``::MumbleServer::ChannelInfo``. + """ + + ChannelDescription = 0 + + ChannelPosition = 1 + +_MumbleServer_ChannelInfo_t = IcePy.defineEnum( + "::MumbleServer::ChannelInfo", + ChannelInfo, + (), + { + 0: ChannelInfo.ChannelDescription, + 1: ChannelInfo.ChannelPosition, + } +) + +__all__ = ["ChannelInfo", "_MumbleServer_ChannelInfo_t"] diff --git a/MumbleServer/ChannelList.py b/MumbleServer/ChannelList.py new file mode 100644 index 0000000..b8dc1f2 --- /dev/null +++ b/MumbleServer/ChannelList.py @@ -0,0 +1,12 @@ +# Copyright (c) ZeroC, Inc. + +# slice2py version 3.8.1 + +from __future__ import annotations +import IcePy + +from MumbleServer.Channel import _MumbleServer_Channel_t + +_MumbleServer_ChannelList_t = IcePy.defineSequence("::MumbleServer::ChannelList", (), _MumbleServer_Channel_t) + +__all__ = ["_MumbleServer_ChannelList_t"] diff --git a/MumbleServer/ChannelMap.py b/MumbleServer/ChannelMap.py new file mode 100644 index 0000000..ebf400e --- /dev/null +++ b/MumbleServer/ChannelMap.py @@ -0,0 +1,12 @@ +# Copyright (c) ZeroC, Inc. + +# slice2py version 3.8.1 + +from __future__ import annotations +import IcePy + +from MumbleServer.Channel import _MumbleServer_Channel_t + +_MumbleServer_ChannelMap_t = IcePy.defineDictionary("::MumbleServer::ChannelMap", (), IcePy._t_int, _MumbleServer_Channel_t) + +__all__ = ["_MumbleServer_ChannelMap_t"] diff --git a/MumbleServer/ConfigMap.py b/MumbleServer/ConfigMap.py new file mode 100644 index 0000000..f09ce3e --- /dev/null +++ b/MumbleServer/ConfigMap.py @@ -0,0 +1,10 @@ +# Copyright (c) ZeroC, Inc. + +# slice2py version 3.8.1 + +from __future__ import annotations +import IcePy + +_MumbleServer_ConfigMap_t = IcePy.defineDictionary("::MumbleServer::ConfigMap", (), IcePy._t_string, IcePy._t_string) + +__all__ = ["_MumbleServer_ConfigMap_t"] diff --git a/MumbleServer/ContextChannel.py b/MumbleServer/ContextChannel.py new file mode 100644 index 0000000..20c7615 --- /dev/null +++ b/MumbleServer/ContextChannel.py @@ -0,0 +1,18 @@ +# Copyright (c) ZeroC, Inc. + +# slice2py version 3.8.1 + +from __future__ import annotations +import IcePy + + +ContextChannel = 2 +""" +Context for actions in the Channel menu. + +Notes +----- + The Slice compiler generated this constant from Slice constant ``::MumbleServer::ContextChannel``. +""" + +__all__ = ["ContextChannel"] diff --git a/MumbleServer/ContextServer.py b/MumbleServer/ContextServer.py new file mode 100644 index 0000000..62791a7 --- /dev/null +++ b/MumbleServer/ContextServer.py @@ -0,0 +1,18 @@ +# Copyright (c) ZeroC, Inc. + +# slice2py version 3.8.1 + +from __future__ import annotations +import IcePy + + +ContextServer = 1 +""" +Context for actions in the Server menu. + +Notes +----- + The Slice compiler generated this constant from Slice constant ``::MumbleServer::ContextServer``. +""" + +__all__ = ["ContextServer"] diff --git a/MumbleServer/ContextUser.py b/MumbleServer/ContextUser.py new file mode 100644 index 0000000..1f3630c --- /dev/null +++ b/MumbleServer/ContextUser.py @@ -0,0 +1,18 @@ +# Copyright (c) ZeroC, Inc. + +# slice2py version 3.8.1 + +from __future__ import annotations +import IcePy + + +ContextUser = 4 +""" +Context for actions in the User menu. + +Notes +----- + The Slice compiler generated this constant from Slice constant ``::MumbleServer::ContextUser``. +""" + +__all__ = ["ContextUser"] diff --git a/MumbleServer/DBState.py b/MumbleServer/DBState.py new file mode 100644 index 0000000..6c4cf1a --- /dev/null +++ b/MumbleServer/DBState.py @@ -0,0 +1,33 @@ +# Copyright (c) ZeroC, Inc. + +# slice2py version 3.8.1 + +from __future__ import annotations +import IcePy + +from enum import Enum + +class DBState(Enum): + """ + Different states of the underlying database + + Notes + ----- + The Slice compiler generated this enum class from Slice enumeration ``::MumbleServer::DBState``. + """ + + Normal = 0 + + ReadOnly = 1 + +_MumbleServer_DBState_t = IcePy.defineEnum( + "::MumbleServer::DBState", + DBState, + (), + { + 0: DBState.Normal, + 1: DBState.ReadOnly, + } +) + +__all__ = ["DBState", "_MumbleServer_DBState_t"] diff --git a/MumbleServer/Group.py b/MumbleServer/Group.py new file mode 100644 index 0000000..1588015 --- /dev/null +++ b/MumbleServer/Group.py @@ -0,0 +1,67 @@ +# Copyright (c) ZeroC, Inc. + +# slice2py version 3.8.1 + +from __future__ import annotations +import IcePy + +from MumbleServer.IntList import _MumbleServer_IntList_t + +from dataclasses import dataclass +from dataclasses import field + +from typing import TYPE_CHECKING + +if TYPE_CHECKING: + from collections.abc import Buffer + + +@dataclass +class Group: + """ + A group. Groups are defined per channel, and can inherit members from parent channels. + + Attributes + ---------- + name : str + Group name + inherited : bool + Is this group inherited from a parent channel? Read-only. + inherit : bool + Does this group inherit members from parent channels? + inheritable : bool + Can subchannels inherit members from this group? + add : list[int] + List of users to add to the group. + remove : list[int] + List of inherited users to remove from the group. + members : list[int] + Current members of the group, including inherited members. Read-only. + + Notes + ----- + The Slice compiler generated this dataclass from Slice struct ``::MumbleServer::Group``. + """ + name: str = "" + inherited: bool = False + inherit: bool = False + inheritable: bool = False + add: list[int] = field(default_factory=list) + remove: list[int] = field(default_factory=list) + members: list[int] = field(default_factory=list) + +_MumbleServer_Group_t = IcePy.defineStruct( + "::MumbleServer::Group", + Group, + (), + ( + ("name", (), IcePy._t_string), + ("inherited", (), IcePy._t_bool), + ("inherit", (), IcePy._t_bool), + ("inheritable", (), IcePy._t_bool), + ("add", (), _MumbleServer_IntList_t), + ("remove", (), _MumbleServer_IntList_t), + ("members", (), _MumbleServer_IntList_t) + )) + +__all__ = ["Group", "_MumbleServer_Group_t"] diff --git a/MumbleServer/GroupList.py b/MumbleServer/GroupList.py new file mode 100644 index 0000000..be988cf --- /dev/null +++ b/MumbleServer/GroupList.py @@ -0,0 +1,12 @@ +# Copyright (c) ZeroC, Inc. + +# slice2py version 3.8.1 + +from __future__ import annotations +import IcePy + +from MumbleServer.Group import _MumbleServer_Group_t + +_MumbleServer_GroupList_t = IcePy.defineSequence("::MumbleServer::GroupList", (), _MumbleServer_Group_t) + +__all__ = ["_MumbleServer_GroupList_t"] diff --git a/MumbleServer/GroupNameList.py b/MumbleServer/GroupNameList.py new file mode 100644 index 0000000..4f09a22 --- /dev/null +++ b/MumbleServer/GroupNameList.py @@ -0,0 +1,10 @@ +# Copyright (c) ZeroC, Inc. + +# slice2py version 3.8.1 + +from __future__ import annotations +import IcePy + +_MumbleServer_GroupNameList_t = IcePy.defineSequence("::MumbleServer::GroupNameList", (), IcePy._t_string) + +__all__ = ["_MumbleServer_GroupNameList_t"] diff --git a/MumbleServer/IdList.py b/MumbleServer/IdList.py new file mode 100644 index 0000000..8a984cd --- /dev/null +++ b/MumbleServer/IdList.py @@ -0,0 +1,10 @@ +# Copyright (c) ZeroC, Inc. + +# slice2py version 3.8.1 + +from __future__ import annotations +import IcePy + +_MumbleServer_IdList_t = IcePy.defineSequence("::MumbleServer::IdList", (), IcePy._t_int) + +__all__ = ["_MumbleServer_IdList_t"] diff --git a/MumbleServer/IdMap.py b/MumbleServer/IdMap.py new file mode 100644 index 0000000..08fb757 --- /dev/null +++ b/MumbleServer/IdMap.py @@ -0,0 +1,10 @@ +# Copyright (c) ZeroC, Inc. + +# slice2py version 3.8.1 + +from __future__ import annotations +import IcePy + +_MumbleServer_IdMap_t = IcePy.defineDictionary("::MumbleServer::IdMap", (), IcePy._t_string, IcePy._t_int) + +__all__ = ["_MumbleServer_IdMap_t"] diff --git a/MumbleServer/IntList.py b/MumbleServer/IntList.py new file mode 100644 index 0000000..1b258a7 --- /dev/null +++ b/MumbleServer/IntList.py @@ -0,0 +1,10 @@ +# Copyright (c) ZeroC, Inc. + +# slice2py version 3.8.1 + +from __future__ import annotations +import IcePy + +_MumbleServer_IntList_t = IcePy.defineSequence("::MumbleServer::IntList", (), IcePy._t_int) + +__all__ = ["_MumbleServer_IntList_t"] diff --git a/MumbleServer/InternalErrorException.py b/MumbleServer/InternalErrorException.py new file mode 100644 index 0000000..cf17bd0 --- /dev/null +++ b/MumbleServer/InternalErrorException.py @@ -0,0 +1,35 @@ +# Copyright (c) ZeroC, Inc. + +# slice2py version 3.8.1 + +from __future__ import annotations +import IcePy + +from MumbleServer.ServerException import ServerException +from MumbleServer.ServerException import _MumbleServer_ServerException_t + +from dataclasses import dataclass + + +@dataclass +class InternalErrorException(ServerException): + """ + Thrown if the server encounters an internal error while processing the request + + Notes + ----- + The Slice compiler generated this exception dataclass from Slice exception ``::MumbleServer::InternalErrorException``. + """ + + _ice_id = "::MumbleServer::InternalErrorException" + +_MumbleServer_InternalErrorException_t = IcePy.defineException( + "::MumbleServer::InternalErrorException", + InternalErrorException, + (), + _MumbleServer_ServerException_t, + ()) + +setattr(InternalErrorException, '_ice_type', _MumbleServer_InternalErrorException_t) + +__all__ = ["InternalErrorException", "_MumbleServer_InternalErrorException_t"] diff --git a/MumbleServer/InvalidCallbackException.py b/MumbleServer/InvalidCallbackException.py new file mode 100644 index 0000000..5091939 --- /dev/null +++ b/MumbleServer/InvalidCallbackException.py @@ -0,0 +1,35 @@ +# Copyright (c) ZeroC, Inc. + +# slice2py version 3.8.1 + +from __future__ import annotations +import IcePy + +from MumbleServer.ServerException import ServerException +from MumbleServer.ServerException import _MumbleServer_ServerException_t + +from dataclasses import dataclass + + +@dataclass +class InvalidCallbackException(ServerException): + """ + This is thrown when you supply an invalid callback. + + Notes + ----- + The Slice compiler generated this exception dataclass from Slice exception ``::MumbleServer::InvalidCallbackException``. + """ + + _ice_id = "::MumbleServer::InvalidCallbackException" + +_MumbleServer_InvalidCallbackException_t = IcePy.defineException( + "::MumbleServer::InvalidCallbackException", + InvalidCallbackException, + (), + _MumbleServer_ServerException_t, + ()) + +setattr(InvalidCallbackException, '_ice_type', _MumbleServer_InvalidCallbackException_t) + +__all__ = ["InvalidCallbackException", "_MumbleServer_InvalidCallbackException_t"] diff --git a/MumbleServer/InvalidChannelException.py b/MumbleServer/InvalidChannelException.py new file mode 100644 index 0000000..dca56b7 --- /dev/null +++ b/MumbleServer/InvalidChannelException.py @@ -0,0 +1,35 @@ +# Copyright (c) ZeroC, Inc. + +# slice2py version 3.8.1 + +from __future__ import annotations +import IcePy + +from MumbleServer.ServerException import ServerException +from MumbleServer.ServerException import _MumbleServer_ServerException_t + +from dataclasses import dataclass + + +@dataclass +class InvalidChannelException(ServerException): + """ + This is thrown when you specify an invalid channel id. This may happen if the channel was removed by another provess. It can also be thrown if you try to add an invalid channel. + + Notes + ----- + The Slice compiler generated this exception dataclass from Slice exception ``::MumbleServer::InvalidChannelException``. + """ + + _ice_id = "::MumbleServer::InvalidChannelException" + +_MumbleServer_InvalidChannelException_t = IcePy.defineException( + "::MumbleServer::InvalidChannelException", + InvalidChannelException, + (), + _MumbleServer_ServerException_t, + ()) + +setattr(InvalidChannelException, '_ice_type', _MumbleServer_InvalidChannelException_t) + +__all__ = ["InvalidChannelException", "_MumbleServer_InvalidChannelException_t"] diff --git a/MumbleServer/InvalidInputDataException.py b/MumbleServer/InvalidInputDataException.py new file mode 100644 index 0000000..cad49c8 --- /dev/null +++ b/MumbleServer/InvalidInputDataException.py @@ -0,0 +1,35 @@ +# Copyright (c) ZeroC, Inc. + +# slice2py version 3.8.1 + +from __future__ import annotations +import IcePy + +from MumbleServer.ServerException import ServerException +from MumbleServer.ServerException import _MumbleServer_ServerException_t + +from dataclasses import dataclass + + +@dataclass +class InvalidInputDataException(ServerException): + """ + This is thrown when invalid input data was specified. + + Notes + ----- + The Slice compiler generated this exception dataclass from Slice exception ``::MumbleServer::InvalidInputDataException``. + """ + + _ice_id = "::MumbleServer::InvalidInputDataException" + +_MumbleServer_InvalidInputDataException_t = IcePy.defineException( + "::MumbleServer::InvalidInputDataException", + InvalidInputDataException, + (), + _MumbleServer_ServerException_t, + ()) + +setattr(InvalidInputDataException, '_ice_type', _MumbleServer_InvalidInputDataException_t) + +__all__ = ["InvalidInputDataException", "_MumbleServer_InvalidInputDataException_t"] diff --git a/MumbleServer/InvalidListenerException.py b/MumbleServer/InvalidListenerException.py new file mode 100644 index 0000000..ca38372 --- /dev/null +++ b/MumbleServer/InvalidListenerException.py @@ -0,0 +1,35 @@ +# Copyright (c) ZeroC, Inc. + +# slice2py version 3.8.1 + +from __future__ import annotations +import IcePy + +from MumbleServer.ServerException import ServerException +from MumbleServer.ServerException import _MumbleServer_ServerException_t + +from dataclasses import dataclass + + +@dataclass +class InvalidListenerException(ServerException): + """ + This is thrown when the referenced channel listener does not actually exist + + Notes + ----- + The Slice compiler generated this exception dataclass from Slice exception ``::MumbleServer::InvalidListenerException``. + """ + + _ice_id = "::MumbleServer::InvalidListenerException" + +_MumbleServer_InvalidListenerException_t = IcePy.defineException( + "::MumbleServer::InvalidListenerException", + InvalidListenerException, + (), + _MumbleServer_ServerException_t, + ()) + +setattr(InvalidListenerException, '_ice_type', _MumbleServer_InvalidListenerException_t) + +__all__ = ["InvalidListenerException", "_MumbleServer_InvalidListenerException_t"] diff --git a/MumbleServer/InvalidSecretException.py b/MumbleServer/InvalidSecretException.py new file mode 100644 index 0000000..884c66d --- /dev/null +++ b/MumbleServer/InvalidSecretException.py @@ -0,0 +1,35 @@ +# Copyright (c) ZeroC, Inc. + +# slice2py version 3.8.1 + +from __future__ import annotations +import IcePy + +from MumbleServer.ServerException import ServerException +from MumbleServer.ServerException import _MumbleServer_ServerException_t + +from dataclasses import dataclass + + +@dataclass +class InvalidSecretException(ServerException): + """ + This is thrown when you supply the wrong secret in the calling context. + + Notes + ----- + The Slice compiler generated this exception dataclass from Slice exception ``::MumbleServer::InvalidSecretException``. + """ + + _ice_id = "::MumbleServer::InvalidSecretException" + +_MumbleServer_InvalidSecretException_t = IcePy.defineException( + "::MumbleServer::InvalidSecretException", + InvalidSecretException, + (), + _MumbleServer_ServerException_t, + ()) + +setattr(InvalidSecretException, '_ice_type', _MumbleServer_InvalidSecretException_t) + +__all__ = ["InvalidSecretException", "_MumbleServer_InvalidSecretException_t"] diff --git a/MumbleServer/InvalidServerException.py b/MumbleServer/InvalidServerException.py new file mode 100644 index 0000000..ab1acf6 --- /dev/null +++ b/MumbleServer/InvalidServerException.py @@ -0,0 +1,35 @@ +# Copyright (c) ZeroC, Inc. + +# slice2py version 3.8.1 + +from __future__ import annotations +import IcePy + +from MumbleServer.ServerException import ServerException +from MumbleServer.ServerException import _MumbleServer_ServerException_t + +from dataclasses import dataclass + + +@dataclass +class InvalidServerException(ServerException): + """ + This is thrown when you try to do an operation on a server that does not exist. This may happen if someone has removed the server. + + Notes + ----- + The Slice compiler generated this exception dataclass from Slice exception ``::MumbleServer::InvalidServerException``. + """ + + _ice_id = "::MumbleServer::InvalidServerException" + +_MumbleServer_InvalidServerException_t = IcePy.defineException( + "::MumbleServer::InvalidServerException", + InvalidServerException, + (), + _MumbleServer_ServerException_t, + ()) + +setattr(InvalidServerException, '_ice_type', _MumbleServer_InvalidServerException_t) + +__all__ = ["InvalidServerException", "_MumbleServer_InvalidServerException_t"] diff --git a/MumbleServer/InvalidSessionException.py b/MumbleServer/InvalidSessionException.py new file mode 100644 index 0000000..33a8eee --- /dev/null +++ b/MumbleServer/InvalidSessionException.py @@ -0,0 +1,35 @@ +# Copyright (c) ZeroC, Inc. + +# slice2py version 3.8.1 + +from __future__ import annotations +import IcePy + +from MumbleServer.ServerException import ServerException +from MumbleServer.ServerException import _MumbleServer_ServerException_t + +from dataclasses import dataclass + + +@dataclass +class InvalidSessionException(ServerException): + """ + This is thrown when you specify an invalid session. This may happen if the user has disconnected since your last call to ``Server.getUsers``. See ``User.session`` + + Notes + ----- + The Slice compiler generated this exception dataclass from Slice exception ``::MumbleServer::InvalidSessionException``. + """ + + _ice_id = "::MumbleServer::InvalidSessionException" + +_MumbleServer_InvalidSessionException_t = IcePy.defineException( + "::MumbleServer::InvalidSessionException", + InvalidSessionException, + (), + _MumbleServer_ServerException_t, + ()) + +setattr(InvalidSessionException, '_ice_type', _MumbleServer_InvalidSessionException_t) + +__all__ = ["InvalidSessionException", "_MumbleServer_InvalidSessionException_t"] diff --git a/MumbleServer/InvalidTextureException.py b/MumbleServer/InvalidTextureException.py new file mode 100644 index 0000000..695db2b --- /dev/null +++ b/MumbleServer/InvalidTextureException.py @@ -0,0 +1,35 @@ +# Copyright (c) ZeroC, Inc. + +# slice2py version 3.8.1 + +from __future__ import annotations +import IcePy + +from MumbleServer.ServerException import ServerException +from MumbleServer.ServerException import _MumbleServer_ServerException_t + +from dataclasses import dataclass + + +@dataclass +class InvalidTextureException(ServerException): + """ + This is thrown when you try to set an invalid texture. + + Notes + ----- + The Slice compiler generated this exception dataclass from Slice exception ``::MumbleServer::InvalidTextureException``. + """ + + _ice_id = "::MumbleServer::InvalidTextureException" + +_MumbleServer_InvalidTextureException_t = IcePy.defineException( + "::MumbleServer::InvalidTextureException", + InvalidTextureException, + (), + _MumbleServer_ServerException_t, + ()) + +setattr(InvalidTextureException, '_ice_type', _MumbleServer_InvalidTextureException_t) + +__all__ = ["InvalidTextureException", "_MumbleServer_InvalidTextureException_t"] diff --git a/MumbleServer/InvalidUserException.py b/MumbleServer/InvalidUserException.py new file mode 100644 index 0000000..622c20d --- /dev/null +++ b/MumbleServer/InvalidUserException.py @@ -0,0 +1,35 @@ +# Copyright (c) ZeroC, Inc. + +# slice2py version 3.8.1 + +from __future__ import annotations +import IcePy + +from MumbleServer.ServerException import ServerException +from MumbleServer.ServerException import _MumbleServer_ServerException_t + +from dataclasses import dataclass + + +@dataclass +class InvalidUserException(ServerException): + """ + This is thrown when you specify an invalid userid. + + Notes + ----- + The Slice compiler generated this exception dataclass from Slice exception ``::MumbleServer::InvalidUserException``. + """ + + _ice_id = "::MumbleServer::InvalidUserException" + +_MumbleServer_InvalidUserException_t = IcePy.defineException( + "::MumbleServer::InvalidUserException", + InvalidUserException, + (), + _MumbleServer_ServerException_t, + ()) + +setattr(InvalidUserException, '_ice_type', _MumbleServer_InvalidUserException_t) + +__all__ = ["InvalidUserException", "_MumbleServer_InvalidUserException_t"] diff --git a/MumbleServer/LogEntry.py b/MumbleServer/LogEntry.py new file mode 100644 index 0000000..691ddc3 --- /dev/null +++ b/MumbleServer/LogEntry.py @@ -0,0 +1,39 @@ +# Copyright (c) ZeroC, Inc. + +# slice2py version 3.8.1 + +from __future__ import annotations +import IcePy + +from dataclasses import dataclass + + +@dataclass(order=True, unsafe_hash=True) +class LogEntry: + """ + A entry in the log. + + Attributes + ---------- + timestamp : int + Timestamp in UNIX time_t + txt : str + The log message. + + Notes + ----- + The Slice compiler generated this dataclass from Slice struct ``::MumbleServer::LogEntry``. + """ + timestamp: int = 0 + txt: str = "" + +_MumbleServer_LogEntry_t = IcePy.defineStruct( + "::MumbleServer::LogEntry", + LogEntry, + (), + ( + ("timestamp", (), IcePy._t_int), + ("txt", (), IcePy._t_string) + )) + +__all__ = ["LogEntry", "_MumbleServer_LogEntry_t"] diff --git a/MumbleServer/LogList.py b/MumbleServer/LogList.py new file mode 100644 index 0000000..0a86894 --- /dev/null +++ b/MumbleServer/LogList.py @@ -0,0 +1,12 @@ +# Copyright (c) ZeroC, Inc. + +# slice2py version 3.8.1 + +from __future__ import annotations +import IcePy + +from MumbleServer.LogEntry import _MumbleServer_LogEntry_t + +_MumbleServer_LogList_t = IcePy.defineSequence("::MumbleServer::LogList", (), _MumbleServer_LogEntry_t) + +__all__ = ["_MumbleServer_LogList_t"] diff --git a/MumbleServer/Meta.py b/MumbleServer/Meta.py new file mode 100644 index 0000000..e371b7d --- /dev/null +++ b/MumbleServer/Meta.py @@ -0,0 +1,837 @@ +# Copyright (c) ZeroC, Inc. + +# slice2py version 3.8.1 + +from __future__ import annotations +import IcePy + +from Ice.Object import Object + +from Ice.ObjectPrx import ObjectPrx +from Ice.ObjectPrx import checkedCast +from Ice.ObjectPrx import checkedCastAsync +from Ice.ObjectPrx import uncheckedCast + +from Ice.OperationMode import OperationMode + +from MumbleServer.ConfigMap import _MumbleServer_ConfigMap_t + +from MumbleServer.DBState import _MumbleServer_DBState_t + +from MumbleServer.InvalidCallbackException import _MumbleServer_InvalidCallbackException_t + +from MumbleServer.InvalidSecretException import _MumbleServer_InvalidSecretException_t + +from MumbleServer.MetaCallback_forward import _MumbleServer_MetaCallbackPrx_t + +from MumbleServer.Meta_forward import _MumbleServer_MetaPrx_t + +from MumbleServer.ReadOnlyModeException import _MumbleServer_ReadOnlyModeException_t + +from MumbleServer.ServerList import _MumbleServer_ServerList_t + +from MumbleServer.Server_forward import _MumbleServer_ServerPrx_t + +from abc import ABC +from abc import abstractmethod + +from typing import TYPE_CHECKING +from typing import overload + +if TYPE_CHECKING: + from Ice.Current import Current + from MumbleServer.DBState import DBState + from MumbleServer.MetaCallback import MetaCallbackPrx + from MumbleServer.Server import ServerPrx + from collections.abc import Awaitable + from collections.abc import Mapping + from collections.abc import Sequence + + +class MetaPrx(ObjectPrx): + """ + This is the meta interface. It is primarily used for retrieving the :class:`MumbleServer.ServerPrx` interfaces for each individual server. + + Notes + ----- + The Slice compiler generated this proxy class from Slice interface ``::MumbleServer::Meta``. + """ + + def getServer(self, id: int, context: dict[str, str] | None = None) -> ServerPrx | None: + """ + Fetch interface to specific server. + + Parameters + ---------- + id : int + Server ID. See ``Server.getId``. + context : dict[str, str] + The request context for the invocation. + + Returns + ------- + ServerPrx | None + Interface for specified server, or a null proxy if id is invalid. + """ + return Meta._op_getServer.invoke(self, ((id, ), context)) + + def getServerAsync(self, id: int, context: dict[str, str] | None = None) -> Awaitable[ServerPrx | None]: + """ + Fetch interface to specific server. + + Parameters + ---------- + id : int + Server ID. See ``Server.getId``. + context : dict[str, str] + The request context for the invocation. + + Returns + ------- + Awaitable[ServerPrx | None] + Interface for specified server, or a null proxy if id is invalid. + """ + return Meta._op_getServer.invokeAsync(self, ((id, ), context)) + + def newServer(self, context: dict[str, str] | None = None) -> ServerPrx | None: + """ + Create a new server. Call ``Server.getId`` on the returned interface to find it's ID. + + Parameters + ---------- + context : dict[str, str] + The request context for the invocation. + + Returns + ------- + ServerPrx | None + Interface for new server. + """ + return Meta._op_newServer.invoke(self, ((), context)) + + def newServerAsync(self, context: dict[str, str] | None = None) -> Awaitable[ServerPrx | None]: + """ + Create a new server. Call ``Server.getId`` on the returned interface to find it's ID. + + Parameters + ---------- + context : dict[str, str] + The request context for the invocation. + + Returns + ------- + Awaitable[ServerPrx | None] + Interface for new server. + """ + return Meta._op_newServer.invokeAsync(self, ((), context)) + + def getBootedServers(self, context: dict[str, str] | None = None) -> list[ServerPrx | None]: + """ + Fetch list of all currently running servers. + + Parameters + ---------- + context : dict[str, str] + The request context for the invocation. + + Returns + ------- + list[ServerPrx | None] + List of interfaces for running servers. + """ + return Meta._op_getBootedServers.invoke(self, ((), context)) + + def getBootedServersAsync(self, context: dict[str, str] | None = None) -> Awaitable[list[ServerPrx | None]]: + """ + Fetch list of all currently running servers. + + Parameters + ---------- + context : dict[str, str] + The request context for the invocation. + + Returns + ------- + Awaitable[list[ServerPrx | None]] + List of interfaces for running servers. + """ + return Meta._op_getBootedServers.invokeAsync(self, ((), context)) + + def getAllServers(self, context: dict[str, str] | None = None) -> list[ServerPrx | None]: + """ + Fetch list of all defined servers. + + Parameters + ---------- + context : dict[str, str] + The request context for the invocation. + + Returns + ------- + list[ServerPrx | None] + List of interfaces for all servers. + """ + return Meta._op_getAllServers.invoke(self, ((), context)) + + def getAllServersAsync(self, context: dict[str, str] | None = None) -> Awaitable[list[ServerPrx | None]]: + """ + Fetch list of all defined servers. + + Parameters + ---------- + context : dict[str, str] + The request context for the invocation. + + Returns + ------- + Awaitable[list[ServerPrx | None]] + List of interfaces for all servers. + """ + return Meta._op_getAllServers.invokeAsync(self, ((), context)) + + def getDefaultConf(self, context: dict[str, str] | None = None) -> dict[str, str]: + """ + Fetch default configuration. This returns the configuration items that were set in the configuration file, or + the built-in default. The individual servers will use these values unless they have been overridden in the + server specific configuration. The only special case is the port, which defaults to the value defined here + + the servers ID - 1 (so that virtual server #1 uses the defined port, server #2 uses port+1 etc). + + Parameters + ---------- + context : dict[str, str] + The request context for the invocation. + + Returns + ------- + dict[str, str] + Default configuration of the servers. + """ + return Meta._op_getDefaultConf.invoke(self, ((), context)) + + def getDefaultConfAsync(self, context: dict[str, str] | None = None) -> Awaitable[dict[str, str]]: + """ + Fetch default configuration. This returns the configuration items that were set in the configuration file, or + the built-in default. The individual servers will use these values unless they have been overridden in the + server specific configuration. The only special case is the port, which defaults to the value defined here + + the servers ID - 1 (so that virtual server #1 uses the defined port, server #2 uses port+1 etc). + + Parameters + ---------- + context : dict[str, str] + The request context for the invocation. + + Returns + ------- + Awaitable[dict[str, str]] + Default configuration of the servers. + """ + return Meta._op_getDefaultConf.invokeAsync(self, ((), context)) + + def getVersion(self, context: dict[str, str] | None = None) -> tuple[int, int, int, str]: + """ + Fetch version of the server. + + Parameters + ---------- + context : dict[str, str] + The request context for the invocation. + + Returns + ------- + tuple[int, int, int, str] + + A tuple containing: + - int Major version. + - int Minor version. + - int Patchlevel. + - str Textual representation of version. Note that this may not match the ``major``, ``minor`` and ``patch`` levels, as it + may be simply the compile date or the SVN revision. This is usually the text you want to present to users. + """ + return Meta._op_getVersion.invoke(self, ((), context)) + + def getVersionAsync(self, context: dict[str, str] | None = None) -> Awaitable[tuple[int, int, int, str]]: + """ + Fetch version of the server. + + Parameters + ---------- + context : dict[str, str] + The request context for the invocation. + + Returns + ------- + Awaitable[tuple[int, int, int, str]] + + A tuple containing: + - int Major version. + - int Minor version. + - int Patchlevel. + - str Textual representation of version. Note that this may not match the ``major``, ``minor`` and ``patch`` levels, as it + may be simply the compile date or the SVN revision. This is usually the text you want to present to users. + """ + return Meta._op_getVersion.invokeAsync(self, ((), context)) + + def addCallback(self, cb: MetaCallbackPrx | None, context: dict[str, str] | None = None) -> None: + """ + Add a callback. The callback will receive notifications when servers are started or stopped. + + Parameters + ---------- + cb : MetaCallbackPrx | None + Callback interface which will receive notifications. + context : dict[str, str] + The request context for the invocation. + """ + return Meta._op_addCallback.invoke(self, ((cb, ), context)) + + def addCallbackAsync(self, cb: MetaCallbackPrx | None, context: dict[str, str] | None = None) -> Awaitable[None]: + """ + Add a callback. The callback will receive notifications when servers are started or stopped. + + Parameters + ---------- + cb : MetaCallbackPrx | None + Callback interface which will receive notifications. + context : dict[str, str] + The request context for the invocation. + + Returns + ------- + Awaitable[None] + An awaitable that is completed when the invocation completes. + """ + return Meta._op_addCallback.invokeAsync(self, ((cb, ), context)) + + def removeCallback(self, cb: MetaCallbackPrx | None, context: dict[str, str] | None = None) -> None: + """ + Remove a callback. + + Parameters + ---------- + cb : MetaCallbackPrx | None + Callback interface to be removed. + context : dict[str, str] + The request context for the invocation. + """ + return Meta._op_removeCallback.invoke(self, ((cb, ), context)) + + def removeCallbackAsync(self, cb: MetaCallbackPrx | None, context: dict[str, str] | None = None) -> Awaitable[None]: + """ + Remove a callback. + + Parameters + ---------- + cb : MetaCallbackPrx | None + Callback interface to be removed. + context : dict[str, str] + The request context for the invocation. + + Returns + ------- + Awaitable[None] + An awaitable that is completed when the invocation completes. + """ + return Meta._op_removeCallback.invokeAsync(self, ((cb, ), context)) + + def getUptime(self, context: dict[str, str] | None = None) -> int: + """ + Get the server's uptime. + + Parameters + ---------- + context : dict[str, str] + The request context for the invocation. + + Returns + ------- + int + Uptime of the server in seconds + """ + return Meta._op_getUptime.invoke(self, ((), context)) + + def getUptimeAsync(self, context: dict[str, str] | None = None) -> Awaitable[int]: + """ + Get the server's uptime. + + Parameters + ---------- + context : dict[str, str] + The request context for the invocation. + + Returns + ------- + Awaitable[int] + Uptime of the server in seconds + """ + return Meta._op_getUptime.invokeAsync(self, ((), context)) + + def getSlice(self, context: dict[str, str] | None = None) -> str: + """ + Get slice file. + + Parameters + ---------- + context : dict[str, str] + The request context for the invocation. + + Returns + ------- + str + Contents of the slice file server compiled with. + """ + return Meta._op_getSlice.invoke(self, ((), context)) + + def getSliceAsync(self, context: dict[str, str] | None = None) -> Awaitable[str]: + """ + Get slice file. + + Parameters + ---------- + context : dict[str, str] + The request context for the invocation. + + Returns + ------- + Awaitable[str] + Contents of the slice file server compiled with. + """ + return Meta._op_getSlice.invokeAsync(self, ((), context)) + + def getAssumedDatabaseState(self, context: dict[str, str] | None = None) -> DBState: + return Meta._op_getAssumedDatabaseState.invoke(self, ((), context)) + + def getAssumedDatabaseStateAsync(self, context: dict[str, str] | None = None) -> Awaitable[DBState]: + return Meta._op_getAssumedDatabaseState.invokeAsync(self, ((), context)) + + def setAssumedDatabaseState(self, state: DBState, context: dict[str, str] | None = None) -> None: + """ + Sets the assumed state of the underlying database + + Parameters + ---------- + state : DBState + context : dict[str, str] + The request context for the invocation. + """ + return Meta._op_setAssumedDatabaseState.invoke(self, ((state, ), context)) + + def setAssumedDatabaseStateAsync(self, state: DBState, context: dict[str, str] | None = None) -> Awaitable[None]: + """ + Sets the assumed state of the underlying database + + Parameters + ---------- + state : DBState + context : dict[str, str] + The request context for the invocation. + + Returns + ------- + Awaitable[None] + An awaitable that is completed when the invocation completes. + """ + return Meta._op_setAssumedDatabaseState.invokeAsync(self, ((state, ), context)) + + @staticmethod + def checkedCast( + proxy: ObjectPrx | None, + facet: str | None = None, + context: dict[str, str] | None = None + ) -> MetaPrx | None: + return checkedCast(MetaPrx, proxy, facet, context) + + @staticmethod + def checkedCastAsync( + proxy: ObjectPrx | None, + facet: str | None = None, + context: dict[str, str] | None = None + ) -> Awaitable[MetaPrx | None ]: + return checkedCastAsync(MetaPrx, proxy, facet, context) + + @overload + @staticmethod + def uncheckedCast(proxy: ObjectPrx, facet: str | None = None) -> MetaPrx: + ... + + @overload + @staticmethod + def uncheckedCast(proxy: None, facet: str | None = None) -> None: + ... + + @staticmethod + def uncheckedCast(proxy: ObjectPrx | None, facet: str | None = None) -> MetaPrx | None: + return uncheckedCast(MetaPrx, proxy, facet) + + @staticmethod + def ice_staticId() -> str: + return "::MumbleServer::Meta" + +IcePy.defineProxy("::MumbleServer::Meta", MetaPrx) + +class Meta(Object, ABC): + """ + This is the meta interface. It is primarily used for retrieving the :class:`MumbleServer.ServerPrx` interfaces for each individual server. + + Notes + ----- + The Slice compiler generated this skeleton class from Slice interface ``::MumbleServer::Meta``. + """ + + _ice_ids: Sequence[str] = ("::Ice::Object", "::MumbleServer::Meta", ) + _op_getServer: IcePy.Operation + _op_newServer: IcePy.Operation + _op_getBootedServers: IcePy.Operation + _op_getAllServers: IcePy.Operation + _op_getDefaultConf: IcePy.Operation + _op_getVersion: IcePy.Operation + _op_addCallback: IcePy.Operation + _op_removeCallback: IcePy.Operation + _op_getUptime: IcePy.Operation + _op_getSlice: IcePy.Operation + _op_getAssumedDatabaseState: IcePy.Operation + _op_setAssumedDatabaseState: IcePy.Operation + + @staticmethod + def ice_staticId() -> str: + return "::MumbleServer::Meta" + + @abstractmethod + def getServer(self, id: int, current: Current) -> ServerPrx | None | Awaitable[ServerPrx | None]: + """ + Fetch interface to specific server. + + Parameters + ---------- + id : int + Server ID. See ``Server.getId``. + current : Ice.Current + The Current object for the dispatch. + + Returns + ------- + ServerPrx | None | Awaitable[ServerPrx | None] + Interface for specified server, or a null proxy if id is invalid. + """ + pass + + @abstractmethod + def newServer(self, current: Current) -> ServerPrx | None | Awaitable[ServerPrx | None]: + """ + Create a new server. Call ``Server.getId`` on the returned interface to find it's ID. + + Parameters + ---------- + current : Ice.Current + The Current object for the dispatch. + + Returns + ------- + ServerPrx | None | Awaitable[ServerPrx | None] + Interface for new server. + """ + pass + + @abstractmethod + def getBootedServers(self, current: Current) -> Sequence[ServerPrx | None] | Awaitable[Sequence[ServerPrx | None]]: + """ + Fetch list of all currently running servers. + + Parameters + ---------- + current : Ice.Current + The Current object for the dispatch. + + Returns + ------- + Sequence[ServerPrx | None] | Awaitable[Sequence[ServerPrx | None]] + List of interfaces for running servers. + """ + pass + + @abstractmethod + def getAllServers(self, current: Current) -> Sequence[ServerPrx | None] | Awaitable[Sequence[ServerPrx | None]]: + """ + Fetch list of all defined servers. + + Parameters + ---------- + current : Ice.Current + The Current object for the dispatch. + + Returns + ------- + Sequence[ServerPrx | None] | Awaitable[Sequence[ServerPrx | None]] + List of interfaces for all servers. + """ + pass + + @abstractmethod + def getDefaultConf(self, current: Current) -> Mapping[str, str] | Awaitable[Mapping[str, str]]: + """ + Fetch default configuration. This returns the configuration items that were set in the configuration file, or + the built-in default. The individual servers will use these values unless they have been overridden in the + server specific configuration. The only special case is the port, which defaults to the value defined here + + the servers ID - 1 (so that virtual server #1 uses the defined port, server #2 uses port+1 etc). + + Parameters + ---------- + current : Ice.Current + The Current object for the dispatch. + + Returns + ------- + Mapping[str, str] | Awaitable[Mapping[str, str]] + Default configuration of the servers. + """ + pass + + @abstractmethod + def getVersion(self, current: Current) -> tuple[int, int, int, str] | Awaitable[tuple[int, int, int, str]]: + """ + Fetch version of the server. + + Parameters + ---------- + current : Ice.Current + The Current object for the dispatch. + + Returns + ------- + tuple[int, int, int, str] | Awaitable[tuple[int, int, int, str]] + + A tuple containing: + - int Major version. + - int Minor version. + - int Patchlevel. + - str Textual representation of version. Note that this may not match the ``major``, ``minor`` and ``patch`` levels, as it + may be simply the compile date or the SVN revision. This is usually the text you want to present to users. + """ + pass + + @abstractmethod + def addCallback(self, cb: MetaCallbackPrx | None, current: Current) -> None | Awaitable[None]: + """ + Add a callback. The callback will receive notifications when servers are started or stopped. + + Parameters + ---------- + cb : MetaCallbackPrx | None + Callback interface which will receive notifications. + current : Ice.Current + The Current object for the dispatch. + + Returns + ------- + None | Awaitable[None] + None or an awaitable that completes when the dispatch completes. + """ + pass + + @abstractmethod + def removeCallback(self, cb: MetaCallbackPrx | None, current: Current) -> None | Awaitable[None]: + """ + Remove a callback. + + Parameters + ---------- + cb : MetaCallbackPrx | None + Callback interface to be removed. + current : Ice.Current + The Current object for the dispatch. + + Returns + ------- + None | Awaitable[None] + None or an awaitable that completes when the dispatch completes. + """ + pass + + @abstractmethod + def getUptime(self, current: Current) -> int | Awaitable[int]: + """ + Get the server's uptime. + + Parameters + ---------- + current : Ice.Current + The Current object for the dispatch. + + Returns + ------- + int | Awaitable[int] + Uptime of the server in seconds + """ + pass + + @abstractmethod + def getSlice(self, current: Current) -> str | Awaitable[str]: + """ + Get slice file. + + Parameters + ---------- + current : Ice.Current + The Current object for the dispatch. + + Returns + ------- + str | Awaitable[str] + Contents of the slice file server compiled with. + """ + pass + + @abstractmethod + def getAssumedDatabaseState(self, current: Current) -> DBState | Awaitable[DBState]: + pass + + @abstractmethod + def setAssumedDatabaseState(self, state: DBState, current: Current) -> None | Awaitable[None]: + """ + Sets the assumed state of the underlying database + + Parameters + ---------- + state : DBState + current : Ice.Current + The Current object for the dispatch. + + Returns + ------- + None | Awaitable[None] + None or an awaitable that completes when the dispatch completes. + """ + pass + +Meta._op_getServer = IcePy.Operation( + "getServer", + "getServer", + OperationMode.Idempotent, + None, + (), + (((), IcePy._t_int, False, 0),), + (), + ((), _MumbleServer_ServerPrx_t, False, 0), + (_MumbleServer_InvalidSecretException_t,)) + +Meta._op_newServer = IcePy.Operation( + "newServer", + "newServer", + OperationMode.Normal, + None, + (), + (), + (), + ((), _MumbleServer_ServerPrx_t, False, 0), + (_MumbleServer_InvalidSecretException_t,)) + +Meta._op_getBootedServers = IcePy.Operation( + "getBootedServers", + "getBootedServers", + OperationMode.Idempotent, + None, + (), + (), + (), + ((), _MumbleServer_ServerList_t, False, 0), + (_MumbleServer_InvalidSecretException_t,)) + +Meta._op_getAllServers = IcePy.Operation( + "getAllServers", + "getAllServers", + OperationMode.Idempotent, + None, + (), + (), + (), + ((), _MumbleServer_ServerList_t, False, 0), + (_MumbleServer_InvalidSecretException_t,)) + +Meta._op_getDefaultConf = IcePy.Operation( + "getDefaultConf", + "getDefaultConf", + OperationMode.Idempotent, + None, + (), + (), + (), + ((), _MumbleServer_ConfigMap_t, False, 0), + (_MumbleServer_InvalidSecretException_t,)) + +Meta._op_getVersion = IcePy.Operation( + "getVersion", + "getVersion", + OperationMode.Idempotent, + None, + (), + (), + (((), IcePy._t_int, False, 0), ((), IcePy._t_int, False, 0), ((), IcePy._t_int, False, 0), ((), IcePy._t_string, False, 0)), + None, + ()) + +Meta._op_addCallback = IcePy.Operation( + "addCallback", + "addCallback", + OperationMode.Normal, + None, + (), + (((), _MumbleServer_MetaCallbackPrx_t, False, 0),), + (), + None, + (_MumbleServer_InvalidCallbackException_t, _MumbleServer_InvalidSecretException_t)) + +Meta._op_removeCallback = IcePy.Operation( + "removeCallback", + "removeCallback", + OperationMode.Normal, + None, + (), + (((), _MumbleServer_MetaCallbackPrx_t, False, 0),), + (), + None, + (_MumbleServer_InvalidCallbackException_t, _MumbleServer_InvalidSecretException_t)) + +Meta._op_getUptime = IcePy.Operation( + "getUptime", + "getUptime", + OperationMode.Idempotent, + None, + (), + (), + (), + ((), IcePy._t_int, False, 0), + ()) + +Meta._op_getSlice = IcePy.Operation( + "getSlice", + "getSlice", + OperationMode.Idempotent, + None, + (), + (), + (), + ((), IcePy._t_string, False, 0), + ()) + +Meta._op_getAssumedDatabaseState = IcePy.Operation( + "getAssumedDatabaseState", + "getAssumedDatabaseState", + OperationMode.Idempotent, + None, + (), + (), + (), + ((), _MumbleServer_DBState_t, False, 0), + (_MumbleServer_InvalidSecretException_t,)) + +Meta._op_setAssumedDatabaseState = IcePy.Operation( + "setAssumedDatabaseState", + "setAssumedDatabaseState", + OperationMode.Idempotent, + None, + (), + (((), _MumbleServer_DBState_t, False, 0),), + (), + None, + (_MumbleServer_InvalidSecretException_t, _MumbleServer_ReadOnlyModeException_t)) + +__all__ = ["Meta", "MetaPrx", "_MumbleServer_MetaPrx_t"] diff --git a/MumbleServer/MetaCallback.py b/MumbleServer/MetaCallback.py new file mode 100644 index 0000000..f9cee4c --- /dev/null +++ b/MumbleServer/MetaCallback.py @@ -0,0 +1,242 @@ +# Copyright (c) ZeroC, Inc. + +# slice2py version 3.8.1 + +from __future__ import annotations +import IcePy + +from Ice.Object import Object + +from Ice.ObjectPrx import ObjectPrx +from Ice.ObjectPrx import checkedCast +from Ice.ObjectPrx import checkedCastAsync +from Ice.ObjectPrx import uncheckedCast + +from Ice.OperationMode import OperationMode + +from MumbleServer.MetaCallback_forward import _MumbleServer_MetaCallbackPrx_t + +from MumbleServer.Server_forward import _MumbleServer_ServerPrx_t + +from abc import ABC +from abc import abstractmethod + +from typing import TYPE_CHECKING +from typing import overload + +if TYPE_CHECKING: + from Ice.Current import Current + from MumbleServer.Server import ServerPrx + from collections.abc import Awaitable + from collections.abc import Sequence + + +class MetaCallbackPrx(ObjectPrx): + """ + Callback interface for Meta. You can supply an implementation of this to receive notifications + when servers are stopped or started. + If an added callback ever throws an exception or goes away, it will be automatically removed. + Please note that all callbacks are done asynchronously; the server does not wait for the callback to + complete before continuing processing. + + Notes + ----- + The Slice compiler generated this proxy class from Slice interface ``::MumbleServer::MetaCallback``. + + See Also + -------- + :class:`MumbleServer.ServerCallbackPrx` + ``Meta.addCallback`` + """ + + def started(self, srv: ServerPrx | None, context: dict[str, str] | None = None) -> None: + """ + Called when a server is started. The server is up and running when this event is sent, so all methods that + need a running server will work. + + Parameters + ---------- + srv : ServerPrx | None + Interface for started server. + context : dict[str, str] + The request context for the invocation. + """ + return MetaCallback._op_started.invoke(self, ((srv, ), context)) + + def startedAsync(self, srv: ServerPrx | None, context: dict[str, str] | None = None) -> Awaitable[None]: + """ + Called when a server is started. The server is up and running when this event is sent, so all methods that + need a running server will work. + + Parameters + ---------- + srv : ServerPrx | None + Interface for started server. + context : dict[str, str] + The request context for the invocation. + + Returns + ------- + Awaitable[None] + An awaitable that is completed when the invocation completes. + """ + return MetaCallback._op_started.invokeAsync(self, ((srv, ), context)) + + def stopped(self, srv: ServerPrx | None, context: dict[str, str] | None = None) -> None: + """ + Called when a server is stopped. The server is already stopped when this event is sent, so no methods that + need a running server will work. + + Parameters + ---------- + srv : ServerPrx | None + Interface for started server. + context : dict[str, str] + The request context for the invocation. + """ + return MetaCallback._op_stopped.invoke(self, ((srv, ), context)) + + def stoppedAsync(self, srv: ServerPrx | None, context: dict[str, str] | None = None) -> Awaitable[None]: + """ + Called when a server is stopped. The server is already stopped when this event is sent, so no methods that + need a running server will work. + + Parameters + ---------- + srv : ServerPrx | None + Interface for started server. + context : dict[str, str] + The request context for the invocation. + + Returns + ------- + Awaitable[None] + An awaitable that is completed when the invocation completes. + """ + return MetaCallback._op_stopped.invokeAsync(self, ((srv, ), context)) + + @staticmethod + def checkedCast( + proxy: ObjectPrx | None, + facet: str | None = None, + context: dict[str, str] | None = None + ) -> MetaCallbackPrx | None: + return checkedCast(MetaCallbackPrx, proxy, facet, context) + + @staticmethod + def checkedCastAsync( + proxy: ObjectPrx | None, + facet: str | None = None, + context: dict[str, str] | None = None + ) -> Awaitable[MetaCallbackPrx | None ]: + return checkedCastAsync(MetaCallbackPrx, proxy, facet, context) + + @overload + @staticmethod + def uncheckedCast(proxy: ObjectPrx, facet: str | None = None) -> MetaCallbackPrx: + ... + + @overload + @staticmethod + def uncheckedCast(proxy: None, facet: str | None = None) -> None: + ... + + @staticmethod + def uncheckedCast(proxy: ObjectPrx | None, facet: str | None = None) -> MetaCallbackPrx | None: + return uncheckedCast(MetaCallbackPrx, proxy, facet) + + @staticmethod + def ice_staticId() -> str: + return "::MumbleServer::MetaCallback" + +IcePy.defineProxy("::MumbleServer::MetaCallback", MetaCallbackPrx) + +class MetaCallback(Object, ABC): + """ + Callback interface for Meta. You can supply an implementation of this to receive notifications + when servers are stopped or started. + If an added callback ever throws an exception or goes away, it will be automatically removed. + Please note that all callbacks are done asynchronously; the server does not wait for the callback to + complete before continuing processing. + + Notes + ----- + The Slice compiler generated this skeleton class from Slice interface ``::MumbleServer::MetaCallback``. + + See Also + -------- + :class:`MumbleServer.ServerCallbackPrx` + ``Meta.addCallback`` + """ + + _ice_ids: Sequence[str] = ("::Ice::Object", "::MumbleServer::MetaCallback", ) + _op_started: IcePy.Operation + _op_stopped: IcePy.Operation + + @staticmethod + def ice_staticId() -> str: + return "::MumbleServer::MetaCallback" + + @abstractmethod + def started(self, srv: ServerPrx | None, current: Current) -> None | Awaitable[None]: + """ + Called when a server is started. The server is up and running when this event is sent, so all methods that + need a running server will work. + + Parameters + ---------- + srv : ServerPrx | None + Interface for started server. + current : Ice.Current + The Current object for the dispatch. + + Returns + ------- + None | Awaitable[None] + None or an awaitable that completes when the dispatch completes. + """ + pass + + @abstractmethod + def stopped(self, srv: ServerPrx | None, current: Current) -> None | Awaitable[None]: + """ + Called when a server is stopped. The server is already stopped when this event is sent, so no methods that + need a running server will work. + + Parameters + ---------- + srv : ServerPrx | None + Interface for started server. + current : Ice.Current + The Current object for the dispatch. + + Returns + ------- + None | Awaitable[None] + None or an awaitable that completes when the dispatch completes. + """ + pass + +MetaCallback._op_started = IcePy.Operation( + "started", + "started", + OperationMode.Normal, + None, + (), + (((), _MumbleServer_ServerPrx_t, False, 0),), + (), + None, + ()) + +MetaCallback._op_stopped = IcePy.Operation( + "stopped", + "stopped", + OperationMode.Normal, + None, + (), + (((), _MumbleServer_ServerPrx_t, False, 0),), + (), + None, + ()) + +__all__ = ["MetaCallback", "MetaCallbackPrx", "_MumbleServer_MetaCallbackPrx_t"] diff --git a/MumbleServer/MetaCallback_forward.py b/MumbleServer/MetaCallback_forward.py new file mode 100644 index 0000000..d92cc64 --- /dev/null +++ b/MumbleServer/MetaCallback_forward.py @@ -0,0 +1,10 @@ +# Copyright (c) ZeroC, Inc. + +# slice2py version 3.8.1 + +from __future__ import annotations +import IcePy + +_MumbleServer_MetaCallbackPrx_t = IcePy.declareProxy("::MumbleServer::MetaCallback") + +__all__ = ["_MumbleServer_MetaCallbackPrx_t"] \ No newline at end of file diff --git a/MumbleServer/Meta_forward.py b/MumbleServer/Meta_forward.py new file mode 100644 index 0000000..e5970d8 --- /dev/null +++ b/MumbleServer/Meta_forward.py @@ -0,0 +1,10 @@ +# Copyright (c) ZeroC, Inc. + +# slice2py version 3.8.1 + +from __future__ import annotations +import IcePy + +_MumbleServer_MetaPrx_t = IcePy.declareProxy("::MumbleServer::Meta") + +__all__ = ["_MumbleServer_MetaPrx_t"] \ No newline at end of file diff --git a/MumbleServer/NameList.py b/MumbleServer/NameList.py new file mode 100644 index 0000000..7ff7202 --- /dev/null +++ b/MumbleServer/NameList.py @@ -0,0 +1,10 @@ +# Copyright (c) ZeroC, Inc. + +# slice2py version 3.8.1 + +from __future__ import annotations +import IcePy + +_MumbleServer_NameList_t = IcePy.defineSequence("::MumbleServer::NameList", (), IcePy._t_string) + +__all__ = ["_MumbleServer_NameList_t"] diff --git a/MumbleServer/NameMap.py b/MumbleServer/NameMap.py new file mode 100644 index 0000000..98c0c35 --- /dev/null +++ b/MumbleServer/NameMap.py @@ -0,0 +1,10 @@ +# Copyright (c) ZeroC, Inc. + +# slice2py version 3.8.1 + +from __future__ import annotations +import IcePy + +_MumbleServer_NameMap_t = IcePy.defineDictionary("::MumbleServer::NameMap", (), IcePy._t_int, IcePy._t_string) + +__all__ = ["_MumbleServer_NameMap_t"] diff --git a/MumbleServer/NestingLimitException.py b/MumbleServer/NestingLimitException.py new file mode 100644 index 0000000..c9a243e --- /dev/null +++ b/MumbleServer/NestingLimitException.py @@ -0,0 +1,35 @@ +# Copyright (c) ZeroC, Inc. + +# slice2py version 3.8.1 + +from __future__ import annotations +import IcePy + +from MumbleServer.ServerException import ServerException +from MumbleServer.ServerException import _MumbleServer_ServerException_t + +from dataclasses import dataclass + + +@dataclass +class NestingLimitException(ServerException): + """ + This is thrown when the channel operation would exceed the channel nesting limit + + Notes + ----- + The Slice compiler generated this exception dataclass from Slice exception ``::MumbleServer::NestingLimitException``. + """ + + _ice_id = "::MumbleServer::NestingLimitException" + +_MumbleServer_NestingLimitException_t = IcePy.defineException( + "::MumbleServer::NestingLimitException", + NestingLimitException, + (), + _MumbleServer_ServerException_t, + ()) + +setattr(NestingLimitException, '_ice_type', _MumbleServer_NestingLimitException_t) + +__all__ = ["NestingLimitException", "_MumbleServer_NestingLimitException_t"] diff --git a/MumbleServer/NetAddress.py b/MumbleServer/NetAddress.py new file mode 100644 index 0000000..e9134aa --- /dev/null +++ b/MumbleServer/NetAddress.py @@ -0,0 +1,10 @@ +# Copyright (c) ZeroC, Inc. + +# slice2py version 3.8.1 + +from __future__ import annotations +import IcePy + +_MumbleServer_NetAddress_t = IcePy.defineSequence("::MumbleServer::NetAddress", (), IcePy._t_byte) + +__all__ = ["_MumbleServer_NetAddress_t"] diff --git a/MumbleServer/PermissionBan.py b/MumbleServer/PermissionBan.py new file mode 100644 index 0000000..b27136f --- /dev/null +++ b/MumbleServer/PermissionBan.py @@ -0,0 +1,18 @@ +# Copyright (c) ZeroC, Inc. + +# slice2py version 3.8.1 + +from __future__ import annotations +import IcePy + + +PermissionBan = 131072 +""" +Ban user from server. Only valid on root channel. + +Notes +----- + The Slice compiler generated this constant from Slice constant ``::MumbleServer::PermissionBan``. +""" + +__all__ = ["PermissionBan"] diff --git a/MumbleServer/PermissionEnter.py b/MumbleServer/PermissionEnter.py new file mode 100644 index 0000000..7b6d2b1 --- /dev/null +++ b/MumbleServer/PermissionEnter.py @@ -0,0 +1,18 @@ +# Copyright (c) ZeroC, Inc. + +# slice2py version 3.8.1 + +from __future__ import annotations +import IcePy + + +PermissionEnter = 4 +""" +Enter channel. + +Notes +----- + The Slice compiler generated this constant from Slice constant ``::MumbleServer::PermissionEnter``. +""" + +__all__ = ["PermissionEnter"] diff --git a/MumbleServer/PermissionKick.py b/MumbleServer/PermissionKick.py new file mode 100644 index 0000000..2adb3a8 --- /dev/null +++ b/MumbleServer/PermissionKick.py @@ -0,0 +1,18 @@ +# Copyright (c) ZeroC, Inc. + +# slice2py version 3.8.1 + +from __future__ import annotations +import IcePy + + +PermissionKick = 65536 +""" +Kick user from server. Only valid on root channel. + +Notes +----- + The Slice compiler generated this constant from Slice constant ``::MumbleServer::PermissionKick``. +""" + +__all__ = ["PermissionKick"] diff --git a/MumbleServer/PermissionLinkChannel.py b/MumbleServer/PermissionLinkChannel.py new file mode 100644 index 0000000..87e3fe4 --- /dev/null +++ b/MumbleServer/PermissionLinkChannel.py @@ -0,0 +1,18 @@ +# Copyright (c) ZeroC, Inc. + +# slice2py version 3.8.1 + +from __future__ import annotations +import IcePy + + +PermissionLinkChannel = 128 +""" +Link this channel. You need this permission in both the source and destination channel to link channels, or in either channel to unlink them. + +Notes +----- + The Slice compiler generated this constant from Slice constant ``::MumbleServer::PermissionLinkChannel``. +""" + +__all__ = ["PermissionLinkChannel"] diff --git a/MumbleServer/PermissionMakeChannel.py b/MumbleServer/PermissionMakeChannel.py new file mode 100644 index 0000000..28814bf --- /dev/null +++ b/MumbleServer/PermissionMakeChannel.py @@ -0,0 +1,18 @@ +# Copyright (c) ZeroC, Inc. + +# slice2py version 3.8.1 + +from __future__ import annotations +import IcePy + + +PermissionMakeChannel = 64 +""" +Make new channel as a subchannel of this channel. + +Notes +----- + The Slice compiler generated this constant from Slice constant ``::MumbleServer::PermissionMakeChannel``. +""" + +__all__ = ["PermissionMakeChannel"] diff --git a/MumbleServer/PermissionMakeTempChannel.py b/MumbleServer/PermissionMakeTempChannel.py new file mode 100644 index 0000000..28abfe7 --- /dev/null +++ b/MumbleServer/PermissionMakeTempChannel.py @@ -0,0 +1,18 @@ +# Copyright (c) ZeroC, Inc. + +# slice2py version 3.8.1 + +from __future__ import annotations +import IcePy + + +PermissionMakeTempChannel = 1024 +""" +Make new temporary channel as a subchannel of this channel. + +Notes +----- + The Slice compiler generated this constant from Slice constant ``::MumbleServer::PermissionMakeTempChannel``. +""" + +__all__ = ["PermissionMakeTempChannel"] diff --git a/MumbleServer/PermissionMove.py b/MumbleServer/PermissionMove.py new file mode 100644 index 0000000..b979bf4 --- /dev/null +++ b/MumbleServer/PermissionMove.py @@ -0,0 +1,18 @@ +# Copyright (c) ZeroC, Inc. + +# slice2py version 3.8.1 + +from __future__ import annotations +import IcePy + + +PermissionMove = 32 +""" +Move users from channel. You need this permission in both the source and destination channel to move another user. + +Notes +----- + The Slice compiler generated this constant from Slice constant ``::MumbleServer::PermissionMove``. +""" + +__all__ = ["PermissionMove"] diff --git a/MumbleServer/PermissionMuteDeafen.py b/MumbleServer/PermissionMuteDeafen.py new file mode 100644 index 0000000..fa60b94 --- /dev/null +++ b/MumbleServer/PermissionMuteDeafen.py @@ -0,0 +1,18 @@ +# Copyright (c) ZeroC, Inc. + +# slice2py version 3.8.1 + +from __future__ import annotations +import IcePy + + +PermissionMuteDeafen = 16 +""" +Mute and deafen other users in this channel. + +Notes +----- + The Slice compiler generated this constant from Slice constant ``::MumbleServer::PermissionMuteDeafen``. +""" + +__all__ = ["PermissionMuteDeafen"] diff --git a/MumbleServer/PermissionRegister.py b/MumbleServer/PermissionRegister.py new file mode 100644 index 0000000..ee21b7b --- /dev/null +++ b/MumbleServer/PermissionRegister.py @@ -0,0 +1,18 @@ +# Copyright (c) ZeroC, Inc. + +# slice2py version 3.8.1 + +from __future__ import annotations +import IcePy + + +PermissionRegister = 262144 +""" +Register and unregister users. Only valid on root channel. + +Notes +----- + The Slice compiler generated this constant from Slice constant ``::MumbleServer::PermissionRegister``. +""" + +__all__ = ["PermissionRegister"] diff --git a/MumbleServer/PermissionRegisterSelf.py b/MumbleServer/PermissionRegisterSelf.py new file mode 100644 index 0000000..f8ff9d1 --- /dev/null +++ b/MumbleServer/PermissionRegisterSelf.py @@ -0,0 +1,18 @@ +# Copyright (c) ZeroC, Inc. + +# slice2py version 3.8.1 + +from __future__ import annotations +import IcePy + + +PermissionRegisterSelf = 524288 +""" +Register and unregister users. Only valid on root channel. + +Notes +----- + The Slice compiler generated this constant from Slice constant ``::MumbleServer::PermissionRegisterSelf``. +""" + +__all__ = ["PermissionRegisterSelf"] diff --git a/MumbleServer/PermissionSpeak.py b/MumbleServer/PermissionSpeak.py new file mode 100644 index 0000000..2787999 --- /dev/null +++ b/MumbleServer/PermissionSpeak.py @@ -0,0 +1,18 @@ +# Copyright (c) ZeroC, Inc. + +# slice2py version 3.8.1 + +from __future__ import annotations +import IcePy + + +PermissionSpeak = 8 +""" +Speak in channel. + +Notes +----- + The Slice compiler generated this constant from Slice constant ``::MumbleServer::PermissionSpeak``. +""" + +__all__ = ["PermissionSpeak"] diff --git a/MumbleServer/PermissionTextMessage.py b/MumbleServer/PermissionTextMessage.py new file mode 100644 index 0000000..0d63a2b --- /dev/null +++ b/MumbleServer/PermissionTextMessage.py @@ -0,0 +1,18 @@ +# Copyright (c) ZeroC, Inc. + +# slice2py version 3.8.1 + +from __future__ import annotations +import IcePy + + +PermissionTextMessage = 512 +""" +Send text message to channel. + +Notes +----- + The Slice compiler generated this constant from Slice constant ``::MumbleServer::PermissionTextMessage``. +""" + +__all__ = ["PermissionTextMessage"] diff --git a/MumbleServer/PermissionTraverse.py b/MumbleServer/PermissionTraverse.py new file mode 100644 index 0000000..d84f0a5 --- /dev/null +++ b/MumbleServer/PermissionTraverse.py @@ -0,0 +1,18 @@ +# Copyright (c) ZeroC, Inc. + +# slice2py version 3.8.1 + +from __future__ import annotations +import IcePy + + +PermissionTraverse = 2 +""" +Traverse channel. Without this, a client cannot reach subchannels, no matter which privileges he has there. + +Notes +----- + The Slice compiler generated this constant from Slice constant ``::MumbleServer::PermissionTraverse``. +""" + +__all__ = ["PermissionTraverse"] diff --git a/MumbleServer/PermissionWhisper.py b/MumbleServer/PermissionWhisper.py new file mode 100644 index 0000000..e71123f --- /dev/null +++ b/MumbleServer/PermissionWhisper.py @@ -0,0 +1,18 @@ +# Copyright (c) ZeroC, Inc. + +# slice2py version 3.8.1 + +from __future__ import annotations +import IcePy + + +PermissionWhisper = 256 +""" +Whisper to channel. This is different from Speak, so you can set up different permissions. + +Notes +----- + The Slice compiler generated this constant from Slice constant ``::MumbleServer::PermissionWhisper``. +""" + +__all__ = ["PermissionWhisper"] diff --git a/MumbleServer/PermissionWrite.py b/MumbleServer/PermissionWrite.py new file mode 100644 index 0000000..24af707 --- /dev/null +++ b/MumbleServer/PermissionWrite.py @@ -0,0 +1,18 @@ +# Copyright (c) ZeroC, Inc. + +# slice2py version 3.8.1 + +from __future__ import annotations +import IcePy + + +PermissionWrite = 1 +""" +Write access to channel control. Implies all other permissions (except Speak). + +Notes +----- + The Slice compiler generated this constant from Slice constant ``::MumbleServer::PermissionWrite``. +""" + +__all__ = ["PermissionWrite"] diff --git a/MumbleServer/ReadOnlyModeException.py b/MumbleServer/ReadOnlyModeException.py new file mode 100644 index 0000000..842defe --- /dev/null +++ b/MumbleServer/ReadOnlyModeException.py @@ -0,0 +1,35 @@ +# Copyright (c) ZeroC, Inc. + +# slice2py version 3.8.1 + +from __future__ import annotations +import IcePy + +from MumbleServer.ServerException import ServerException +from MumbleServer.ServerException import _MumbleServer_ServerException_t + +from dataclasses import dataclass + + +@dataclass +class ReadOnlyModeException(ServerException): + """ + This is thrown when the server has its database in read-only mode and whatever you requested is incompatible with that. + + Notes + ----- + The Slice compiler generated this exception dataclass from Slice exception ``::MumbleServer::ReadOnlyModeException``. + """ + + _ice_id = "::MumbleServer::ReadOnlyModeException" + +_MumbleServer_ReadOnlyModeException_t = IcePy.defineException( + "::MumbleServer::ReadOnlyModeException", + ReadOnlyModeException, + (), + _MumbleServer_ServerException_t, + ()) + +setattr(ReadOnlyModeException, '_ice_type', _MumbleServer_ReadOnlyModeException_t) + +__all__ = ["ReadOnlyModeException", "_MumbleServer_ReadOnlyModeException_t"] diff --git a/MumbleServer/ResetUserContent.py b/MumbleServer/ResetUserContent.py new file mode 100644 index 0000000..f8846d8 --- /dev/null +++ b/MumbleServer/ResetUserContent.py @@ -0,0 +1,18 @@ +# Copyright (c) ZeroC, Inc. + +# slice2py version 3.8.1 + +from __future__ import annotations +import IcePy + + +ResetUserContent = 1048576 +""" +Reset the comment or avatar of a user. Only valid on root channel. + +Notes +----- + The Slice compiler generated this constant from Slice constant ``::MumbleServer::ResetUserContent``. +""" + +__all__ = ["ResetUserContent"] diff --git a/MumbleServer/Server.py b/MumbleServer/Server.py new file mode 100644 index 0000000..8d33a11 --- /dev/null +++ b/MumbleServer/Server.py @@ -0,0 +1,4209 @@ +# Copyright (c) ZeroC, Inc. + +# slice2py version 3.8.1 + +from __future__ import annotations +import IcePy + +from Ice.Object import Object + +from Ice.ObjectPrx import ObjectPrx +from Ice.ObjectPrx import checkedCast +from Ice.ObjectPrx import checkedCastAsync +from Ice.ObjectPrx import uncheckedCast + +from Ice.OperationMode import OperationMode + +from MumbleServer.ACLList import _MumbleServer_ACLList_t + +from MumbleServer.BanList import _MumbleServer_BanList_t + +from MumbleServer.CertificateList import _MumbleServer_CertificateList_t + +from MumbleServer.Channel import _MumbleServer_Channel_t + +from MumbleServer.ChannelMap import _MumbleServer_ChannelMap_t + +from MumbleServer.ConfigMap import _MumbleServer_ConfigMap_t + +from MumbleServer.GroupList import _MumbleServer_GroupList_t + +from MumbleServer.IdList import _MumbleServer_IdList_t + +from MumbleServer.IdMap import _MumbleServer_IdMap_t + +from MumbleServer.IntList import _MumbleServer_IntList_t + +from MumbleServer.InvalidCallbackException import _MumbleServer_InvalidCallbackException_t + +from MumbleServer.InvalidChannelException import _MumbleServer_InvalidChannelException_t + +from MumbleServer.InvalidInputDataException import _MumbleServer_InvalidInputDataException_t + +from MumbleServer.InvalidSecretException import _MumbleServer_InvalidSecretException_t + +from MumbleServer.InvalidSessionException import _MumbleServer_InvalidSessionException_t + +from MumbleServer.InvalidTextureException import _MumbleServer_InvalidTextureException_t + +from MumbleServer.InvalidUserException import _MumbleServer_InvalidUserException_t + +from MumbleServer.LogList import _MumbleServer_LogList_t + +from MumbleServer.NameList import _MumbleServer_NameList_t + +from MumbleServer.NameMap import _MumbleServer_NameMap_t + +from MumbleServer.NestingLimitException import _MumbleServer_NestingLimitException_t + +from MumbleServer.ReadOnlyModeException import _MumbleServer_ReadOnlyModeException_t + +from MumbleServer.ServerAuthenticator_forward import _MumbleServer_ServerAuthenticatorPrx_t + +from MumbleServer.ServerBootedException import _MumbleServer_ServerBootedException_t + +from MumbleServer.ServerCallback_forward import _MumbleServer_ServerCallbackPrx_t + +from MumbleServer.ServerContextCallback_forward import _MumbleServer_ServerContextCallbackPrx_t + +from MumbleServer.ServerFailureException import _MumbleServer_ServerFailureException_t + +from MumbleServer.Server_forward import _MumbleServer_ServerPrx_t + +from MumbleServer.Texture import _MumbleServer_Texture_t + +from MumbleServer.Tree_forward import _MumbleServer_Tree_t + +from MumbleServer.User import _MumbleServer_User_t + +from MumbleServer.UserInfoMap import _MumbleServer_UserInfoMap_t + +from MumbleServer.UserMap import _MumbleServer_UserMap_t + +from MumbleServer.WriteOnlyException import _MumbleServer_WriteOnlyException_t + +from abc import ABC +from abc import abstractmethod + +from typing import TYPE_CHECKING +from typing import overload + +if TYPE_CHECKING: + from Ice.Current import Current + from MumbleServer.ACL import ACL + from MumbleServer.Ban import Ban + from MumbleServer.Channel import Channel + from MumbleServer.Group import Group + from MumbleServer.LogEntry import LogEntry + from MumbleServer.ServerAuthenticator import ServerAuthenticatorPrx + from MumbleServer.ServerCallback import ServerCallbackPrx + from MumbleServer.ServerContextCallback import ServerContextCallbackPrx + from MumbleServer.Tree import Tree + from MumbleServer.User import User + from MumbleServer.UserInfo import UserInfo + from collections.abc import Awaitable + from collections.abc import Buffer + from collections.abc import Mapping + from collections.abc import Sequence + + +class ServerPrx(ObjectPrx): + """ + Per-server interface. This includes all methods for configuring and altering + the state of a single virtual server. You can retrieve a pointer to this interface + from one of the methods in :class:`MumbleServer.MetaPrx`. + + Notes + ----- + The Slice compiler generated this proxy class from Slice interface ``::MumbleServer::Server``. + """ + + def isRunning(self, context: dict[str, str] | None = None) -> bool: + """ + Shows if the server currently running (accepting users). + + Parameters + ---------- + context : dict[str, str] + The request context for the invocation. + + Returns + ------- + bool + Run-state of server. + """ + return Server._op_isRunning.invoke(self, ((), context)) + + def isRunningAsync(self, context: dict[str, str] | None = None) -> Awaitable[bool]: + """ + Shows if the server currently running (accepting users). + + Parameters + ---------- + context : dict[str, str] + The request context for the invocation. + + Returns + ------- + Awaitable[bool] + Run-state of server. + """ + return Server._op_isRunning.invokeAsync(self, ((), context)) + + def start(self, context: dict[str, str] | None = None) -> None: + """ + Start server. + + Parameters + ---------- + context : dict[str, str] + The request context for the invocation. + """ + return Server._op_start.invoke(self, ((), context)) + + def startAsync(self, context: dict[str, str] | None = None) -> Awaitable[None]: + """ + Start server. + + Parameters + ---------- + context : dict[str, str] + The request context for the invocation. + + Returns + ------- + Awaitable[None] + An awaitable that is completed when the invocation completes. + """ + return Server._op_start.invokeAsync(self, ((), context)) + + def stop(self, context: dict[str, str] | None = None) -> None: + """ + Stop server. + Note: Server will be restarted on application restart unless explicitly disabled + with setConf("boot", false) + + Parameters + ---------- + context : dict[str, str] + The request context for the invocation. + """ + return Server._op_stop.invoke(self, ((), context)) + + def stopAsync(self, context: dict[str, str] | None = None) -> Awaitable[None]: + """ + Stop server. + Note: Server will be restarted on application restart unless explicitly disabled + with setConf("boot", false) + + Parameters + ---------- + context : dict[str, str] + The request context for the invocation. + + Returns + ------- + Awaitable[None] + An awaitable that is completed when the invocation completes. + """ + return Server._op_stop.invokeAsync(self, ((), context)) + + def delete(self, context: dict[str, str] | None = None) -> None: + """ + Delete server and all it's configuration. + + Parameters + ---------- + context : dict[str, str] + The request context for the invocation. + """ + return Server._op_delete.invoke(self, ((), context)) + + def deleteAsync(self, context: dict[str, str] | None = None) -> Awaitable[None]: + """ + Delete server and all it's configuration. + + Parameters + ---------- + context : dict[str, str] + The request context for the invocation. + + Returns + ------- + Awaitable[None] + An awaitable that is completed when the invocation completes. + """ + return Server._op_delete.invokeAsync(self, ((), context)) + + def id(self, context: dict[str, str] | None = None) -> int: + """ + Fetch the server id. + + Parameters + ---------- + context : dict[str, str] + The request context for the invocation. + + Returns + ------- + int + Unique server id. + """ + return Server._op_id.invoke(self, ((), context)) + + def idAsync(self, context: dict[str, str] | None = None) -> Awaitable[int]: + """ + Fetch the server id. + + Parameters + ---------- + context : dict[str, str] + The request context for the invocation. + + Returns + ------- + Awaitable[int] + Unique server id. + """ + return Server._op_id.invokeAsync(self, ((), context)) + + def addCallback(self, cb: ServerCallbackPrx | None, context: dict[str, str] | None = None) -> None: + """ + Add a callback. The callback will receive notifications about changes to users and channels. + + Parameters + ---------- + cb : ServerCallbackPrx | None + Callback interface which will receive notifications. + context : dict[str, str] + The request context for the invocation. + + See Also + -------- + :meth:`MumbleServer.ServerPrx.removeCallbackAsync` + """ + return Server._op_addCallback.invoke(self, ((cb, ), context)) + + def addCallbackAsync(self, cb: ServerCallbackPrx | None, context: dict[str, str] | None = None) -> Awaitable[None]: + """ + Add a callback. The callback will receive notifications about changes to users and channels. + + Parameters + ---------- + cb : ServerCallbackPrx | None + Callback interface which will receive notifications. + context : dict[str, str] + The request context for the invocation. + + Returns + ------- + Awaitable[None] + An awaitable that is completed when the invocation completes. + + See Also + -------- + :meth:`MumbleServer.ServerPrx.removeCallbackAsync` + """ + return Server._op_addCallback.invokeAsync(self, ((cb, ), context)) + + def removeCallback(self, cb: ServerCallbackPrx | None, context: dict[str, str] | None = None) -> None: + """ + Remove a callback. + + Parameters + ---------- + cb : ServerCallbackPrx | None + Callback interface to be removed. + context : dict[str, str] + The request context for the invocation. + + See Also + -------- + :meth:`MumbleServer.ServerPrx.addCallbackAsync` + """ + return Server._op_removeCallback.invoke(self, ((cb, ), context)) + + def removeCallbackAsync(self, cb: ServerCallbackPrx | None, context: dict[str, str] | None = None) -> Awaitable[None]: + """ + Remove a callback. + + Parameters + ---------- + cb : ServerCallbackPrx | None + Callback interface to be removed. + context : dict[str, str] + The request context for the invocation. + + Returns + ------- + Awaitable[None] + An awaitable that is completed when the invocation completes. + + See Also + -------- + :meth:`MumbleServer.ServerPrx.addCallbackAsync` + """ + return Server._op_removeCallback.invokeAsync(self, ((cb, ), context)) + + def setAuthenticator(self, auth: ServerAuthenticatorPrx | None, context: dict[str, str] | None = None) -> None: + """ + Set external authenticator. If set, all authentications from clients are forwarded to this + proxy. + + Parameters + ---------- + auth : ServerAuthenticatorPrx | None + Authenticator object to perform subsequent authentications. + context : dict[str, str] + The request context for the invocation. + """ + return Server._op_setAuthenticator.invoke(self, ((auth, ), context)) + + def setAuthenticatorAsync(self, auth: ServerAuthenticatorPrx | None, context: dict[str, str] | None = None) -> Awaitable[None]: + """ + Set external authenticator. If set, all authentications from clients are forwarded to this + proxy. + + Parameters + ---------- + auth : ServerAuthenticatorPrx | None + Authenticator object to perform subsequent authentications. + context : dict[str, str] + The request context for the invocation. + + Returns + ------- + Awaitable[None] + An awaitable that is completed when the invocation completes. + """ + return Server._op_setAuthenticator.invokeAsync(self, ((auth, ), context)) + + def getConf(self, key: str, context: dict[str, str] | None = None) -> str: + """ + Retrieve configuration item. + + Parameters + ---------- + key : str + Configuration key. + context : dict[str, str] + The request context for the invocation. + + Returns + ------- + str + Configuration value. If this is empty, see ``Meta.getDefaultConf`` + """ + return Server._op_getConf.invoke(self, ((key, ), context)) + + def getConfAsync(self, key: str, context: dict[str, str] | None = None) -> Awaitable[str]: + """ + Retrieve configuration item. + + Parameters + ---------- + key : str + Configuration key. + context : dict[str, str] + The request context for the invocation. + + Returns + ------- + Awaitable[str] + Configuration value. If this is empty, see ``Meta.getDefaultConf`` + """ + return Server._op_getConf.invokeAsync(self, ((key, ), context)) + + def getAllConf(self, context: dict[str, str] | None = None) -> dict[str, str]: + """ + Retrieve all configuration items. + + Parameters + ---------- + context : dict[str, str] + The request context for the invocation. + + Returns + ------- + dict[str, str] + All configured values. If a value isn't set here, the value from ``Meta.getDefaultConf`` is used. + """ + return Server._op_getAllConf.invoke(self, ((), context)) + + def getAllConfAsync(self, context: dict[str, str] | None = None) -> Awaitable[dict[str, str]]: + """ + Retrieve all configuration items. + + Parameters + ---------- + context : dict[str, str] + The request context for the invocation. + + Returns + ------- + Awaitable[dict[str, str]] + All configured values. If a value isn't set here, the value from ``Meta.getDefaultConf`` is used. + """ + return Server._op_getAllConf.invokeAsync(self, ((), context)) + + def setConf(self, key: str, value: str, context: dict[str, str] | None = None) -> None: + """ + Set a configuration item. + + Parameters + ---------- + key : str + Configuration key. + value : str + Configuration value. + context : dict[str, str] + The request context for the invocation. + """ + return Server._op_setConf.invoke(self, ((key, value), context)) + + def setConfAsync(self, key: str, value: str, context: dict[str, str] | None = None) -> Awaitable[None]: + """ + Set a configuration item. + + Parameters + ---------- + key : str + Configuration key. + value : str + Configuration value. + context : dict[str, str] + The request context for the invocation. + + Returns + ------- + Awaitable[None] + An awaitable that is completed when the invocation completes. + """ + return Server._op_setConf.invokeAsync(self, ((key, value), context)) + + def setSuperuserPassword(self, pw: str, context: dict[str, str] | None = None) -> None: + """ + Set superuser password. This is just a convenience for using :meth:`MumbleServer.ServerPrx.updateRegistrationAsync` on user id 0. + + Parameters + ---------- + pw : str + Password. + context : dict[str, str] + The request context for the invocation. + """ + return Server._op_setSuperuserPassword.invoke(self, ((pw, ), context)) + + def setSuperuserPasswordAsync(self, pw: str, context: dict[str, str] | None = None) -> Awaitable[None]: + """ + Set superuser password. This is just a convenience for using :meth:`MumbleServer.ServerPrx.updateRegistrationAsync` on user id 0. + + Parameters + ---------- + pw : str + Password. + context : dict[str, str] + The request context for the invocation. + + Returns + ------- + Awaitable[None] + An awaitable that is completed when the invocation completes. + """ + return Server._op_setSuperuserPassword.invokeAsync(self, ((pw, ), context)) + + def getLog(self, first: int, last: int, context: dict[str, str] | None = None) -> list[LogEntry]: + """ + Fetch log entries. + + Parameters + ---------- + first : int + Lowest numbered entry to fetch. 0 is the most recent item. + last : int + Last entry to fetch. + context : dict[str, str] + The request context for the invocation. + + Returns + ------- + list[LogEntry] + List of log entries. + """ + return Server._op_getLog.invoke(self, ((first, last), context)) + + def getLogAsync(self, first: int, last: int, context: dict[str, str] | None = None) -> Awaitable[list[LogEntry]]: + """ + Fetch log entries. + + Parameters + ---------- + first : int + Lowest numbered entry to fetch. 0 is the most recent item. + last : int + Last entry to fetch. + context : dict[str, str] + The request context for the invocation. + + Returns + ------- + Awaitable[list[LogEntry]] + List of log entries. + """ + return Server._op_getLog.invokeAsync(self, ((first, last), context)) + + def getLogLen(self, context: dict[str, str] | None = None) -> int: + """ + Fetch length of log + + Parameters + ---------- + context : dict[str, str] + The request context for the invocation. + + Returns + ------- + int + Number of entries in log + """ + return Server._op_getLogLen.invoke(self, ((), context)) + + def getLogLenAsync(self, context: dict[str, str] | None = None) -> Awaitable[int]: + """ + Fetch length of log + + Parameters + ---------- + context : dict[str, str] + The request context for the invocation. + + Returns + ------- + Awaitable[int] + Number of entries in log + """ + return Server._op_getLogLen.invokeAsync(self, ((), context)) + + def getUsers(self, context: dict[str, str] | None = None) -> dict[int, User]: + """ + Fetch all users. This returns all currently connected users on the server. + + Parameters + ---------- + context : dict[str, str] + The request context for the invocation. + + Returns + ------- + dict[int, User] + List of connected users. + + See Also + -------- + :meth:`MumbleServer.ServerPrx.getStateAsync` + """ + return Server._op_getUsers.invoke(self, ((), context)) + + def getUsersAsync(self, context: dict[str, str] | None = None) -> Awaitable[dict[int, User]]: + """ + Fetch all users. This returns all currently connected users on the server. + + Parameters + ---------- + context : dict[str, str] + The request context for the invocation. + + Returns + ------- + Awaitable[dict[int, User]] + List of connected users. + + See Also + -------- + :meth:`MumbleServer.ServerPrx.getStateAsync` + """ + return Server._op_getUsers.invokeAsync(self, ((), context)) + + def getChannels(self, context: dict[str, str] | None = None) -> dict[int, Channel]: + """ + Fetch all channels. This returns all defined channels on the server. The root channel is always channel 0. + + Parameters + ---------- + context : dict[str, str] + The request context for the invocation. + + Returns + ------- + dict[int, Channel] + List of defined channels. + + See Also + -------- + :meth:`MumbleServer.ServerPrx.getChannelStateAsync` + """ + return Server._op_getChannels.invoke(self, ((), context)) + + def getChannelsAsync(self, context: dict[str, str] | None = None) -> Awaitable[dict[int, Channel]]: + """ + Fetch all channels. This returns all defined channels on the server. The root channel is always channel 0. + + Parameters + ---------- + context : dict[str, str] + The request context for the invocation. + + Returns + ------- + Awaitable[dict[int, Channel]] + List of defined channels. + + See Also + -------- + :meth:`MumbleServer.ServerPrx.getChannelStateAsync` + """ + return Server._op_getChannels.invokeAsync(self, ((), context)) + + def getCertificateList(self, session: int, context: dict[str, str] | None = None) -> list[bytes]: + """ + Fetch certificate of user. This returns the complete certificate chain of a user. + + Parameters + ---------- + session : int + Connection ID of user. See ``User.session``. + context : dict[str, str] + The request context for the invocation. + + Returns + ------- + list[bytes] + Certificate list of user. + """ + return Server._op_getCertificateList.invoke(self, ((session, ), context)) + + def getCertificateListAsync(self, session: int, context: dict[str, str] | None = None) -> Awaitable[list[bytes]]: + """ + Fetch certificate of user. This returns the complete certificate chain of a user. + + Parameters + ---------- + session : int + Connection ID of user. See ``User.session``. + context : dict[str, str] + The request context for the invocation. + + Returns + ------- + Awaitable[list[bytes]] + Certificate list of user. + """ + return Server._op_getCertificateList.invokeAsync(self, ((session, ), context)) + + def getTree(self, context: dict[str, str] | None = None) -> Tree | None: + """ + Fetch all channels and connected users as a tree. This retrieves an easy-to-use representation of the server + as a tree. This is primarily used for viewing the state of the server on a webpage. + + Parameters + ---------- + context : dict[str, str] + The request context for the invocation. + + Returns + ------- + Tree | None + Recursive tree of all channels and connected users. + """ + return Server._op_getTree.invoke(self, ((), context)) + + def getTreeAsync(self, context: dict[str, str] | None = None) -> Awaitable[Tree | None]: + """ + Fetch all channels and connected users as a tree. This retrieves an easy-to-use representation of the server + as a tree. This is primarily used for viewing the state of the server on a webpage. + + Parameters + ---------- + context : dict[str, str] + The request context for the invocation. + + Returns + ------- + Awaitable[Tree | None] + Recursive tree of all channels and connected users. + """ + return Server._op_getTree.invokeAsync(self, ((), context)) + + def getBans(self, context: dict[str, str] | None = None) -> list[Ban]: + """ + Fetch all current IP bans on the server. + + Parameters + ---------- + context : dict[str, str] + The request context for the invocation. + + Returns + ------- + list[Ban] + List of bans. + """ + return Server._op_getBans.invoke(self, ((), context)) + + def getBansAsync(self, context: dict[str, str] | None = None) -> Awaitable[list[Ban]]: + """ + Fetch all current IP bans on the server. + + Parameters + ---------- + context : dict[str, str] + The request context for the invocation. + + Returns + ------- + Awaitable[list[Ban]] + List of bans. + """ + return Server._op_getBans.invokeAsync(self, ((), context)) + + def setBans(self, bans: Sequence[Ban], context: dict[str, str] | None = None) -> None: + """ + Set all current IP bans on the server. This will replace any bans already present, so if you want to add a ban, be sure to call :meth:`MumbleServer.ServerPrx.getBansAsync` and then + append to the returned list before calling this method. + + Parameters + ---------- + bans : Sequence[Ban] + List of bans. + context : dict[str, str] + The request context for the invocation. + """ + return Server._op_setBans.invoke(self, ((bans, ), context)) + + def setBansAsync(self, bans: Sequence[Ban], context: dict[str, str] | None = None) -> Awaitable[None]: + """ + Set all current IP bans on the server. This will replace any bans already present, so if you want to add a ban, be sure to call :meth:`MumbleServer.ServerPrx.getBansAsync` and then + append to the returned list before calling this method. + + Parameters + ---------- + bans : Sequence[Ban] + List of bans. + context : dict[str, str] + The request context for the invocation. + + Returns + ------- + Awaitable[None] + An awaitable that is completed when the invocation completes. + """ + return Server._op_setBans.invokeAsync(self, ((bans, ), context)) + + def kickUser(self, session: int, reason: str, context: dict[str, str] | None = None) -> None: + """ + Kick a user. The user is not banned, and is free to rejoin the server. + + Parameters + ---------- + session : int + Connection ID of user. See ``User.session``. + reason : str + Text message to show when user is kicked. + context : dict[str, str] + The request context for the invocation. + """ + return Server._op_kickUser.invoke(self, ((session, reason), context)) + + def kickUserAsync(self, session: int, reason: str, context: dict[str, str] | None = None) -> Awaitable[None]: + """ + Kick a user. The user is not banned, and is free to rejoin the server. + + Parameters + ---------- + session : int + Connection ID of user. See ``User.session``. + reason : str + Text message to show when user is kicked. + context : dict[str, str] + The request context for the invocation. + + Returns + ------- + Awaitable[None] + An awaitable that is completed when the invocation completes. + """ + return Server._op_kickUser.invokeAsync(self, ((session, reason), context)) + + def getState(self, session: int, context: dict[str, str] | None = None) -> User: + """ + Get state of a single connected user. + + Parameters + ---------- + session : int + Connection ID of user. See ``User.session``. + context : dict[str, str] + The request context for the invocation. + + Returns + ------- + User + State of connected user. + + See Also + -------- + :meth:`MumbleServer.ServerPrx.setStateAsync` + :meth:`MumbleServer.ServerPrx.getUsersAsync` + """ + return Server._op_getState.invoke(self, ((session, ), context)) + + def getStateAsync(self, session: int, context: dict[str, str] | None = None) -> Awaitable[User]: + """ + Get state of a single connected user. + + Parameters + ---------- + session : int + Connection ID of user. See ``User.session``. + context : dict[str, str] + The request context for the invocation. + + Returns + ------- + Awaitable[User] + State of connected user. + + See Also + -------- + :meth:`MumbleServer.ServerPrx.setStateAsync` + :meth:`MumbleServer.ServerPrx.getUsersAsync` + """ + return Server._op_getState.invokeAsync(self, ((session, ), context)) + + def setState(self, state: User, context: dict[str, str] | None = None) -> None: + """ + Set user state. You can use this to move, mute and deafen users. + + Parameters + ---------- + state : User + User state to set. + context : dict[str, str] + The request context for the invocation. + + See Also + -------- + :meth:`MumbleServer.ServerPrx.getStateAsync` + """ + return Server._op_setState.invoke(self, ((state, ), context)) + + def setStateAsync(self, state: User, context: dict[str, str] | None = None) -> Awaitable[None]: + """ + Set user state. You can use this to move, mute and deafen users. + + Parameters + ---------- + state : User + User state to set. + context : dict[str, str] + The request context for the invocation. + + Returns + ------- + Awaitable[None] + An awaitable that is completed when the invocation completes. + + See Also + -------- + :meth:`MumbleServer.ServerPrx.getStateAsync` + """ + return Server._op_setState.invokeAsync(self, ((state, ), context)) + + def sendMessage(self, session: int, text: str, context: dict[str, str] | None = None) -> None: + """ + Send text message to a single user. + + Parameters + ---------- + session : int + Connection ID of user. See ``User.session``. + text : str + Message to send. + context : dict[str, str] + The request context for the invocation. + + See Also + -------- + :meth:`MumbleServer.ServerPrx.sendMessageChannelAsync` + """ + return Server._op_sendMessage.invoke(self, ((session, text), context)) + + def sendMessageAsync(self, session: int, text: str, context: dict[str, str] | None = None) -> Awaitable[None]: + """ + Send text message to a single user. + + Parameters + ---------- + session : int + Connection ID of user. See ``User.session``. + text : str + Message to send. + context : dict[str, str] + The request context for the invocation. + + Returns + ------- + Awaitable[None] + An awaitable that is completed when the invocation completes. + + See Also + -------- + :meth:`MumbleServer.ServerPrx.sendMessageChannelAsync` + """ + return Server._op_sendMessage.invokeAsync(self, ((session, text), context)) + + def hasPermission(self, session: int, channelid: int, perm: int, context: dict[str, str] | None = None) -> bool: + """ + Check if user is permitted to perform action. + + Parameters + ---------- + session : int + Connection ID of user. See ``User.session``. + channelid : int + ID of Channel. See ``Channel.id``. + perm : int + Permission bits to check. + context : dict[str, str] + The request context for the invocation. + + Returns + ------- + bool + true if any of the permissions in perm were set for the user. + """ + return Server._op_hasPermission.invoke(self, ((session, channelid, perm), context)) + + def hasPermissionAsync(self, session: int, channelid: int, perm: int, context: dict[str, str] | None = None) -> Awaitable[bool]: + """ + Check if user is permitted to perform action. + + Parameters + ---------- + session : int + Connection ID of user. See ``User.session``. + channelid : int + ID of Channel. See ``Channel.id``. + perm : int + Permission bits to check. + context : dict[str, str] + The request context for the invocation. + + Returns + ------- + Awaitable[bool] + true if any of the permissions in perm were set for the user. + """ + return Server._op_hasPermission.invokeAsync(self, ((session, channelid, perm), context)) + + def effectivePermissions(self, session: int, channelid: int, context: dict[str, str] | None = None) -> int: + """ + Return users effective permissions + + Parameters + ---------- + session : int + Connection ID of user. See ``User.session``. + channelid : int + ID of Channel. See ``Channel.id``. + context : dict[str, str] + The request context for the invocation. + + Returns + ------- + int + bitfield of allowed actions + """ + return Server._op_effectivePermissions.invoke(self, ((session, channelid), context)) + + def effectivePermissionsAsync(self, session: int, channelid: int, context: dict[str, str] | None = None) -> Awaitable[int]: + """ + Return users effective permissions + + Parameters + ---------- + session : int + Connection ID of user. See ``User.session``. + channelid : int + ID of Channel. See ``Channel.id``. + context : dict[str, str] + The request context for the invocation. + + Returns + ------- + Awaitable[int] + bitfield of allowed actions + """ + return Server._op_effectivePermissions.invokeAsync(self, ((session, channelid), context)) + + def addContextCallback(self, session: int, action: str, text: str, cb: ServerContextCallbackPrx | None, ctx: int, context: dict[str, str] | None = None) -> None: + """ + Add a context callback. This is done per user, and will add a context menu action for the user. + + Parameters + ---------- + session : int + Session of user which should receive context entry. + action : str + Action string, a unique name to associate with the action. + text : str + Name of action shown to user. + cb : ServerContextCallbackPrx | None + Callback interface which will receive notifications. + ctx : int + Context this should be used in. Needs to be one or a combination of :class:`MumbleServer.ContextServer`, :class:`MumbleServer.ContextChannel` and :class:`MumbleServer.ContextUser`. + context : dict[str, str] + The request context for the invocation. + + See Also + -------- + :meth:`MumbleServer.ServerPrx.removeContextCallbackAsync` + """ + return Server._op_addContextCallback.invoke(self, ((session, action, text, cb, ctx), context)) + + def addContextCallbackAsync(self, session: int, action: str, text: str, cb: ServerContextCallbackPrx | None, ctx: int, context: dict[str, str] | None = None) -> Awaitable[None]: + """ + Add a context callback. This is done per user, and will add a context menu action for the user. + + Parameters + ---------- + session : int + Session of user which should receive context entry. + action : str + Action string, a unique name to associate with the action. + text : str + Name of action shown to user. + cb : ServerContextCallbackPrx | None + Callback interface which will receive notifications. + ctx : int + Context this should be used in. Needs to be one or a combination of :class:`MumbleServer.ContextServer`, :class:`MumbleServer.ContextChannel` and :class:`MumbleServer.ContextUser`. + context : dict[str, str] + The request context for the invocation. + + Returns + ------- + Awaitable[None] + An awaitable that is completed when the invocation completes. + + See Also + -------- + :meth:`MumbleServer.ServerPrx.removeContextCallbackAsync` + """ + return Server._op_addContextCallback.invokeAsync(self, ((session, action, text, cb, ctx), context)) + + def removeContextCallback(self, cb: ServerContextCallbackPrx | None, context: dict[str, str] | None = None) -> None: + """ + Remove a callback. + + Parameters + ---------- + cb : ServerContextCallbackPrx | None + Callback interface to be removed. This callback will be removed from all from all users. + context : dict[str, str] + The request context for the invocation. + + See Also + -------- + :meth:`MumbleServer.ServerPrx.addContextCallbackAsync` + """ + return Server._op_removeContextCallback.invoke(self, ((cb, ), context)) + + def removeContextCallbackAsync(self, cb: ServerContextCallbackPrx | None, context: dict[str, str] | None = None) -> Awaitable[None]: + """ + Remove a callback. + + Parameters + ---------- + cb : ServerContextCallbackPrx | None + Callback interface to be removed. This callback will be removed from all from all users. + context : dict[str, str] + The request context for the invocation. + + Returns + ------- + Awaitable[None] + An awaitable that is completed when the invocation completes. + + See Also + -------- + :meth:`MumbleServer.ServerPrx.addContextCallbackAsync` + """ + return Server._op_removeContextCallback.invokeAsync(self, ((cb, ), context)) + + def getChannelState(self, channelid: int, context: dict[str, str] | None = None) -> Channel: + """ + Get state of single channel. + + Parameters + ---------- + channelid : int + ID of Channel. See ``Channel.id``. + context : dict[str, str] + The request context for the invocation. + + Returns + ------- + Channel + State of channel. + + See Also + -------- + :meth:`MumbleServer.ServerPrx.setChannelStateAsync` + :meth:`MumbleServer.ServerPrx.getChannelsAsync` + """ + return Server._op_getChannelState.invoke(self, ((channelid, ), context)) + + def getChannelStateAsync(self, channelid: int, context: dict[str, str] | None = None) -> Awaitable[Channel]: + """ + Get state of single channel. + + Parameters + ---------- + channelid : int + ID of Channel. See ``Channel.id``. + context : dict[str, str] + The request context for the invocation. + + Returns + ------- + Awaitable[Channel] + State of channel. + + See Also + -------- + :meth:`MumbleServer.ServerPrx.setChannelStateAsync` + :meth:`MumbleServer.ServerPrx.getChannelsAsync` + """ + return Server._op_getChannelState.invokeAsync(self, ((channelid, ), context)) + + def setChannelState(self, state: Channel, context: dict[str, str] | None = None) -> None: + """ + Set state of a single channel. You can use this to move or relink channels. + + Parameters + ---------- + state : Channel + Channel state to set. + context : dict[str, str] + The request context for the invocation. + + See Also + -------- + :meth:`MumbleServer.ServerPrx.getChannelStateAsync` + """ + return Server._op_setChannelState.invoke(self, ((state, ), context)) + + def setChannelStateAsync(self, state: Channel, context: dict[str, str] | None = None) -> Awaitable[None]: + """ + Set state of a single channel. You can use this to move or relink channels. + + Parameters + ---------- + state : Channel + Channel state to set. + context : dict[str, str] + The request context for the invocation. + + Returns + ------- + Awaitable[None] + An awaitable that is completed when the invocation completes. + + See Also + -------- + :meth:`MumbleServer.ServerPrx.getChannelStateAsync` + """ + return Server._op_setChannelState.invokeAsync(self, ((state, ), context)) + + def removeChannel(self, channelid: int, context: dict[str, str] | None = None) -> None: + """ + Remove a channel and all its subchannels. + + Parameters + ---------- + channelid : int + ID of Channel. See ``Channel.id``. + context : dict[str, str] + The request context for the invocation. + """ + return Server._op_removeChannel.invoke(self, ((channelid, ), context)) + + def removeChannelAsync(self, channelid: int, context: dict[str, str] | None = None) -> Awaitable[None]: + """ + Remove a channel and all its subchannels. + + Parameters + ---------- + channelid : int + ID of Channel. See ``Channel.id``. + context : dict[str, str] + The request context for the invocation. + + Returns + ------- + Awaitable[None] + An awaitable that is completed when the invocation completes. + """ + return Server._op_removeChannel.invokeAsync(self, ((channelid, ), context)) + + def addChannel(self, name: str, parent: int, context: dict[str, str] | None = None) -> int: + """ + Add a new channel. + + Parameters + ---------- + name : str + Name of new channel. + parent : int + Channel ID of parent channel. See ``Channel.id``. + context : dict[str, str] + The request context for the invocation. + + Returns + ------- + int + ID of newly created channel. + """ + return Server._op_addChannel.invoke(self, ((name, parent), context)) + + def addChannelAsync(self, name: str, parent: int, context: dict[str, str] | None = None) -> Awaitable[int]: + """ + Add a new channel. + + Parameters + ---------- + name : str + Name of new channel. + parent : int + Channel ID of parent channel. See ``Channel.id``. + context : dict[str, str] + The request context for the invocation. + + Returns + ------- + Awaitable[int] + ID of newly created channel. + """ + return Server._op_addChannel.invokeAsync(self, ((name, parent), context)) + + def sendMessageChannel(self, channelid: int, tree: bool, text: str, context: dict[str, str] | None = None) -> None: + """ + Send text message to channel or a tree of channels. + + Parameters + ---------- + channelid : int + Channel ID of channel to send to. See ``Channel.id``. + tree : bool + If true, the message will be sent to the channel and all its subchannels. + text : str + Message to send. + context : dict[str, str] + The request context for the invocation. + + See Also + -------- + :meth:`MumbleServer.ServerPrx.sendMessageAsync` + """ + return Server._op_sendMessageChannel.invoke(self, ((channelid, tree, text), context)) + + def sendMessageChannelAsync(self, channelid: int, tree: bool, text: str, context: dict[str, str] | None = None) -> Awaitable[None]: + """ + Send text message to channel or a tree of channels. + + Parameters + ---------- + channelid : int + Channel ID of channel to send to. See ``Channel.id``. + tree : bool + If true, the message will be sent to the channel and all its subchannels. + text : str + Message to send. + context : dict[str, str] + The request context for the invocation. + + Returns + ------- + Awaitable[None] + An awaitable that is completed when the invocation completes. + + See Also + -------- + :meth:`MumbleServer.ServerPrx.sendMessageAsync` + """ + return Server._op_sendMessageChannel.invokeAsync(self, ((channelid, tree, text), context)) + + def getACL(self, channelid: int, context: dict[str, str] | None = None) -> tuple[list[ACL], list[Group], bool]: + """ + Retrieve ACLs and Groups on a channel. + + Parameters + ---------- + channelid : int + Channel ID of channel to fetch from. See ``Channel.id``. + context : dict[str, str] + The request context for the invocation. + + Returns + ------- + tuple[list[ACL], list[Group], bool] + + A tuple containing: + - list[ACL] List of ACLs on the channel. This will include inherited ACLs. + - list[Group] List of groups on the channel. This will include inherited groups. + - bool Does this channel inherit ACLs from the parent channel? + """ + return Server._op_getACL.invoke(self, ((channelid, ), context)) + + def getACLAsync(self, channelid: int, context: dict[str, str] | None = None) -> Awaitable[tuple[list[ACL], list[Group], bool]]: + """ + Retrieve ACLs and Groups on a channel. + + Parameters + ---------- + channelid : int + Channel ID of channel to fetch from. See ``Channel.id``. + context : dict[str, str] + The request context for the invocation. + + Returns + ------- + Awaitable[tuple[list[ACL], list[Group], bool]] + + A tuple containing: + - list[ACL] List of ACLs on the channel. This will include inherited ACLs. + - list[Group] List of groups on the channel. This will include inherited groups. + - bool Does this channel inherit ACLs from the parent channel? + """ + return Server._op_getACL.invokeAsync(self, ((channelid, ), context)) + + def setACL(self, channelid: int, acls: Sequence[ACL], groups: Sequence[Group], inherit: bool, context: dict[str, str] | None = None) -> None: + """ + Set ACLs and Groups on a channel. Note that this will replace all existing ACLs and groups on the channel. + + Parameters + ---------- + channelid : int + Channel ID of channel to fetch from. See ``Channel.id``. + acls : Sequence[ACL] + List of ACLs on the channel. + groups : Sequence[Group] + List of groups on the channel. + inherit : bool + Should this channel inherit ACLs from the parent channel? + context : dict[str, str] + The request context for the invocation. + """ + return Server._op_setACL.invoke(self, ((channelid, acls, groups, inherit), context)) + + def setACLAsync(self, channelid: int, acls: Sequence[ACL], groups: Sequence[Group], inherit: bool, context: dict[str, str] | None = None) -> Awaitable[None]: + """ + Set ACLs and Groups on a channel. Note that this will replace all existing ACLs and groups on the channel. + + Parameters + ---------- + channelid : int + Channel ID of channel to fetch from. See ``Channel.id``. + acls : Sequence[ACL] + List of ACLs on the channel. + groups : Sequence[Group] + List of groups on the channel. + inherit : bool + Should this channel inherit ACLs from the parent channel? + context : dict[str, str] + The request context for the invocation. + + Returns + ------- + Awaitable[None] + An awaitable that is completed when the invocation completes. + """ + return Server._op_setACL.invokeAsync(self, ((channelid, acls, groups, inherit), context)) + + def addUserToGroup(self, channelid: int, session: int, group: str, context: dict[str, str] | None = None) -> None: + """ + Temporarily add a user to a group on a channel. This state is not saved, and is intended for temporary memberships. + + Parameters + ---------- + channelid : int + Channel ID of channel to add to. See ``Channel.id``. + session : int + Connection ID of user. See ``User.session``. + group : str + Group name to add to. + context : dict[str, str] + The request context for the invocation. + """ + return Server._op_addUserToGroup.invoke(self, ((channelid, session, group), context)) + + def addUserToGroupAsync(self, channelid: int, session: int, group: str, context: dict[str, str] | None = None) -> Awaitable[None]: + """ + Temporarily add a user to a group on a channel. This state is not saved, and is intended for temporary memberships. + + Parameters + ---------- + channelid : int + Channel ID of channel to add to. See ``Channel.id``. + session : int + Connection ID of user. See ``User.session``. + group : str + Group name to add to. + context : dict[str, str] + The request context for the invocation. + + Returns + ------- + Awaitable[None] + An awaitable that is completed when the invocation completes. + """ + return Server._op_addUserToGroup.invokeAsync(self, ((channelid, session, group), context)) + + def removeUserFromGroup(self, channelid: int, session: int, group: str, context: dict[str, str] | None = None) -> None: + """ + Remove a user from a temporary group membership on a channel. This state is not saved, and is intended for temporary memberships. + + Parameters + ---------- + channelid : int + Channel ID of channel to add to. See ``Channel.id``. + session : int + Connection ID of user. See ``User.session``. + group : str + Group name to remove from. + context : dict[str, str] + The request context for the invocation. + """ + return Server._op_removeUserFromGroup.invoke(self, ((channelid, session, group), context)) + + def removeUserFromGroupAsync(self, channelid: int, session: int, group: str, context: dict[str, str] | None = None) -> Awaitable[None]: + """ + Remove a user from a temporary group membership on a channel. This state is not saved, and is intended for temporary memberships. + + Parameters + ---------- + channelid : int + Channel ID of channel to add to. See ``Channel.id``. + session : int + Connection ID of user. See ``User.session``. + group : str + Group name to remove from. + context : dict[str, str] + The request context for the invocation. + + Returns + ------- + Awaitable[None] + An awaitable that is completed when the invocation completes. + """ + return Server._op_removeUserFromGroup.invokeAsync(self, ((channelid, session, group), context)) + + def redirectWhisperGroup(self, session: int, source: str, target: str, context: dict[str, str] | None = None) -> None: + """ + Redirect whisper targets for user. If set, whenever a user tries to whisper to group "source", the whisper will be redirected to group "target". + To remove a redirect pass an empty target string. This is intended for context groups. + + Parameters + ---------- + session : int + Connection ID of user. See ``User.session``. + source : str + Group name to redirect from. + target : str + Group name to redirect to. + context : dict[str, str] + The request context for the invocation. + """ + return Server._op_redirectWhisperGroup.invoke(self, ((session, source, target), context)) + + def redirectWhisperGroupAsync(self, session: int, source: str, target: str, context: dict[str, str] | None = None) -> Awaitable[None]: + """ + Redirect whisper targets for user. If set, whenever a user tries to whisper to group "source", the whisper will be redirected to group "target". + To remove a redirect pass an empty target string. This is intended for context groups. + + Parameters + ---------- + session : int + Connection ID of user. See ``User.session``. + source : str + Group name to redirect from. + target : str + Group name to redirect to. + context : dict[str, str] + The request context for the invocation. + + Returns + ------- + Awaitable[None] + An awaitable that is completed when the invocation completes. + """ + return Server._op_redirectWhisperGroup.invokeAsync(self, ((session, source, target), context)) + + def getUserNames(self, ids: Sequence[int] | Buffer, context: dict[str, str] | None = None) -> dict[int, str]: + """ + Map a list of ``User.userid`` to a matching name. + + Parameters + ---------- + ids : Sequence[int] | Buffer + context : dict[str, str] + The request context for the invocation. + + Returns + ------- + dict[int, str] + Matching list of names, with an empty string representing invalid or unknown ids. + """ + return Server._op_getUserNames.invoke(self, ((ids, ), context)) + + def getUserNamesAsync(self, ids: Sequence[int] | Buffer, context: dict[str, str] | None = None) -> Awaitable[dict[int, str]]: + """ + Map a list of ``User.userid`` to a matching name. + + Parameters + ---------- + ids : Sequence[int] | Buffer + context : dict[str, str] + The request context for the invocation. + + Returns + ------- + Awaitable[dict[int, str]] + Matching list of names, with an empty string representing invalid or unknown ids. + """ + return Server._op_getUserNames.invokeAsync(self, ((ids, ), context)) + + def getUserIds(self, names: Sequence[str], context: dict[str, str] | None = None) -> dict[str, int]: + """ + Map a list of user names to a matching id. + + Parameters + ---------- + names : Sequence[str] + context : dict[str, str] + The request context for the invocation. + + Returns + ------- + dict[str, int] + """ + return Server._op_getUserIds.invoke(self, ((names, ), context)) + + def getUserIdsAsync(self, names: Sequence[str], context: dict[str, str] | None = None) -> Awaitable[dict[str, int]]: + """ + Map a list of user names to a matching id. + + Parameters + ---------- + names : Sequence[str] + context : dict[str, str] + The request context for the invocation. + + Returns + ------- + Awaitable[dict[str, int]] + """ + return Server._op_getUserIds.invokeAsync(self, ((names, ), context)) + + def registerUser(self, info: Mapping[UserInfo, str], context: dict[str, str] | None = None) -> int: + """ + Register a new user. + + Parameters + ---------- + info : Mapping[UserInfo, str] + Information about new user. Must include at least "name". + context : dict[str, str] + The request context for the invocation. + + Returns + ------- + int + The ID of the user. See ``RegisteredUser.userid``. + """ + return Server._op_registerUser.invoke(self, ((info, ), context)) + + def registerUserAsync(self, info: Mapping[UserInfo, str], context: dict[str, str] | None = None) -> Awaitable[int]: + """ + Register a new user. + + Parameters + ---------- + info : Mapping[UserInfo, str] + Information about new user. Must include at least "name". + context : dict[str, str] + The request context for the invocation. + + Returns + ------- + Awaitable[int] + The ID of the user. See ``RegisteredUser.userid``. + """ + return Server._op_registerUser.invokeAsync(self, ((info, ), context)) + + def unregisterUser(self, userid: int, context: dict[str, str] | None = None) -> None: + """ + Remove a user registration. + + Parameters + ---------- + userid : int + ID of registered user. See ``RegisteredUser.userid``. + context : dict[str, str] + The request context for the invocation. + """ + return Server._op_unregisterUser.invoke(self, ((userid, ), context)) + + def unregisterUserAsync(self, userid: int, context: dict[str, str] | None = None) -> Awaitable[None]: + """ + Remove a user registration. + + Parameters + ---------- + userid : int + ID of registered user. See ``RegisteredUser.userid``. + context : dict[str, str] + The request context for the invocation. + + Returns + ------- + Awaitable[None] + An awaitable that is completed when the invocation completes. + """ + return Server._op_unregisterUser.invokeAsync(self, ((userid, ), context)) + + def updateRegistration(self, userid: int, info: Mapping[UserInfo, str], context: dict[str, str] | None = None) -> None: + """ + Update the registration for a user. You can use this to set the email or password of a user, + and can also use it to change the user's name. + + Parameters + ---------- + userid : int + info : Mapping[UserInfo, str] + context : dict[str, str] + The request context for the invocation. + """ + return Server._op_updateRegistration.invoke(self, ((userid, info), context)) + + def updateRegistrationAsync(self, userid: int, info: Mapping[UserInfo, str], context: dict[str, str] | None = None) -> Awaitable[None]: + """ + Update the registration for a user. You can use this to set the email or password of a user, + and can also use it to change the user's name. + + Parameters + ---------- + userid : int + info : Mapping[UserInfo, str] + context : dict[str, str] + The request context for the invocation. + + Returns + ------- + Awaitable[None] + An awaitable that is completed when the invocation completes. + """ + return Server._op_updateRegistration.invokeAsync(self, ((userid, info), context)) + + def getRegistration(self, userid: int, context: dict[str, str] | None = None) -> dict[UserInfo, str]: + """ + Fetch registration for a single user. + + Parameters + ---------- + userid : int + ID of registered user. See ``RegisteredUser.userid``. + context : dict[str, str] + The request context for the invocation. + + Returns + ------- + dict[UserInfo, str] + Registration record. + """ + return Server._op_getRegistration.invoke(self, ((userid, ), context)) + + def getRegistrationAsync(self, userid: int, context: dict[str, str] | None = None) -> Awaitable[dict[UserInfo, str]]: + """ + Fetch registration for a single user. + + Parameters + ---------- + userid : int + ID of registered user. See ``RegisteredUser.userid``. + context : dict[str, str] + The request context for the invocation. + + Returns + ------- + Awaitable[dict[UserInfo, str]] + Registration record. + """ + return Server._op_getRegistration.invokeAsync(self, ((userid, ), context)) + + def getRegisteredUsers(self, filter: str, context: dict[str, str] | None = None) -> dict[int, str]: + """ + Fetch a group of registered users. + + Parameters + ---------- + filter : str + Substring of user name. If blank, will retrieve all registered users. + context : dict[str, str] + The request context for the invocation. + + Returns + ------- + dict[int, str] + List of registration records. + """ + return Server._op_getRegisteredUsers.invoke(self, ((filter, ), context)) + + def getRegisteredUsersAsync(self, filter: str, context: dict[str, str] | None = None) -> Awaitable[dict[int, str]]: + """ + Fetch a group of registered users. + + Parameters + ---------- + filter : str + Substring of user name. If blank, will retrieve all registered users. + context : dict[str, str] + The request context for the invocation. + + Returns + ------- + Awaitable[dict[int, str]] + List of registration records. + """ + return Server._op_getRegisteredUsers.invokeAsync(self, ((filter, ), context)) + + def verifyPassword(self, name: str, pw: str, context: dict[str, str] | None = None) -> int: + """ + Verify the password of a user. You can use this to verify a user's credentials. + + Parameters + ---------- + name : str + User name. See ``RegisteredUser.name``. + pw : str + User password. + context : dict[str, str] + The request context for the invocation. + + Returns + ------- + int + User ID of registered user (See ``RegisteredUser.userid``), -1 for failed authentication or -2 for unknown usernames. + """ + return Server._op_verifyPassword.invoke(self, ((name, pw), context)) + + def verifyPasswordAsync(self, name: str, pw: str, context: dict[str, str] | None = None) -> Awaitable[int]: + """ + Verify the password of a user. You can use this to verify a user's credentials. + + Parameters + ---------- + name : str + User name. See ``RegisteredUser.name``. + pw : str + User password. + context : dict[str, str] + The request context for the invocation. + + Returns + ------- + Awaitable[int] + User ID of registered user (See ``RegisteredUser.userid``), -1 for failed authentication or -2 for unknown usernames. + """ + return Server._op_verifyPassword.invokeAsync(self, ((name, pw), context)) + + def getTexture(self, userid: int, context: dict[str, str] | None = None) -> bytes: + """ + Fetch user texture. Textures are stored as zlib compress()ed 600x60 32-bit BGRA data. + + Parameters + ---------- + userid : int + ID of registered user. See ``RegisteredUser.userid``. + context : dict[str, str] + The request context for the invocation. + + Returns + ------- + bytes + Custom texture associated with user or an empty texture. + """ + return Server._op_getTexture.invoke(self, ((userid, ), context)) + + def getTextureAsync(self, userid: int, context: dict[str, str] | None = None) -> Awaitable[bytes]: + """ + Fetch user texture. Textures are stored as zlib compress()ed 600x60 32-bit BGRA data. + + Parameters + ---------- + userid : int + ID of registered user. See ``RegisteredUser.userid``. + context : dict[str, str] + The request context for the invocation. + + Returns + ------- + Awaitable[bytes] + Custom texture associated with user or an empty texture. + """ + return Server._op_getTexture.invokeAsync(self, ((userid, ), context)) + + def setTexture(self, userid: int, tex: Sequence[int] | bytes | Buffer, context: dict[str, str] | None = None) -> None: + """ + Set a user texture (now called avatar). + + Parameters + ---------- + userid : int + ID of registered user. See ``RegisteredUser.userid``. + tex : Sequence[int] | bytes | Buffer + Texture (as a Byte-Array) to set for the user, or an empty texture to remove the existing texture. + context : dict[str, str] + The request context for the invocation. + """ + return Server._op_setTexture.invoke(self, ((userid, tex), context)) + + def setTextureAsync(self, userid: int, tex: Sequence[int] | bytes | Buffer, context: dict[str, str] | None = None) -> Awaitable[None]: + """ + Set a user texture (now called avatar). + + Parameters + ---------- + userid : int + ID of registered user. See ``RegisteredUser.userid``. + tex : Sequence[int] | bytes | Buffer + Texture (as a Byte-Array) to set for the user, or an empty texture to remove the existing texture. + context : dict[str, str] + The request context for the invocation. + + Returns + ------- + Awaitable[None] + An awaitable that is completed when the invocation completes. + """ + return Server._op_setTexture.invokeAsync(self, ((userid, tex), context)) + + def getUptime(self, context: dict[str, str] | None = None) -> int: + """ + Get virtual server uptime. + + Parameters + ---------- + context : dict[str, str] + The request context for the invocation. + + Returns + ------- + int + Uptime of the virtual server in seconds + """ + return Server._op_getUptime.invoke(self, ((), context)) + + def getUptimeAsync(self, context: dict[str, str] | None = None) -> Awaitable[int]: + """ + Get virtual server uptime. + + Parameters + ---------- + context : dict[str, str] + The request context for the invocation. + + Returns + ------- + Awaitable[int] + Uptime of the virtual server in seconds + """ + return Server._op_getUptime.invokeAsync(self, ((), context)) + + def updateCertificate(self, certificate: str, privateKey: str, passphrase: str, context: dict[str, str] | None = None) -> None: + """ + Update the server's certificate information. + + Reconfigure the running server's TLS socket with the given + certificate and private key. + + The certificate and and private key must be PEM formatted. + + New clients will see the new certificate. + Existing clients will continue to see the certificate the server + was using when they connected to it. + + This method throws InvalidInputDataException if any of the + following errors happen: + - Unable to decode the PEM certificate and/or private key. + - Unable to decrypt the private key with the given passphrase. + - The certificate and/or private key do not contain RSA keys. + - The certificate is not usable with the given private key. + + Parameters + ---------- + certificate : str + privateKey : str + passphrase : str + context : dict[str, str] + The request context for the invocation. + """ + return Server._op_updateCertificate.invoke(self, ((certificate, privateKey, passphrase), context)) + + def updateCertificateAsync(self, certificate: str, privateKey: str, passphrase: str, context: dict[str, str] | None = None) -> Awaitable[None]: + """ + Update the server's certificate information. + + Reconfigure the running server's TLS socket with the given + certificate and private key. + + The certificate and and private key must be PEM formatted. + + New clients will see the new certificate. + Existing clients will continue to see the certificate the server + was using when they connected to it. + + This method throws InvalidInputDataException if any of the + following errors happen: + - Unable to decode the PEM certificate and/or private key. + - Unable to decrypt the private key with the given passphrase. + - The certificate and/or private key do not contain RSA keys. + - The certificate is not usable with the given private key. + + Parameters + ---------- + certificate : str + privateKey : str + passphrase : str + context : dict[str, str] + The request context for the invocation. + + Returns + ------- + Awaitable[None] + An awaitable that is completed when the invocation completes. + """ + return Server._op_updateCertificate.invokeAsync(self, ((certificate, privateKey, passphrase), context)) + + def startListening(self, userid: int, channelid: int, context: dict[str, str] | None = None) -> None: + """ + Makes the given user start listening to the given channel. + + Parameters + ---------- + userid : int + The ID of the user + channelid : int + The ID of the channel + context : dict[str, str] + The request context for the invocation. + """ + return Server._op_startListening.invoke(self, ((userid, channelid), context)) + + def startListeningAsync(self, userid: int, channelid: int, context: dict[str, str] | None = None) -> Awaitable[None]: + """ + Makes the given user start listening to the given channel. + + Parameters + ---------- + userid : int + The ID of the user + channelid : int + The ID of the channel + context : dict[str, str] + The request context for the invocation. + + Returns + ------- + Awaitable[None] + An awaitable that is completed when the invocation completes. + """ + return Server._op_startListening.invokeAsync(self, ((userid, channelid), context)) + + def stopListening(self, userid: int, channelid: int, context: dict[str, str] | None = None) -> None: + """ + Makes the given user stop listening to the given channel. + + Parameters + ---------- + userid : int + The ID of the user + channelid : int + The ID of the channel + context : dict[str, str] + The request context for the invocation. + """ + return Server._op_stopListening.invoke(self, ((userid, channelid), context)) + + def stopListeningAsync(self, userid: int, channelid: int, context: dict[str, str] | None = None) -> Awaitable[None]: + """ + Makes the given user stop listening to the given channel. + + Parameters + ---------- + userid : int + The ID of the user + channelid : int + The ID of the channel + context : dict[str, str] + The request context for the invocation. + + Returns + ------- + Awaitable[None] + An awaitable that is completed when the invocation completes. + """ + return Server._op_stopListening.invokeAsync(self, ((userid, channelid), context)) + + def isListening(self, userid: int, channelid: int, context: dict[str, str] | None = None) -> bool: + """ + Parameters + ---------- + userid : int + The ID of the user + channelid : int + The ID of the channel + context : dict[str, str] + The request context for the invocation. + + Returns + ------- + bool + """ + return Server._op_isListening.invoke(self, ((userid, channelid), context)) + + def isListeningAsync(self, userid: int, channelid: int, context: dict[str, str] | None = None) -> Awaitable[bool]: + """ + Parameters + ---------- + userid : int + The ID of the user + channelid : int + The ID of the channel + context : dict[str, str] + The request context for the invocation. + + Returns + ------- + Awaitable[bool] + """ + return Server._op_isListening.invokeAsync(self, ((userid, channelid), context)) + + def getListeningChannels(self, userid: int, context: dict[str, str] | None = None) -> list[int]: + """ + Parameters + ---------- + userid : int + The ID of the user + context : dict[str, str] + The request context for the invocation. + + Returns + ------- + list[int] + """ + return Server._op_getListeningChannels.invoke(self, ((userid, ), context)) + + def getListeningChannelsAsync(self, userid: int, context: dict[str, str] | None = None) -> Awaitable[list[int]]: + """ + Parameters + ---------- + userid : int + The ID of the user + context : dict[str, str] + The request context for the invocation. + + Returns + ------- + Awaitable[list[int]] + """ + return Server._op_getListeningChannels.invokeAsync(self, ((userid, ), context)) + + def getListeningUsers(self, channelid: int, context: dict[str, str] | None = None) -> list[int]: + """ + Parameters + ---------- + channelid : int + The ID of the channel + context : dict[str, str] + The request context for the invocation. + + Returns + ------- + list[int] + """ + return Server._op_getListeningUsers.invoke(self, ((channelid, ), context)) + + def getListeningUsersAsync(self, channelid: int, context: dict[str, str] | None = None) -> Awaitable[list[int]]: + """ + Parameters + ---------- + channelid : int + The ID of the channel + context : dict[str, str] + The request context for the invocation. + + Returns + ------- + Awaitable[list[int]] + """ + return Server._op_getListeningUsers.invokeAsync(self, ((channelid, ), context)) + + def getListenerVolumeAdjustment(self, channelid: int, userid: int, context: dict[str, str] | None = None) -> float: + """ + Parameters + ---------- + channelid : int + The ID of the channel + userid : int + The ID of the user + context : dict[str, str] + The request context for the invocation. + + Returns + ------- + float + """ + return Server._op_getListenerVolumeAdjustment.invoke(self, ((channelid, userid), context)) + + def getListenerVolumeAdjustmentAsync(self, channelid: int, userid: int, context: dict[str, str] | None = None) -> Awaitable[float]: + """ + Parameters + ---------- + channelid : int + The ID of the channel + userid : int + The ID of the user + context : dict[str, str] + The request context for the invocation. + + Returns + ------- + Awaitable[float] + """ + return Server._op_getListenerVolumeAdjustment.invokeAsync(self, ((channelid, userid), context)) + + def setListenerVolumeAdjustment(self, channelid: int, userid: int, volumeAdjustment: float, context: dict[str, str] | None = None) -> None: + """ + Sets the volume adjustment set for a listener of the given user in the given channel + + Parameters + ---------- + channelid : int + The ID of the channel + userid : int + The ID of the user + volumeAdjustment : float + context : dict[str, str] + The request context for the invocation. + """ + return Server._op_setListenerVolumeAdjustment.invoke(self, ((channelid, userid, volumeAdjustment), context)) + + def setListenerVolumeAdjustmentAsync(self, channelid: int, userid: int, volumeAdjustment: float, context: dict[str, str] | None = None) -> Awaitable[None]: + """ + Sets the volume adjustment set for a listener of the given user in the given channel + + Parameters + ---------- + channelid : int + The ID of the channel + userid : int + The ID of the user + volumeAdjustment : float + context : dict[str, str] + The request context for the invocation. + + Returns + ------- + Awaitable[None] + An awaitable that is completed when the invocation completes. + """ + return Server._op_setListenerVolumeAdjustment.invokeAsync(self, ((channelid, userid, volumeAdjustment), context)) + + def sendWelcomeMessage(self, receiverUserIDs: Sequence[int] | Buffer, context: dict[str, str] | None = None) -> None: + """ + Parameters + ---------- + receiverUserIDs : Sequence[int] | Buffer + list of IDs of the users the message shall be sent to + context : dict[str, str] + The request context for the invocation. + """ + return Server._op_sendWelcomeMessage.invoke(self, ((receiverUserIDs, ), context)) + + def sendWelcomeMessageAsync(self, receiverUserIDs: Sequence[int] | Buffer, context: dict[str, str] | None = None) -> Awaitable[None]: + """ + Parameters + ---------- + receiverUserIDs : Sequence[int] | Buffer + list of IDs of the users the message shall be sent to + context : dict[str, str] + The request context for the invocation. + + Returns + ------- + Awaitable[None] + An awaitable that is completed when the invocation completes. + """ + return Server._op_sendWelcomeMessage.invokeAsync(self, ((receiverUserIDs, ), context)) + + @staticmethod + def checkedCast( + proxy: ObjectPrx | None, + facet: str | None = None, + context: dict[str, str] | None = None + ) -> ServerPrx | None: + return checkedCast(ServerPrx, proxy, facet, context) + + @staticmethod + def checkedCastAsync( + proxy: ObjectPrx | None, + facet: str | None = None, + context: dict[str, str] | None = None + ) -> Awaitable[ServerPrx | None ]: + return checkedCastAsync(ServerPrx, proxy, facet, context) + + @overload + @staticmethod + def uncheckedCast(proxy: ObjectPrx, facet: str | None = None) -> ServerPrx: + ... + + @overload + @staticmethod + def uncheckedCast(proxy: None, facet: str | None = None) -> None: + ... + + @staticmethod + def uncheckedCast(proxy: ObjectPrx | None, facet: str | None = None) -> ServerPrx | None: + return uncheckedCast(ServerPrx, proxy, facet) + + @staticmethod + def ice_staticId() -> str: + return "::MumbleServer::Server" + +IcePy.defineProxy("::MumbleServer::Server", ServerPrx) + +class Server(Object, ABC): + """ + Per-server interface. This includes all methods for configuring and altering + the state of a single virtual server. You can retrieve a pointer to this interface + from one of the methods in :class:`MumbleServer.MetaPrx`. + + Notes + ----- + The Slice compiler generated this skeleton class from Slice interface ``::MumbleServer::Server``. + """ + + _ice_ids: Sequence[str] = ("::Ice::Object", "::MumbleServer::Server", ) + _op_isRunning: IcePy.Operation + _op_start: IcePy.Operation + _op_stop: IcePy.Operation + _op_delete: IcePy.Operation + _op_id: IcePy.Operation + _op_addCallback: IcePy.Operation + _op_removeCallback: IcePy.Operation + _op_setAuthenticator: IcePy.Operation + _op_getConf: IcePy.Operation + _op_getAllConf: IcePy.Operation + _op_setConf: IcePy.Operation + _op_setSuperuserPassword: IcePy.Operation + _op_getLog: IcePy.Operation + _op_getLogLen: IcePy.Operation + _op_getUsers: IcePy.Operation + _op_getChannels: IcePy.Operation + _op_getCertificateList: IcePy.Operation + _op_getTree: IcePy.Operation + _op_getBans: IcePy.Operation + _op_setBans: IcePy.Operation + _op_kickUser: IcePy.Operation + _op_getState: IcePy.Operation + _op_setState: IcePy.Operation + _op_sendMessage: IcePy.Operation + _op_hasPermission: IcePy.Operation + _op_effectivePermissions: IcePy.Operation + _op_addContextCallback: IcePy.Operation + _op_removeContextCallback: IcePy.Operation + _op_getChannelState: IcePy.Operation + _op_setChannelState: IcePy.Operation + _op_removeChannel: IcePy.Operation + _op_addChannel: IcePy.Operation + _op_sendMessageChannel: IcePy.Operation + _op_getACL: IcePy.Operation + _op_setACL: IcePy.Operation + _op_addUserToGroup: IcePy.Operation + _op_removeUserFromGroup: IcePy.Operation + _op_redirectWhisperGroup: IcePy.Operation + _op_getUserNames: IcePy.Operation + _op_getUserIds: IcePy.Operation + _op_registerUser: IcePy.Operation + _op_unregisterUser: IcePy.Operation + _op_updateRegistration: IcePy.Operation + _op_getRegistration: IcePy.Operation + _op_getRegisteredUsers: IcePy.Operation + _op_verifyPassword: IcePy.Operation + _op_getTexture: IcePy.Operation + _op_setTexture: IcePy.Operation + _op_getUptime: IcePy.Operation + _op_updateCertificate: IcePy.Operation + _op_startListening: IcePy.Operation + _op_stopListening: IcePy.Operation + _op_isListening: IcePy.Operation + _op_getListeningChannels: IcePy.Operation + _op_getListeningUsers: IcePy.Operation + _op_getListenerVolumeAdjustment: IcePy.Operation + _op_setListenerVolumeAdjustment: IcePy.Operation + _op_sendWelcomeMessage: IcePy.Operation + + @staticmethod + def ice_staticId() -> str: + return "::MumbleServer::Server" + + @abstractmethod + def isRunning(self, current: Current) -> bool | Awaitable[bool]: + """ + Shows if the server currently running (accepting users). + + Parameters + ---------- + current : Ice.Current + The Current object for the dispatch. + + Returns + ------- + bool | Awaitable[bool] + Run-state of server. + """ + pass + + @abstractmethod + def start(self, current: Current) -> None | Awaitable[None]: + """ + Start server. + + Parameters + ---------- + current : Ice.Current + The Current object for the dispatch. + + Returns + ------- + None | Awaitable[None] + None or an awaitable that completes when the dispatch completes. + """ + pass + + @abstractmethod + def stop(self, current: Current) -> None | Awaitable[None]: + """ + Stop server. + Note: Server will be restarted on application restart unless explicitly disabled + with setConf("boot", false) + + Parameters + ---------- + current : Ice.Current + The Current object for the dispatch. + + Returns + ------- + None | Awaitable[None] + None or an awaitable that completes when the dispatch completes. + """ + pass + + @abstractmethod + def delete(self, current: Current) -> None | Awaitable[None]: + """ + Delete server and all it's configuration. + + Parameters + ---------- + current : Ice.Current + The Current object for the dispatch. + + Returns + ------- + None | Awaitable[None] + None or an awaitable that completes when the dispatch completes. + """ + pass + + @abstractmethod + def id(self, current: Current) -> int | Awaitable[int]: + """ + Fetch the server id. + + Parameters + ---------- + current : Ice.Current + The Current object for the dispatch. + + Returns + ------- + int | Awaitable[int] + Unique server id. + """ + pass + + @abstractmethod + def addCallback(self, cb: ServerCallbackPrx | None, current: Current) -> None | Awaitable[None]: + """ + Add a callback. The callback will receive notifications about changes to users and channels. + + Parameters + ---------- + cb : ServerCallbackPrx | None + Callback interface which will receive notifications. + current : Ice.Current + The Current object for the dispatch. + + Returns + ------- + None | Awaitable[None] + None or an awaitable that completes when the dispatch completes. + + See Also + -------- + :meth:`MumbleServer.ServerPrx.removeCallbackAsync` + """ + pass + + @abstractmethod + def removeCallback(self, cb: ServerCallbackPrx | None, current: Current) -> None | Awaitable[None]: + """ + Remove a callback. + + Parameters + ---------- + cb : ServerCallbackPrx | None + Callback interface to be removed. + current : Ice.Current + The Current object for the dispatch. + + Returns + ------- + None | Awaitable[None] + None or an awaitable that completes when the dispatch completes. + + See Also + -------- + :meth:`MumbleServer.ServerPrx.addCallbackAsync` + """ + pass + + @abstractmethod + def setAuthenticator(self, auth: ServerAuthenticatorPrx | None, current: Current) -> None | Awaitable[None]: + """ + Set external authenticator. If set, all authentications from clients are forwarded to this + proxy. + + Parameters + ---------- + auth : ServerAuthenticatorPrx | None + Authenticator object to perform subsequent authentications. + current : Ice.Current + The Current object for the dispatch. + + Returns + ------- + None | Awaitable[None] + None or an awaitable that completes when the dispatch completes. + """ + pass + + @abstractmethod + def getConf(self, key: str, current: Current) -> str | Awaitable[str]: + """ + Retrieve configuration item. + + Parameters + ---------- + key : str + Configuration key. + current : Ice.Current + The Current object for the dispatch. + + Returns + ------- + str | Awaitable[str] + Configuration value. If this is empty, see ``Meta.getDefaultConf`` + """ + pass + + @abstractmethod + def getAllConf(self, current: Current) -> Mapping[str, str] | Awaitable[Mapping[str, str]]: + """ + Retrieve all configuration items. + + Parameters + ---------- + current : Ice.Current + The Current object for the dispatch. + + Returns + ------- + Mapping[str, str] | Awaitable[Mapping[str, str]] + All configured values. If a value isn't set here, the value from ``Meta.getDefaultConf`` is used. + """ + pass + + @abstractmethod + def setConf(self, key: str, value: str, current: Current) -> None | Awaitable[None]: + """ + Set a configuration item. + + Parameters + ---------- + key : str + Configuration key. + value : str + Configuration value. + current : Ice.Current + The Current object for the dispatch. + + Returns + ------- + None | Awaitable[None] + None or an awaitable that completes when the dispatch completes. + """ + pass + + @abstractmethod + def setSuperuserPassword(self, pw: str, current: Current) -> None | Awaitable[None]: + """ + Set superuser password. This is just a convenience for using :meth:`MumbleServer.ServerPrx.updateRegistrationAsync` on user id 0. + + Parameters + ---------- + pw : str + Password. + current : Ice.Current + The Current object for the dispatch. + + Returns + ------- + None | Awaitable[None] + None or an awaitable that completes when the dispatch completes. + """ + pass + + @abstractmethod + def getLog(self, first: int, last: int, current: Current) -> Sequence[LogEntry] | Awaitable[Sequence[LogEntry]]: + """ + Fetch log entries. + + Parameters + ---------- + first : int + Lowest numbered entry to fetch. 0 is the most recent item. + last : int + Last entry to fetch. + current : Ice.Current + The Current object for the dispatch. + + Returns + ------- + Sequence[LogEntry] | Awaitable[Sequence[LogEntry]] + List of log entries. + """ + pass + + @abstractmethod + def getLogLen(self, current: Current) -> int | Awaitable[int]: + """ + Fetch length of log + + Parameters + ---------- + current : Ice.Current + The Current object for the dispatch. + + Returns + ------- + int | Awaitable[int] + Number of entries in log + """ + pass + + @abstractmethod + def getUsers(self, current: Current) -> Mapping[int, User] | Awaitable[Mapping[int, User]]: + """ + Fetch all users. This returns all currently connected users on the server. + + Parameters + ---------- + current : Ice.Current + The Current object for the dispatch. + + Returns + ------- + Mapping[int, User] | Awaitable[Mapping[int, User]] + List of connected users. + + See Also + -------- + :meth:`MumbleServer.ServerPrx.getStateAsync` + """ + pass + + @abstractmethod + def getChannels(self, current: Current) -> Mapping[int, Channel] | Awaitable[Mapping[int, Channel]]: + """ + Fetch all channels. This returns all defined channels on the server. The root channel is always channel 0. + + Parameters + ---------- + current : Ice.Current + The Current object for the dispatch. + + Returns + ------- + Mapping[int, Channel] | Awaitable[Mapping[int, Channel]] + List of defined channels. + + See Also + -------- + :meth:`MumbleServer.ServerPrx.getChannelStateAsync` + """ + pass + + @abstractmethod + def getCertificateList(self, session: int, current: Current) -> Sequence[Sequence[int] | bytes | Buffer] | Awaitable[Sequence[Sequence[int] | bytes | Buffer]]: + """ + Fetch certificate of user. This returns the complete certificate chain of a user. + + Parameters + ---------- + session : int + Connection ID of user. See ``User.session``. + current : Ice.Current + The Current object for the dispatch. + + Returns + ------- + Sequence[Sequence[int] | bytes | Buffer] | Awaitable[Sequence[Sequence[int] | bytes | Buffer]] + Certificate list of user. + """ + pass + + @abstractmethod + def getTree(self, current: Current) -> Tree | None | Awaitable[Tree | None]: + """ + Fetch all channels and connected users as a tree. This retrieves an easy-to-use representation of the server + as a tree. This is primarily used for viewing the state of the server on a webpage. + + Parameters + ---------- + current : Ice.Current + The Current object for the dispatch. + + Returns + ------- + Tree | None | Awaitable[Tree | None] + Recursive tree of all channels and connected users. + """ + pass + + @abstractmethod + def getBans(self, current: Current) -> Sequence[Ban] | Awaitable[Sequence[Ban]]: + """ + Fetch all current IP bans on the server. + + Parameters + ---------- + current : Ice.Current + The Current object for the dispatch. + + Returns + ------- + Sequence[Ban] | Awaitable[Sequence[Ban]] + List of bans. + """ + pass + + @abstractmethod + def setBans(self, bans: list[Ban], current: Current) -> None | Awaitable[None]: + """ + Set all current IP bans on the server. This will replace any bans already present, so if you want to add a ban, be sure to call :meth:`MumbleServer.ServerPrx.getBansAsync` and then + append to the returned list before calling this method. + + Parameters + ---------- + bans : list[Ban] + List of bans. + current : Ice.Current + The Current object for the dispatch. + + Returns + ------- + None | Awaitable[None] + None or an awaitable that completes when the dispatch completes. + """ + pass + + @abstractmethod + def kickUser(self, session: int, reason: str, current: Current) -> None | Awaitable[None]: + """ + Kick a user. The user is not banned, and is free to rejoin the server. + + Parameters + ---------- + session : int + Connection ID of user. See ``User.session``. + reason : str + Text message to show when user is kicked. + current : Ice.Current + The Current object for the dispatch. + + Returns + ------- + None | Awaitable[None] + None or an awaitable that completes when the dispatch completes. + """ + pass + + @abstractmethod + def getState(self, session: int, current: Current) -> User | Awaitable[User]: + """ + Get state of a single connected user. + + Parameters + ---------- + session : int + Connection ID of user. See ``User.session``. + current : Ice.Current + The Current object for the dispatch. + + Returns + ------- + User | Awaitable[User] + State of connected user. + + See Also + -------- + :meth:`MumbleServer.ServerPrx.setStateAsync` + :meth:`MumbleServer.ServerPrx.getUsersAsync` + """ + pass + + @abstractmethod + def setState(self, state: User, current: Current) -> None | Awaitable[None]: + """ + Set user state. You can use this to move, mute and deafen users. + + Parameters + ---------- + state : User + User state to set. + current : Ice.Current + The Current object for the dispatch. + + Returns + ------- + None | Awaitable[None] + None or an awaitable that completes when the dispatch completes. + + See Also + -------- + :meth:`MumbleServer.ServerPrx.getStateAsync` + """ + pass + + @abstractmethod + def sendMessage(self, session: int, text: str, current: Current) -> None | Awaitable[None]: + """ + Send text message to a single user. + + Parameters + ---------- + session : int + Connection ID of user. See ``User.session``. + text : str + Message to send. + current : Ice.Current + The Current object for the dispatch. + + Returns + ------- + None | Awaitable[None] + None or an awaitable that completes when the dispatch completes. + + See Also + -------- + :meth:`MumbleServer.ServerPrx.sendMessageChannelAsync` + """ + pass + + @abstractmethod + def hasPermission(self, session: int, channelid: int, perm: int, current: Current) -> bool | Awaitable[bool]: + """ + Check if user is permitted to perform action. + + Parameters + ---------- + session : int + Connection ID of user. See ``User.session``. + channelid : int + ID of Channel. See ``Channel.id``. + perm : int + Permission bits to check. + current : Ice.Current + The Current object for the dispatch. + + Returns + ------- + bool | Awaitable[bool] + true if any of the permissions in perm were set for the user. + """ + pass + + @abstractmethod + def effectivePermissions(self, session: int, channelid: int, current: Current) -> int | Awaitable[int]: + """ + Return users effective permissions + + Parameters + ---------- + session : int + Connection ID of user. See ``User.session``. + channelid : int + ID of Channel. See ``Channel.id``. + current : Ice.Current + The Current object for the dispatch. + + Returns + ------- + int | Awaitable[int] + bitfield of allowed actions + """ + pass + + @abstractmethod + def addContextCallback(self, session: int, action: str, text: str, cb: ServerContextCallbackPrx | None, ctx: int, current: Current) -> None | Awaitable[None]: + """ + Add a context callback. This is done per user, and will add a context menu action for the user. + + Parameters + ---------- + session : int + Session of user which should receive context entry. + action : str + Action string, a unique name to associate with the action. + text : str + Name of action shown to user. + cb : ServerContextCallbackPrx | None + Callback interface which will receive notifications. + ctx : int + Context this should be used in. Needs to be one or a combination of :class:`MumbleServer.ContextServer`, :class:`MumbleServer.ContextChannel` and :class:`MumbleServer.ContextUser`. + current : Ice.Current + The Current object for the dispatch. + + Returns + ------- + None | Awaitable[None] + None or an awaitable that completes when the dispatch completes. + + See Also + -------- + :meth:`MumbleServer.ServerPrx.removeContextCallbackAsync` + """ + pass + + @abstractmethod + def removeContextCallback(self, cb: ServerContextCallbackPrx | None, current: Current) -> None | Awaitable[None]: + """ + Remove a callback. + + Parameters + ---------- + cb : ServerContextCallbackPrx | None + Callback interface to be removed. This callback will be removed from all from all users. + current : Ice.Current + The Current object for the dispatch. + + Returns + ------- + None | Awaitable[None] + None or an awaitable that completes when the dispatch completes. + + See Also + -------- + :meth:`MumbleServer.ServerPrx.addContextCallbackAsync` + """ + pass + + @abstractmethod + def getChannelState(self, channelid: int, current: Current) -> Channel | Awaitable[Channel]: + """ + Get state of single channel. + + Parameters + ---------- + channelid : int + ID of Channel. See ``Channel.id``. + current : Ice.Current + The Current object for the dispatch. + + Returns + ------- + Channel | Awaitable[Channel] + State of channel. + + See Also + -------- + :meth:`MumbleServer.ServerPrx.setChannelStateAsync` + :meth:`MumbleServer.ServerPrx.getChannelsAsync` + """ + pass + + @abstractmethod + def setChannelState(self, state: Channel, current: Current) -> None | Awaitable[None]: + """ + Set state of a single channel. You can use this to move or relink channels. + + Parameters + ---------- + state : Channel + Channel state to set. + current : Ice.Current + The Current object for the dispatch. + + Returns + ------- + None | Awaitable[None] + None or an awaitable that completes when the dispatch completes. + + See Also + -------- + :meth:`MumbleServer.ServerPrx.getChannelStateAsync` + """ + pass + + @abstractmethod + def removeChannel(self, channelid: int, current: Current) -> None | Awaitable[None]: + """ + Remove a channel and all its subchannels. + + Parameters + ---------- + channelid : int + ID of Channel. See ``Channel.id``. + current : Ice.Current + The Current object for the dispatch. + + Returns + ------- + None | Awaitable[None] + None or an awaitable that completes when the dispatch completes. + """ + pass + + @abstractmethod + def addChannel(self, name: str, parent: int, current: Current) -> int | Awaitable[int]: + """ + Add a new channel. + + Parameters + ---------- + name : str + Name of new channel. + parent : int + Channel ID of parent channel. See ``Channel.id``. + current : Ice.Current + The Current object for the dispatch. + + Returns + ------- + int | Awaitable[int] + ID of newly created channel. + """ + pass + + @abstractmethod + def sendMessageChannel(self, channelid: int, tree: bool, text: str, current: Current) -> None | Awaitable[None]: + """ + Send text message to channel or a tree of channels. + + Parameters + ---------- + channelid : int + Channel ID of channel to send to. See ``Channel.id``. + tree : bool + If true, the message will be sent to the channel and all its subchannels. + text : str + Message to send. + current : Ice.Current + The Current object for the dispatch. + + Returns + ------- + None | Awaitable[None] + None or an awaitable that completes when the dispatch completes. + + See Also + -------- + :meth:`MumbleServer.ServerPrx.sendMessageAsync` + """ + pass + + @abstractmethod + def getACL(self, channelid: int, current: Current) -> tuple[Sequence[ACL], Sequence[Group], bool] | Awaitable[tuple[Sequence[ACL], Sequence[Group], bool]]: + """ + Retrieve ACLs and Groups on a channel. + + Parameters + ---------- + channelid : int + Channel ID of channel to fetch from. See ``Channel.id``. + current : Ice.Current + The Current object for the dispatch. + + Returns + ------- + tuple[Sequence[ACL], Sequence[Group], bool] | Awaitable[tuple[Sequence[ACL], Sequence[Group], bool]] + + A tuple containing: + - Sequence[ACL] List of ACLs on the channel. This will include inherited ACLs. + - Sequence[Group] List of groups on the channel. This will include inherited groups. + - bool Does this channel inherit ACLs from the parent channel? + """ + pass + + @abstractmethod + def setACL(self, channelid: int, acls: list[ACL], groups: list[Group], inherit: bool, current: Current) -> None | Awaitable[None]: + """ + Set ACLs and Groups on a channel. Note that this will replace all existing ACLs and groups on the channel. + + Parameters + ---------- + channelid : int + Channel ID of channel to fetch from. See ``Channel.id``. + acls : list[ACL] + List of ACLs on the channel. + groups : list[Group] + List of groups on the channel. + inherit : bool + Should this channel inherit ACLs from the parent channel? + current : Ice.Current + The Current object for the dispatch. + + Returns + ------- + None | Awaitable[None] + None or an awaitable that completes when the dispatch completes. + """ + pass + + @abstractmethod + def addUserToGroup(self, channelid: int, session: int, group: str, current: Current) -> None | Awaitable[None]: + """ + Temporarily add a user to a group on a channel. This state is not saved, and is intended for temporary memberships. + + Parameters + ---------- + channelid : int + Channel ID of channel to add to. See ``Channel.id``. + session : int + Connection ID of user. See ``User.session``. + group : str + Group name to add to. + current : Ice.Current + The Current object for the dispatch. + + Returns + ------- + None | Awaitable[None] + None or an awaitable that completes when the dispatch completes. + """ + pass + + @abstractmethod + def removeUserFromGroup(self, channelid: int, session: int, group: str, current: Current) -> None | Awaitable[None]: + """ + Remove a user from a temporary group membership on a channel. This state is not saved, and is intended for temporary memberships. + + Parameters + ---------- + channelid : int + Channel ID of channel to add to. See ``Channel.id``. + session : int + Connection ID of user. See ``User.session``. + group : str + Group name to remove from. + current : Ice.Current + The Current object for the dispatch. + + Returns + ------- + None | Awaitable[None] + None or an awaitable that completes when the dispatch completes. + """ + pass + + @abstractmethod + def redirectWhisperGroup(self, session: int, source: str, target: str, current: Current) -> None | Awaitable[None]: + """ + Redirect whisper targets for user. If set, whenever a user tries to whisper to group "source", the whisper will be redirected to group "target". + To remove a redirect pass an empty target string. This is intended for context groups. + + Parameters + ---------- + session : int + Connection ID of user. See ``User.session``. + source : str + Group name to redirect from. + target : str + Group name to redirect to. + current : Ice.Current + The Current object for the dispatch. + + Returns + ------- + None | Awaitable[None] + None or an awaitable that completes when the dispatch completes. + """ + pass + + @abstractmethod + def getUserNames(self, ids: list[int], current: Current) -> Mapping[int, str] | Awaitable[Mapping[int, str]]: + """ + Map a list of ``User.userid`` to a matching name. + + Parameters + ---------- + ids : list[int] + current : Ice.Current + The Current object for the dispatch. + + Returns + ------- + Mapping[int, str] | Awaitable[Mapping[int, str]] + Matching list of names, with an empty string representing invalid or unknown ids. + """ + pass + + @abstractmethod + def getUserIds(self, names: list[str], current: Current) -> Mapping[str, int] | Awaitable[Mapping[str, int]]: + """ + Map a list of user names to a matching id. + + Parameters + ---------- + names : list[str] + current : Ice.Current + The Current object for the dispatch. + + Returns + ------- + Mapping[str, int] | Awaitable[Mapping[str, int]] + """ + pass + + @abstractmethod + def registerUser(self, info: dict[UserInfo, str], current: Current) -> int | Awaitable[int]: + """ + Register a new user. + + Parameters + ---------- + info : dict[UserInfo, str] + Information about new user. Must include at least "name". + current : Ice.Current + The Current object for the dispatch. + + Returns + ------- + int | Awaitable[int] + The ID of the user. See ``RegisteredUser.userid``. + """ + pass + + @abstractmethod + def unregisterUser(self, userid: int, current: Current) -> None | Awaitable[None]: + """ + Remove a user registration. + + Parameters + ---------- + userid : int + ID of registered user. See ``RegisteredUser.userid``. + current : Ice.Current + The Current object for the dispatch. + + Returns + ------- + None | Awaitable[None] + None or an awaitable that completes when the dispatch completes. + """ + pass + + @abstractmethod + def updateRegistration(self, userid: int, info: dict[UserInfo, str], current: Current) -> None | Awaitable[None]: + """ + Update the registration for a user. You can use this to set the email or password of a user, + and can also use it to change the user's name. + + Parameters + ---------- + userid : int + info : dict[UserInfo, str] + current : Ice.Current + The Current object for the dispatch. + + Returns + ------- + None | Awaitable[None] + None or an awaitable that completes when the dispatch completes. + """ + pass + + @abstractmethod + def getRegistration(self, userid: int, current: Current) -> Mapping[UserInfo, str] | Awaitable[Mapping[UserInfo, str]]: + """ + Fetch registration for a single user. + + Parameters + ---------- + userid : int + ID of registered user. See ``RegisteredUser.userid``. + current : Ice.Current + The Current object for the dispatch. + + Returns + ------- + Mapping[UserInfo, str] | Awaitable[Mapping[UserInfo, str]] + Registration record. + """ + pass + + @abstractmethod + def getRegisteredUsers(self, filter: str, current: Current) -> Mapping[int, str] | Awaitable[Mapping[int, str]]: + """ + Fetch a group of registered users. + + Parameters + ---------- + filter : str + Substring of user name. If blank, will retrieve all registered users. + current : Ice.Current + The Current object for the dispatch. + + Returns + ------- + Mapping[int, str] | Awaitable[Mapping[int, str]] + List of registration records. + """ + pass + + @abstractmethod + def verifyPassword(self, name: str, pw: str, current: Current) -> int | Awaitable[int]: + """ + Verify the password of a user. You can use this to verify a user's credentials. + + Parameters + ---------- + name : str + User name. See ``RegisteredUser.name``. + pw : str + User password. + current : Ice.Current + The Current object for the dispatch. + + Returns + ------- + int | Awaitable[int] + User ID of registered user (See ``RegisteredUser.userid``), -1 for failed authentication or -2 for unknown usernames. + """ + pass + + @abstractmethod + def getTexture(self, userid: int, current: Current) -> Sequence[int] | bytes | Buffer | Awaitable[Sequence[int] | bytes | Buffer]: + """ + Fetch user texture. Textures are stored as zlib compress()ed 600x60 32-bit BGRA data. + + Parameters + ---------- + userid : int + ID of registered user. See ``RegisteredUser.userid``. + current : Ice.Current + The Current object for the dispatch. + + Returns + ------- + Sequence[int] | bytes | Buffer | Awaitable[Sequence[int] | bytes | Buffer] + Custom texture associated with user or an empty texture. + """ + pass + + @abstractmethod + def setTexture(self, userid: int, tex: bytes, current: Current) -> None | Awaitable[None]: + """ + Set a user texture (now called avatar). + + Parameters + ---------- + userid : int + ID of registered user. See ``RegisteredUser.userid``. + tex : bytes + Texture (as a Byte-Array) to set for the user, or an empty texture to remove the existing texture. + current : Ice.Current + The Current object for the dispatch. + + Returns + ------- + None | Awaitable[None] + None or an awaitable that completes when the dispatch completes. + """ + pass + + @abstractmethod + def getUptime(self, current: Current) -> int | Awaitable[int]: + """ + Get virtual server uptime. + + Parameters + ---------- + current : Ice.Current + The Current object for the dispatch. + + Returns + ------- + int | Awaitable[int] + Uptime of the virtual server in seconds + """ + pass + + @abstractmethod + def updateCertificate(self, certificate: str, privateKey: str, passphrase: str, current: Current) -> None | Awaitable[None]: + """ + Update the server's certificate information. + + Reconfigure the running server's TLS socket with the given + certificate and private key. + + The certificate and and private key must be PEM formatted. + + New clients will see the new certificate. + Existing clients will continue to see the certificate the server + was using when they connected to it. + + This method throws InvalidInputDataException if any of the + following errors happen: + - Unable to decode the PEM certificate and/or private key. + - Unable to decrypt the private key with the given passphrase. + - The certificate and/or private key do not contain RSA keys. + - The certificate is not usable with the given private key. + + Parameters + ---------- + certificate : str + privateKey : str + passphrase : str + current : Ice.Current + The Current object for the dispatch. + + Returns + ------- + None | Awaitable[None] + None or an awaitable that completes when the dispatch completes. + """ + pass + + @abstractmethod + def startListening(self, userid: int, channelid: int, current: Current) -> None | Awaitable[None]: + """ + Makes the given user start listening to the given channel. + + Parameters + ---------- + userid : int + The ID of the user + channelid : int + The ID of the channel + current : Ice.Current + The Current object for the dispatch. + + Returns + ------- + None | Awaitable[None] + None or an awaitable that completes when the dispatch completes. + """ + pass + + @abstractmethod + def stopListening(self, userid: int, channelid: int, current: Current) -> None | Awaitable[None]: + """ + Makes the given user stop listening to the given channel. + + Parameters + ---------- + userid : int + The ID of the user + channelid : int + The ID of the channel + current : Ice.Current + The Current object for the dispatch. + + Returns + ------- + None | Awaitable[None] + None or an awaitable that completes when the dispatch completes. + """ + pass + + @abstractmethod + def isListening(self, userid: int, channelid: int, current: Current) -> bool | Awaitable[bool]: + """ + Parameters + ---------- + userid : int + The ID of the user + channelid : int + The ID of the channel + current : Ice.Current + The Current object for the dispatch. + + Returns + ------- + bool | Awaitable[bool] + """ + pass + + @abstractmethod + def getListeningChannels(self, userid: int, current: Current) -> Sequence[int] | Buffer | Awaitable[Sequence[int] | Buffer]: + """ + Parameters + ---------- + userid : int + The ID of the user + current : Ice.Current + The Current object for the dispatch. + + Returns + ------- + Sequence[int] | Buffer | Awaitable[Sequence[int] | Buffer] + """ + pass + + @abstractmethod + def getListeningUsers(self, channelid: int, current: Current) -> Sequence[int] | Buffer | Awaitable[Sequence[int] | Buffer]: + """ + Parameters + ---------- + channelid : int + The ID of the channel + current : Ice.Current + The Current object for the dispatch. + + Returns + ------- + Sequence[int] | Buffer | Awaitable[Sequence[int] | Buffer] + """ + pass + + @abstractmethod + def getListenerVolumeAdjustment(self, channelid: int, userid: int, current: Current) -> float | Awaitable[float]: + """ + Parameters + ---------- + channelid : int + The ID of the channel + userid : int + The ID of the user + current : Ice.Current + The Current object for the dispatch. + + Returns + ------- + float | Awaitable[float] + """ + pass + + @abstractmethod + def setListenerVolumeAdjustment(self, channelid: int, userid: int, volumeAdjustment: float, current: Current) -> None | Awaitable[None]: + """ + Sets the volume adjustment set for a listener of the given user in the given channel + + Parameters + ---------- + channelid : int + The ID of the channel + userid : int + The ID of the user + volumeAdjustment : float + current : Ice.Current + The Current object for the dispatch. + + Returns + ------- + None | Awaitable[None] + None or an awaitable that completes when the dispatch completes. + """ + pass + + @abstractmethod + def sendWelcomeMessage(self, receiverUserIDs: list[int], current: Current) -> None | Awaitable[None]: + """ + Parameters + ---------- + receiverUserIDs : list[int] + list of IDs of the users the message shall be sent to + current : Ice.Current + The Current object for the dispatch. + + Returns + ------- + None | Awaitable[None] + None or an awaitable that completes when the dispatch completes. + """ + pass + +Server._op_isRunning = IcePy.Operation( + "isRunning", + "isRunning", + OperationMode.Idempotent, + None, + (), + (), + (), + ((), IcePy._t_bool, False, 0), + (_MumbleServer_InvalidSecretException_t,)) + +Server._op_start = IcePy.Operation( + "start", + "start", + OperationMode.Normal, + None, + (), + (), + (), + None, + (_MumbleServer_ServerBootedException_t, _MumbleServer_ServerFailureException_t, _MumbleServer_InvalidSecretException_t, _MumbleServer_ReadOnlyModeException_t)) + +Server._op_stop = IcePy.Operation( + "stop", + "stop", + OperationMode.Normal, + None, + (), + (), + (), + None, + (_MumbleServer_ServerBootedException_t, _MumbleServer_InvalidSecretException_t, _MumbleServer_ReadOnlyModeException_t)) + +Server._op_delete = IcePy.Operation( + "delete", + "delete", + OperationMode.Normal, + None, + (), + (), + (), + None, + (_MumbleServer_ServerBootedException_t, _MumbleServer_InvalidSecretException_t, _MumbleServer_ReadOnlyModeException_t)) + +Server._op_id = IcePy.Operation( + "id", + "id", + OperationMode.Idempotent, + None, + (), + (), + (), + ((), IcePy._t_int, False, 0), + (_MumbleServer_InvalidSecretException_t,)) + +Server._op_addCallback = IcePy.Operation( + "addCallback", + "addCallback", + OperationMode.Normal, + None, + (), + (((), _MumbleServer_ServerCallbackPrx_t, False, 0),), + (), + None, + (_MumbleServer_ServerBootedException_t, _MumbleServer_InvalidCallbackException_t, _MumbleServer_InvalidSecretException_t)) + +Server._op_removeCallback = IcePy.Operation( + "removeCallback", + "removeCallback", + OperationMode.Normal, + None, + (), + (((), _MumbleServer_ServerCallbackPrx_t, False, 0),), + (), + None, + (_MumbleServer_ServerBootedException_t, _MumbleServer_InvalidCallbackException_t, _MumbleServer_InvalidSecretException_t)) + +Server._op_setAuthenticator = IcePy.Operation( + "setAuthenticator", + "setAuthenticator", + OperationMode.Normal, + None, + (), + (((), _MumbleServer_ServerAuthenticatorPrx_t, False, 0),), + (), + None, + (_MumbleServer_ServerBootedException_t, _MumbleServer_InvalidCallbackException_t, _MumbleServer_InvalidSecretException_t, _MumbleServer_ReadOnlyModeException_t)) + +Server._op_getConf = IcePy.Operation( + "getConf", + "getConf", + OperationMode.Idempotent, + None, + (), + (((), IcePy._t_string, False, 0),), + (), + ((), IcePy._t_string, False, 0), + (_MumbleServer_InvalidSecretException_t, _MumbleServer_WriteOnlyException_t, _MumbleServer_ReadOnlyModeException_t)) + +Server._op_getAllConf = IcePy.Operation( + "getAllConf", + "getAllConf", + OperationMode.Idempotent, + None, + (), + (), + (), + ((), _MumbleServer_ConfigMap_t, False, 0), + (_MumbleServer_InvalidSecretException_t, _MumbleServer_ReadOnlyModeException_t)) + +Server._op_setConf = IcePy.Operation( + "setConf", + "setConf", + OperationMode.Idempotent, + None, + (), + (((), IcePy._t_string, False, 0), ((), IcePy._t_string, False, 0)), + (), + None, + (_MumbleServer_InvalidSecretException_t, _MumbleServer_ReadOnlyModeException_t)) + +Server._op_setSuperuserPassword = IcePy.Operation( + "setSuperuserPassword", + "setSuperuserPassword", + OperationMode.Idempotent, + None, + (), + (((), IcePy._t_string, False, 0),), + (), + None, + (_MumbleServer_InvalidSecretException_t, _MumbleServer_ReadOnlyModeException_t)) + +Server._op_getLog = IcePy.Operation( + "getLog", + "getLog", + OperationMode.Idempotent, + None, + (), + (((), IcePy._t_int, False, 0), ((), IcePy._t_int, False, 0)), + (), + ((), _MumbleServer_LogList_t, False, 0), + (_MumbleServer_InvalidSecretException_t, _MumbleServer_ReadOnlyModeException_t)) + +Server._op_getLogLen = IcePy.Operation( + "getLogLen", + "getLogLen", + OperationMode.Idempotent, + None, + (), + (), + (), + ((), IcePy._t_int, False, 0), + (_MumbleServer_InvalidSecretException_t, _MumbleServer_ReadOnlyModeException_t)) + +Server._op_getUsers = IcePy.Operation( + "getUsers", + "getUsers", + OperationMode.Idempotent, + None, + (), + (), + (), + ((), _MumbleServer_UserMap_t, False, 0), + (_MumbleServer_ServerBootedException_t, _MumbleServer_InvalidSecretException_t)) + +Server._op_getChannels = IcePy.Operation( + "getChannels", + "getChannels", + OperationMode.Idempotent, + None, + (), + (), + (), + ((), _MumbleServer_ChannelMap_t, False, 0), + (_MumbleServer_ServerBootedException_t, _MumbleServer_InvalidSecretException_t)) + +Server._op_getCertificateList = IcePy.Operation( + "getCertificateList", + "getCertificateList", + OperationMode.Idempotent, + None, + (), + (((), IcePy._t_int, False, 0),), + (), + ((), _MumbleServer_CertificateList_t, False, 0), + (_MumbleServer_ServerBootedException_t, _MumbleServer_InvalidSessionException_t, _MumbleServer_InvalidSecretException_t)) + +Server._op_getTree = IcePy.Operation( + "getTree", + "getTree", + OperationMode.Idempotent, + None, + (), + (), + (), + ((), _MumbleServer_Tree_t, False, 0), + (_MumbleServer_ServerBootedException_t, _MumbleServer_InvalidSecretException_t)) + +Server._op_getBans = IcePy.Operation( + "getBans", + "getBans", + OperationMode.Idempotent, + None, + (), + (), + (), + ((), _MumbleServer_BanList_t, False, 0), + (_MumbleServer_ServerBootedException_t, _MumbleServer_InvalidSecretException_t)) + +Server._op_setBans = IcePy.Operation( + "setBans", + "setBans", + OperationMode.Idempotent, + None, + (), + (((), _MumbleServer_BanList_t, False, 0),), + (), + None, + (_MumbleServer_ServerBootedException_t, _MumbleServer_InvalidSecretException_t, _MumbleServer_ReadOnlyModeException_t)) + +Server._op_kickUser = IcePy.Operation( + "kickUser", + "kickUser", + OperationMode.Normal, + None, + (), + (((), IcePy._t_int, False, 0), ((), IcePy._t_string, False, 0)), + (), + None, + (_MumbleServer_ServerBootedException_t, _MumbleServer_InvalidSessionException_t, _MumbleServer_InvalidSecretException_t)) + +Server._op_getState = IcePy.Operation( + "getState", + "getState", + OperationMode.Idempotent, + None, + (), + (((), IcePy._t_int, False, 0),), + (), + ((), _MumbleServer_User_t, False, 0), + (_MumbleServer_ServerBootedException_t, _MumbleServer_InvalidSessionException_t, _MumbleServer_InvalidSecretException_t)) + +Server._op_setState = IcePy.Operation( + "setState", + "setState", + OperationMode.Idempotent, + None, + (), + (((), _MumbleServer_User_t, False, 0),), + (), + None, + (_MumbleServer_ServerBootedException_t, _MumbleServer_InvalidSessionException_t, _MumbleServer_InvalidChannelException_t, _MumbleServer_InvalidSecretException_t)) + +Server._op_sendMessage = IcePy.Operation( + "sendMessage", + "sendMessage", + OperationMode.Normal, + None, + (), + (((), IcePy._t_int, False, 0), ((), IcePy._t_string, False, 0)), + (), + None, + (_MumbleServer_ServerBootedException_t, _MumbleServer_InvalidSessionException_t, _MumbleServer_InvalidSecretException_t)) + +Server._op_hasPermission = IcePy.Operation( + "hasPermission", + "hasPermission", + OperationMode.Normal, + None, + (), + (((), IcePy._t_int, False, 0), ((), IcePy._t_int, False, 0), ((), IcePy._t_int, False, 0)), + (), + ((), IcePy._t_bool, False, 0), + (_MumbleServer_ServerBootedException_t, _MumbleServer_InvalidSessionException_t, _MumbleServer_InvalidChannelException_t, _MumbleServer_InvalidSecretException_t)) + +Server._op_effectivePermissions = IcePy.Operation( + "effectivePermissions", + "effectivePermissions", + OperationMode.Idempotent, + None, + (), + (((), IcePy._t_int, False, 0), ((), IcePy._t_int, False, 0)), + (), + ((), IcePy._t_int, False, 0), + (_MumbleServer_ServerBootedException_t, _MumbleServer_InvalidSessionException_t, _MumbleServer_InvalidChannelException_t, _MumbleServer_InvalidSecretException_t)) + +Server._op_addContextCallback = IcePy.Operation( + "addContextCallback", + "addContextCallback", + OperationMode.Normal, + None, + (), + (((), IcePy._t_int, False, 0), ((), IcePy._t_string, False, 0), ((), IcePy._t_string, False, 0), ((), _MumbleServer_ServerContextCallbackPrx_t, False, 0), ((), IcePy._t_int, False, 0)), + (), + None, + (_MumbleServer_ServerBootedException_t, _MumbleServer_InvalidCallbackException_t, _MumbleServer_InvalidSecretException_t)) + +Server._op_removeContextCallback = IcePy.Operation( + "removeContextCallback", + "removeContextCallback", + OperationMode.Normal, + None, + (), + (((), _MumbleServer_ServerContextCallbackPrx_t, False, 0),), + (), + None, + (_MumbleServer_ServerBootedException_t, _MumbleServer_InvalidCallbackException_t, _MumbleServer_InvalidSecretException_t)) + +Server._op_getChannelState = IcePy.Operation( + "getChannelState", + "getChannelState", + OperationMode.Idempotent, + None, + (), + (((), IcePy._t_int, False, 0),), + (), + ((), _MumbleServer_Channel_t, False, 0), + (_MumbleServer_ServerBootedException_t, _MumbleServer_InvalidChannelException_t, _MumbleServer_InvalidSecretException_t)) + +Server._op_setChannelState = IcePy.Operation( + "setChannelState", + "setChannelState", + OperationMode.Idempotent, + None, + (), + (((), _MumbleServer_Channel_t, False, 0),), + (), + None, + (_MumbleServer_ServerBootedException_t, _MumbleServer_InvalidChannelException_t, _MumbleServer_InvalidSecretException_t, _MumbleServer_NestingLimitException_t, _MumbleServer_ReadOnlyModeException_t)) + +Server._op_removeChannel = IcePy.Operation( + "removeChannel", + "removeChannel", + OperationMode.Normal, + None, + (), + (((), IcePy._t_int, False, 0),), + (), + None, + (_MumbleServer_ServerBootedException_t, _MumbleServer_InvalidChannelException_t, _MumbleServer_InvalidSecretException_t, _MumbleServer_ReadOnlyModeException_t)) + +Server._op_addChannel = IcePy.Operation( + "addChannel", + "addChannel", + OperationMode.Normal, + None, + (), + (((), IcePy._t_string, False, 0), ((), IcePy._t_int, False, 0)), + (), + ((), IcePy._t_int, False, 0), + (_MumbleServer_ServerBootedException_t, _MumbleServer_InvalidChannelException_t, _MumbleServer_InvalidSecretException_t, _MumbleServer_NestingLimitException_t, _MumbleServer_ReadOnlyModeException_t)) + +Server._op_sendMessageChannel = IcePy.Operation( + "sendMessageChannel", + "sendMessageChannel", + OperationMode.Normal, + None, + (), + (((), IcePy._t_int, False, 0), ((), IcePy._t_bool, False, 0), ((), IcePy._t_string, False, 0)), + (), + None, + (_MumbleServer_ServerBootedException_t, _MumbleServer_InvalidChannelException_t, _MumbleServer_InvalidSecretException_t)) + +Server._op_getACL = IcePy.Operation( + "getACL", + "getACL", + OperationMode.Idempotent, + None, + (), + (((), IcePy._t_int, False, 0),), + (((), _MumbleServer_ACLList_t, False, 0), ((), _MumbleServer_GroupList_t, False, 0), ((), IcePy._t_bool, False, 0)), + None, + (_MumbleServer_ServerBootedException_t, _MumbleServer_InvalidChannelException_t, _MumbleServer_InvalidSecretException_t)) + +Server._op_setACL = IcePy.Operation( + "setACL", + "setACL", + OperationMode.Idempotent, + None, + (), + (((), IcePy._t_int, False, 0), ((), _MumbleServer_ACLList_t, False, 0), ((), _MumbleServer_GroupList_t, False, 0), ((), IcePy._t_bool, False, 0)), + (), + None, + (_MumbleServer_ServerBootedException_t, _MumbleServer_InvalidChannelException_t, _MumbleServer_InvalidSecretException_t, _MumbleServer_ReadOnlyModeException_t)) + +Server._op_addUserToGroup = IcePy.Operation( + "addUserToGroup", + "addUserToGroup", + OperationMode.Idempotent, + None, + (), + (((), IcePy._t_int, False, 0), ((), IcePy._t_int, False, 0), ((), IcePy._t_string, False, 0)), + (), + None, + (_MumbleServer_ServerBootedException_t, _MumbleServer_InvalidChannelException_t, _MumbleServer_InvalidSessionException_t, _MumbleServer_InvalidSecretException_t)) + +Server._op_removeUserFromGroup = IcePy.Operation( + "removeUserFromGroup", + "removeUserFromGroup", + OperationMode.Idempotent, + None, + (), + (((), IcePy._t_int, False, 0), ((), IcePy._t_int, False, 0), ((), IcePy._t_string, False, 0)), + (), + None, + (_MumbleServer_ServerBootedException_t, _MumbleServer_InvalidChannelException_t, _MumbleServer_InvalidSessionException_t, _MumbleServer_InvalidSecretException_t)) + +Server._op_redirectWhisperGroup = IcePy.Operation( + "redirectWhisperGroup", + "redirectWhisperGroup", + OperationMode.Idempotent, + None, + (), + (((), IcePy._t_int, False, 0), ((), IcePy._t_string, False, 0), ((), IcePy._t_string, False, 0)), + (), + None, + (_MumbleServer_ServerBootedException_t, _MumbleServer_InvalidSessionException_t, _MumbleServer_InvalidSecretException_t)) + +Server._op_getUserNames = IcePy.Operation( + "getUserNames", + "getUserNames", + OperationMode.Idempotent, + None, + (), + (((), _MumbleServer_IdList_t, False, 0),), + (), + ((), _MumbleServer_NameMap_t, False, 0), + (_MumbleServer_ServerBootedException_t, _MumbleServer_InvalidSecretException_t)) + +Server._op_getUserIds = IcePy.Operation( + "getUserIds", + "getUserIds", + OperationMode.Idempotent, + None, + (), + (((), _MumbleServer_NameList_t, False, 0),), + (), + ((), _MumbleServer_IdMap_t, False, 0), + (_MumbleServer_ServerBootedException_t, _MumbleServer_InvalidSecretException_t)) + +Server._op_registerUser = IcePy.Operation( + "registerUser", + "registerUser", + OperationMode.Normal, + None, + (), + (((), _MumbleServer_UserInfoMap_t, False, 0),), + (), + ((), IcePy._t_int, False, 0), + (_MumbleServer_ServerBootedException_t, _MumbleServer_InvalidUserException_t, _MumbleServer_InvalidSecretException_t, _MumbleServer_ReadOnlyModeException_t)) + +Server._op_unregisterUser = IcePy.Operation( + "unregisterUser", + "unregisterUser", + OperationMode.Normal, + None, + (), + (((), IcePy._t_int, False, 0),), + (), + None, + (_MumbleServer_ServerBootedException_t, _MumbleServer_InvalidUserException_t, _MumbleServer_InvalidSecretException_t, _MumbleServer_ReadOnlyModeException_t)) + +Server._op_updateRegistration = IcePy.Operation( + "updateRegistration", + "updateRegistration", + OperationMode.Idempotent, + None, + (), + (((), IcePy._t_int, False, 0), ((), _MumbleServer_UserInfoMap_t, False, 0)), + (), + None, + (_MumbleServer_ServerBootedException_t, _MumbleServer_InvalidUserException_t, _MumbleServer_InvalidSecretException_t, _MumbleServer_ReadOnlyModeException_t)) + +Server._op_getRegistration = IcePy.Operation( + "getRegistration", + "getRegistration", + OperationMode.Idempotent, + None, + (), + (((), IcePy._t_int, False, 0),), + (), + ((), _MumbleServer_UserInfoMap_t, False, 0), + (_MumbleServer_ServerBootedException_t, _MumbleServer_InvalidUserException_t, _MumbleServer_InvalidSecretException_t, _MumbleServer_ReadOnlyModeException_t)) + +Server._op_getRegisteredUsers = IcePy.Operation( + "getRegisteredUsers", + "getRegisteredUsers", + OperationMode.Idempotent, + None, + (), + (((), IcePy._t_string, False, 0),), + (), + ((), _MumbleServer_NameMap_t, False, 0), + (_MumbleServer_ServerBootedException_t, _MumbleServer_InvalidSecretException_t, _MumbleServer_ReadOnlyModeException_t)) + +Server._op_verifyPassword = IcePy.Operation( + "verifyPassword", + "verifyPassword", + OperationMode.Idempotent, + None, + (), + (((), IcePy._t_string, False, 0), ((), IcePy._t_string, False, 0)), + (), + ((), IcePy._t_int, False, 0), + (_MumbleServer_ServerBootedException_t, _MumbleServer_InvalidSecretException_t, _MumbleServer_ReadOnlyModeException_t)) + +Server._op_getTexture = IcePy.Operation( + "getTexture", + "getTexture", + OperationMode.Idempotent, + None, + (), + (((), IcePy._t_int, False, 0),), + (), + ((), _MumbleServer_Texture_t, False, 0), + (_MumbleServer_ServerBootedException_t, _MumbleServer_InvalidUserException_t, _MumbleServer_InvalidSecretException_t)) + +Server._op_setTexture = IcePy.Operation( + "setTexture", + "setTexture", + OperationMode.Idempotent, + None, + (), + (((), IcePy._t_int, False, 0), ((), _MumbleServer_Texture_t, False, 0)), + (), + None, + (_MumbleServer_ServerBootedException_t, _MumbleServer_InvalidUserException_t, _MumbleServer_InvalidTextureException_t, _MumbleServer_InvalidSecretException_t, _MumbleServer_ReadOnlyModeException_t)) + +Server._op_getUptime = IcePy.Operation( + "getUptime", + "getUptime", + OperationMode.Idempotent, + None, + (), + (), + (), + ((), IcePy._t_int, False, 0), + (_MumbleServer_ServerBootedException_t, _MumbleServer_InvalidSecretException_t)) + +Server._op_updateCertificate = IcePy.Operation( + "updateCertificate", + "updateCertificate", + OperationMode.Idempotent, + None, + (), + (((), IcePy._t_string, False, 0), ((), IcePy._t_string, False, 0), ((), IcePy._t_string, False, 0)), + (), + None, + (_MumbleServer_ServerBootedException_t, _MumbleServer_InvalidSecretException_t, _MumbleServer_InvalidInputDataException_t, _MumbleServer_ReadOnlyModeException_t)) + +Server._op_startListening = IcePy.Operation( + "startListening", + "startListening", + OperationMode.Idempotent, + None, + (), + (((), IcePy._t_int, False, 0), ((), IcePy._t_int, False, 0)), + (), + None, + (_MumbleServer_ServerBootedException_t, _MumbleServer_InvalidUserException_t, _MumbleServer_ReadOnlyModeException_t)) + +Server._op_stopListening = IcePy.Operation( + "stopListening", + "stopListening", + OperationMode.Idempotent, + None, + (), + (((), IcePy._t_int, False, 0), ((), IcePy._t_int, False, 0)), + (), + None, + (_MumbleServer_ServerBootedException_t, _MumbleServer_InvalidUserException_t, _MumbleServer_ReadOnlyModeException_t)) + +Server._op_isListening = IcePy.Operation( + "isListening", + "isListening", + OperationMode.Idempotent, + None, + (), + (((), IcePy._t_int, False, 0), ((), IcePy._t_int, False, 0)), + (), + ((), IcePy._t_bool, False, 0), + (_MumbleServer_ServerBootedException_t, _MumbleServer_InvalidUserException_t, _MumbleServer_InvalidSecretException_t)) + +Server._op_getListeningChannels = IcePy.Operation( + "getListeningChannels", + "getListeningChannels", + OperationMode.Idempotent, + None, + (), + (((), IcePy._t_int, False, 0),), + (), + ((), _MumbleServer_IntList_t, False, 0), + (_MumbleServer_ServerBootedException_t, _MumbleServer_InvalidSecretException_t, _MumbleServer_InvalidUserException_t)) + +Server._op_getListeningUsers = IcePy.Operation( + "getListeningUsers", + "getListeningUsers", + OperationMode.Idempotent, + None, + (), + (((), IcePy._t_int, False, 0),), + (), + ((), _MumbleServer_IntList_t, False, 0), + (_MumbleServer_ServerBootedException_t, _MumbleServer_InvalidSecretException_t, _MumbleServer_InvalidChannelException_t)) + +Server._op_getListenerVolumeAdjustment = IcePy.Operation( + "getListenerVolumeAdjustment", + "getListenerVolumeAdjustment", + OperationMode.Idempotent, + None, + (), + (((), IcePy._t_int, False, 0), ((), IcePy._t_int, False, 0)), + (), + ((), IcePy._t_float, False, 0), + (_MumbleServer_ServerBootedException_t, _MumbleServer_InvalidUserException_t, _MumbleServer_InvalidChannelException_t)) + +Server._op_setListenerVolumeAdjustment = IcePy.Operation( + "setListenerVolumeAdjustment", + "setListenerVolumeAdjustment", + OperationMode.Idempotent, + None, + (), + (((), IcePy._t_int, False, 0), ((), IcePy._t_int, False, 0), ((), IcePy._t_float, False, 0)), + (), + None, + (_MumbleServer_ServerBootedException_t, _MumbleServer_InvalidSecretException_t, _MumbleServer_InvalidChannelException_t, _MumbleServer_InvalidUserException_t, _MumbleServer_ReadOnlyModeException_t)) + +Server._op_sendWelcomeMessage = IcePy.Operation( + "sendWelcomeMessage", + "sendWelcomeMessage", + OperationMode.Idempotent, + None, + (), + (((), _MumbleServer_IdList_t, False, 0),), + (), + None, + (_MumbleServer_ServerBootedException_t, _MumbleServer_InvalidSecretException_t, _MumbleServer_InvalidUserException_t)) + +__all__ = ["Server", "ServerPrx", "_MumbleServer_ServerPrx_t"] diff --git a/MumbleServer/ServerAuthenticator.py b/MumbleServer/ServerAuthenticator.py new file mode 100644 index 0000000..4712302 --- /dev/null +++ b/MumbleServer/ServerAuthenticator.py @@ -0,0 +1,531 @@ +# Copyright (c) ZeroC, Inc. + +# slice2py version 3.8.1 + +from __future__ import annotations +import IcePy + +from Ice.Object import Object + +from Ice.ObjectPrx import ObjectPrx +from Ice.ObjectPrx import checkedCast +from Ice.ObjectPrx import checkedCastAsync +from Ice.ObjectPrx import uncheckedCast + +from Ice.OperationMode import OperationMode + +from MumbleServer.CertificateList import _MumbleServer_CertificateList_t + +from MumbleServer.GroupNameList import _MumbleServer_GroupNameList_t + +from MumbleServer.ServerAuthenticator_forward import _MumbleServer_ServerAuthenticatorPrx_t + +from MumbleServer.Texture import _MumbleServer_Texture_t + +from MumbleServer.UserInfoMap import _MumbleServer_UserInfoMap_t + +from abc import ABC +from abc import abstractmethod + +from typing import TYPE_CHECKING +from typing import overload + +if TYPE_CHECKING: + from Ice.Current import Current + from MumbleServer.UserInfo import UserInfo + from collections.abc import Awaitable + from collections.abc import Buffer + from collections.abc import Mapping + from collections.abc import Sequence + + +class ServerAuthenticatorPrx(ObjectPrx): + """ + Callback interface for server authentication. You need to supply one of these for ``Server.setAuthenticator``. + If an added callback ever throws an exception or goes away, it will be automatically removed. + Please note that unlike :class:`MumbleServer.ServerCallbackPrx` and :class:`MumbleServer.ServerContextCallbackPrx`, these methods are called + synchronously. If the response lags, the entire server will lag. + Also note that, as the method calls are synchronous, making a call to :class:`MumbleServer.ServerPrx` or :class:`MumbleServer.MetaPrx` will + deadlock the server. + + Notes + ----- + The Slice compiler generated this proxy class from Slice interface ``::MumbleServer::ServerAuthenticator``. + """ + + def authenticate(self, name: str, pw: str, certificates: Sequence[Sequence[int] | bytes | Buffer], certhash: str, certstrong: bool, context: dict[str, str] | None = None) -> tuple[int, str, list[str]]: + """ + Called to authenticate a user. If you do not know the username in question, always return -2 from this + method to fall through to normal database authentication. + Note that if authentication succeeds, the server will create a record of the user in it's database, reserving + the username and id so it cannot be used for normal database authentication. + The data in the certificate (name, email addresses etc), as well as the list of signing certificates, + should only be trusted if certstrong is true. + + Internally, the server treats usernames as case-insensitive. It is recommended + that authenticators do the same. the server checks if a username is in use when + a user connects. If the connecting user is registered, the other username is + kicked. If the connecting user is not registered, the connecting user is not + allowed to join the server. + + Parameters + ---------- + name : str + Username to authenticate. + pw : str + Password to authenticate with. + certificates : Sequence[Sequence[int] | bytes | Buffer] + List of der encoded certificates the user connected with. + certhash : str + Hash of user certificate, as used by the server internally when matching. + certstrong : bool + True if certificate was valid and signed by a trusted CA. + context : dict[str, str] + The request context for the invocation. + + Returns + ------- + tuple[int, str, list[str]] + + A tuple containing: + - int UserID of authenticated user, -1 for authentication failures, -2 for unknown user (fallthrough), + -3 for authentication failures where the data could (temporarily) not be verified. + - str Set this to change the username from the supplied one. + - list[str] List of groups on the root channel that the user will be added to for the duration of the connection. + """ + return ServerAuthenticator._op_authenticate.invoke(self, ((name, pw, certificates, certhash, certstrong), context)) + + def authenticateAsync(self, name: str, pw: str, certificates: Sequence[Sequence[int] | bytes | Buffer], certhash: str, certstrong: bool, context: dict[str, str] | None = None) -> Awaitable[tuple[int, str, list[str]]]: + """ + Called to authenticate a user. If you do not know the username in question, always return -2 from this + method to fall through to normal database authentication. + Note that if authentication succeeds, the server will create a record of the user in it's database, reserving + the username and id so it cannot be used for normal database authentication. + The data in the certificate (name, email addresses etc), as well as the list of signing certificates, + should only be trusted if certstrong is true. + + Internally, the server treats usernames as case-insensitive. It is recommended + that authenticators do the same. the server checks if a username is in use when + a user connects. If the connecting user is registered, the other username is + kicked. If the connecting user is not registered, the connecting user is not + allowed to join the server. + + Parameters + ---------- + name : str + Username to authenticate. + pw : str + Password to authenticate with. + certificates : Sequence[Sequence[int] | bytes | Buffer] + List of der encoded certificates the user connected with. + certhash : str + Hash of user certificate, as used by the server internally when matching. + certstrong : bool + True if certificate was valid and signed by a trusted CA. + context : dict[str, str] + The request context for the invocation. + + Returns + ------- + Awaitable[tuple[int, str, list[str]]] + + A tuple containing: + - int UserID of authenticated user, -1 for authentication failures, -2 for unknown user (fallthrough), + -3 for authentication failures where the data could (temporarily) not be verified. + - str Set this to change the username from the supplied one. + - list[str] List of groups on the root channel that the user will be added to for the duration of the connection. + """ + return ServerAuthenticator._op_authenticate.invokeAsync(self, ((name, pw, certificates, certhash, certstrong), context)) + + def getInfo(self, id: int, context: dict[str, str] | None = None) -> tuple[bool, dict[UserInfo, str]]: + """ + Fetch information about a user. This is used to retrieve information like email address, keyhash etc. If you + want the server to take care of this information itself, simply return false to fall through. + + Parameters + ---------- + id : int + User id. + context : dict[str, str] + The request context for the invocation. + + Returns + ------- + tuple[bool, dict[UserInfo, str]] + + A tuple containing: + - bool true if information is present, false to fall through. + - dict[UserInfo, str] Information about user. This needs to include at least "name". + """ + return ServerAuthenticator._op_getInfo.invoke(self, ((id, ), context)) + + def getInfoAsync(self, id: int, context: dict[str, str] | None = None) -> Awaitable[tuple[bool, dict[UserInfo, str]]]: + """ + Fetch information about a user. This is used to retrieve information like email address, keyhash etc. If you + want the server to take care of this information itself, simply return false to fall through. + + Parameters + ---------- + id : int + User id. + context : dict[str, str] + The request context for the invocation. + + Returns + ------- + Awaitable[tuple[bool, dict[UserInfo, str]]] + + A tuple containing: + - bool true if information is present, false to fall through. + - dict[UserInfo, str] Information about user. This needs to include at least "name". + """ + return ServerAuthenticator._op_getInfo.invokeAsync(self, ((id, ), context)) + + def nameToId(self, name: str, context: dict[str, str] | None = None) -> int: + """ + Map a name to a user id. + + Parameters + ---------- + name : str + Username to map. + context : dict[str, str] + The request context for the invocation. + + Returns + ------- + int + User id or -2 for unknown name. + """ + return ServerAuthenticator._op_nameToId.invoke(self, ((name, ), context)) + + def nameToIdAsync(self, name: str, context: dict[str, str] | None = None) -> Awaitable[int]: + """ + Map a name to a user id. + + Parameters + ---------- + name : str + Username to map. + context : dict[str, str] + The request context for the invocation. + + Returns + ------- + Awaitable[int] + User id or -2 for unknown name. + """ + return ServerAuthenticator._op_nameToId.invokeAsync(self, ((name, ), context)) + + def idToName(self, id: int, context: dict[str, str] | None = None) -> str: + """ + Map a user id to a username. + + Parameters + ---------- + id : int + User id to map. + context : dict[str, str] + The request context for the invocation. + + Returns + ------- + str + Name of user or empty string for unknown id. + """ + return ServerAuthenticator._op_idToName.invoke(self, ((id, ), context)) + + def idToNameAsync(self, id: int, context: dict[str, str] | None = None) -> Awaitable[str]: + """ + Map a user id to a username. + + Parameters + ---------- + id : int + User id to map. + context : dict[str, str] + The request context for the invocation. + + Returns + ------- + Awaitable[str] + Name of user or empty string for unknown id. + """ + return ServerAuthenticator._op_idToName.invokeAsync(self, ((id, ), context)) + + def idToTexture(self, id: int, context: dict[str, str] | None = None) -> bytes: + """ + Map a user to a custom Texture. + + Parameters + ---------- + id : int + User id to map. + context : dict[str, str] + The request context for the invocation. + + Returns + ------- + bytes + User texture or an empty texture for unknown users or users without textures. + """ + return ServerAuthenticator._op_idToTexture.invoke(self, ((id, ), context)) + + def idToTextureAsync(self, id: int, context: dict[str, str] | None = None) -> Awaitable[bytes]: + """ + Map a user to a custom Texture. + + Parameters + ---------- + id : int + User id to map. + context : dict[str, str] + The request context for the invocation. + + Returns + ------- + Awaitable[bytes] + User texture or an empty texture for unknown users or users without textures. + """ + return ServerAuthenticator._op_idToTexture.invokeAsync(self, ((id, ), context)) + + @staticmethod + def checkedCast( + proxy: ObjectPrx | None, + facet: str | None = None, + context: dict[str, str] | None = None + ) -> ServerAuthenticatorPrx | None: + return checkedCast(ServerAuthenticatorPrx, proxy, facet, context) + + @staticmethod + def checkedCastAsync( + proxy: ObjectPrx | None, + facet: str | None = None, + context: dict[str, str] | None = None + ) -> Awaitable[ServerAuthenticatorPrx | None ]: + return checkedCastAsync(ServerAuthenticatorPrx, proxy, facet, context) + + @overload + @staticmethod + def uncheckedCast(proxy: ObjectPrx, facet: str | None = None) -> ServerAuthenticatorPrx: + ... + + @overload + @staticmethod + def uncheckedCast(proxy: None, facet: str | None = None) -> None: + ... + + @staticmethod + def uncheckedCast(proxy: ObjectPrx | None, facet: str | None = None) -> ServerAuthenticatorPrx | None: + return uncheckedCast(ServerAuthenticatorPrx, proxy, facet) + + @staticmethod + def ice_staticId() -> str: + return "::MumbleServer::ServerAuthenticator" + +IcePy.defineProxy("::MumbleServer::ServerAuthenticator", ServerAuthenticatorPrx) + +class ServerAuthenticator(Object, ABC): + """ + Callback interface for server authentication. You need to supply one of these for ``Server.setAuthenticator``. + If an added callback ever throws an exception or goes away, it will be automatically removed. + Please note that unlike :class:`MumbleServer.ServerCallbackPrx` and :class:`MumbleServer.ServerContextCallbackPrx`, these methods are called + synchronously. If the response lags, the entire server will lag. + Also note that, as the method calls are synchronous, making a call to :class:`MumbleServer.ServerPrx` or :class:`MumbleServer.MetaPrx` will + deadlock the server. + + Notes + ----- + The Slice compiler generated this skeleton class from Slice interface ``::MumbleServer::ServerAuthenticator``. + """ + + _ice_ids: Sequence[str] = ("::Ice::Object", "::MumbleServer::ServerAuthenticator", ) + _op_authenticate: IcePy.Operation + _op_getInfo: IcePy.Operation + _op_nameToId: IcePy.Operation + _op_idToName: IcePy.Operation + _op_idToTexture: IcePy.Operation + + @staticmethod + def ice_staticId() -> str: + return "::MumbleServer::ServerAuthenticator" + + @abstractmethod + def authenticate(self, name: str, pw: str, certificates: list[bytes], certhash: str, certstrong: bool, current: Current) -> tuple[int, str, Sequence[str]] | Awaitable[tuple[int, str, Sequence[str]]]: + """ + Called to authenticate a user. If you do not know the username in question, always return -2 from this + method to fall through to normal database authentication. + Note that if authentication succeeds, the server will create a record of the user in it's database, reserving + the username and id so it cannot be used for normal database authentication. + The data in the certificate (name, email addresses etc), as well as the list of signing certificates, + should only be trusted if certstrong is true. + + Internally, the server treats usernames as case-insensitive. It is recommended + that authenticators do the same. the server checks if a username is in use when + a user connects. If the connecting user is registered, the other username is + kicked. If the connecting user is not registered, the connecting user is not + allowed to join the server. + + Parameters + ---------- + name : str + Username to authenticate. + pw : str + Password to authenticate with. + certificates : list[bytes] + List of der encoded certificates the user connected with. + certhash : str + Hash of user certificate, as used by the server internally when matching. + certstrong : bool + True if certificate was valid and signed by a trusted CA. + current : Ice.Current + The Current object for the dispatch. + + Returns + ------- + tuple[int, str, Sequence[str]] | Awaitable[tuple[int, str, Sequence[str]]] + + A tuple containing: + - int UserID of authenticated user, -1 for authentication failures, -2 for unknown user (fallthrough), + -3 for authentication failures where the data could (temporarily) not be verified. + - str Set this to change the username from the supplied one. + - Sequence[str] List of groups on the root channel that the user will be added to for the duration of the connection. + """ + pass + + @abstractmethod + def getInfo(self, id: int, current: Current) -> tuple[bool, Mapping[UserInfo, str]] | Awaitable[tuple[bool, Mapping[UserInfo, str]]]: + """ + Fetch information about a user. This is used to retrieve information like email address, keyhash etc. If you + want the server to take care of this information itself, simply return false to fall through. + + Parameters + ---------- + id : int + User id. + current : Ice.Current + The Current object for the dispatch. + + Returns + ------- + tuple[bool, Mapping[UserInfo, str]] | Awaitable[tuple[bool, Mapping[UserInfo, str]]] + + A tuple containing: + - bool true if information is present, false to fall through. + - Mapping[UserInfo, str] Information about user. This needs to include at least "name". + """ + pass + + @abstractmethod + def nameToId(self, name: str, current: Current) -> int | Awaitable[int]: + """ + Map a name to a user id. + + Parameters + ---------- + name : str + Username to map. + current : Ice.Current + The Current object for the dispatch. + + Returns + ------- + int | Awaitable[int] + User id or -2 for unknown name. + """ + pass + + @abstractmethod + def idToName(self, id: int, current: Current) -> str | Awaitable[str]: + """ + Map a user id to a username. + + Parameters + ---------- + id : int + User id to map. + current : Ice.Current + The Current object for the dispatch. + + Returns + ------- + str | Awaitable[str] + Name of user or empty string for unknown id. + """ + pass + + @abstractmethod + def idToTexture(self, id: int, current: Current) -> Sequence[int] | bytes | Buffer | Awaitable[Sequence[int] | bytes | Buffer]: + """ + Map a user to a custom Texture. + + Parameters + ---------- + id : int + User id to map. + current : Ice.Current + The Current object for the dispatch. + + Returns + ------- + Sequence[int] | bytes | Buffer | Awaitable[Sequence[int] | bytes | Buffer] + User texture or an empty texture for unknown users or users without textures. + """ + pass + +ServerAuthenticator._op_authenticate = IcePy.Operation( + "authenticate", + "authenticate", + OperationMode.Idempotent, + None, + (), + (((), IcePy._t_string, False, 0), ((), IcePy._t_string, False, 0), ((), _MumbleServer_CertificateList_t, False, 0), ((), IcePy._t_string, False, 0), ((), IcePy._t_bool, False, 0)), + (((), IcePy._t_string, False, 0), ((), _MumbleServer_GroupNameList_t, False, 0)), + ((), IcePy._t_int, False, 0), + ()) + +ServerAuthenticator._op_getInfo = IcePy.Operation( + "getInfo", + "getInfo", + OperationMode.Idempotent, + None, + (), + (((), IcePy._t_int, False, 0),), + (((), _MumbleServer_UserInfoMap_t, False, 0),), + ((), IcePy._t_bool, False, 0), + ()) + +ServerAuthenticator._op_nameToId = IcePy.Operation( + "nameToId", + "nameToId", + OperationMode.Idempotent, + None, + (), + (((), IcePy._t_string, False, 0),), + (), + ((), IcePy._t_int, False, 0), + ()) + +ServerAuthenticator._op_idToName = IcePy.Operation( + "idToName", + "idToName", + OperationMode.Idempotent, + None, + (), + (((), IcePy._t_int, False, 0),), + (), + ((), IcePy._t_string, False, 0), + ()) + +ServerAuthenticator._op_idToTexture = IcePy.Operation( + "idToTexture", + "idToTexture", + OperationMode.Idempotent, + None, + (), + (((), IcePy._t_int, False, 0),), + (), + ((), _MumbleServer_Texture_t, False, 0), + ()) + +__all__ = ["ServerAuthenticator", "ServerAuthenticatorPrx", "_MumbleServer_ServerAuthenticatorPrx_t"] diff --git a/MumbleServer/ServerAuthenticator_forward.py b/MumbleServer/ServerAuthenticator_forward.py new file mode 100644 index 0000000..15761ad --- /dev/null +++ b/MumbleServer/ServerAuthenticator_forward.py @@ -0,0 +1,10 @@ +# Copyright (c) ZeroC, Inc. + +# slice2py version 3.8.1 + +from __future__ import annotations +import IcePy + +_MumbleServer_ServerAuthenticatorPrx_t = IcePy.declareProxy("::MumbleServer::ServerAuthenticator") + +__all__ = ["_MumbleServer_ServerAuthenticatorPrx_t"] \ No newline at end of file diff --git a/MumbleServer/ServerBootedException.py b/MumbleServer/ServerBootedException.py new file mode 100644 index 0000000..a550cfd --- /dev/null +++ b/MumbleServer/ServerBootedException.py @@ -0,0 +1,35 @@ +# Copyright (c) ZeroC, Inc. + +# slice2py version 3.8.1 + +from __future__ import annotations +import IcePy + +from MumbleServer.ServerException import ServerException +from MumbleServer.ServerException import _MumbleServer_ServerException_t + +from dataclasses import dataclass + + +@dataclass +class ServerBootedException(ServerException): + """ + This happens if you try to fetch user or channel state on a stopped server, if you try to stop an already stopped server or start an already started server. + + Notes + ----- + The Slice compiler generated this exception dataclass from Slice exception ``::MumbleServer::ServerBootedException``. + """ + + _ice_id = "::MumbleServer::ServerBootedException" + +_MumbleServer_ServerBootedException_t = IcePy.defineException( + "::MumbleServer::ServerBootedException", + ServerBootedException, + (), + _MumbleServer_ServerException_t, + ()) + +setattr(ServerBootedException, '_ice_type', _MumbleServer_ServerBootedException_t) + +__all__ = ["ServerBootedException", "_MumbleServer_ServerBootedException_t"] diff --git a/MumbleServer/ServerCallback.py b/MumbleServer/ServerCallback.py new file mode 100644 index 0000000..535faea --- /dev/null +++ b/MumbleServer/ServerCallback.py @@ -0,0 +1,565 @@ +# Copyright (c) ZeroC, Inc. + +# slice2py version 3.8.1 + +from __future__ import annotations +import IcePy + +from Ice.Object import Object + +from Ice.ObjectPrx import ObjectPrx +from Ice.ObjectPrx import checkedCast +from Ice.ObjectPrx import checkedCastAsync +from Ice.ObjectPrx import uncheckedCast + +from Ice.OperationMode import OperationMode + +from MumbleServer.Channel import _MumbleServer_Channel_t + +from MumbleServer.ServerCallback_forward import _MumbleServer_ServerCallbackPrx_t + +from MumbleServer.TextMessage import _MumbleServer_TextMessage_t + +from MumbleServer.User import _MumbleServer_User_t + +from abc import ABC +from abc import abstractmethod + +from typing import TYPE_CHECKING +from typing import overload + +if TYPE_CHECKING: + from Ice.Current import Current + from MumbleServer.Channel import Channel + from MumbleServer.TextMessage import TextMessage + from MumbleServer.User import User + from collections.abc import Awaitable + from collections.abc import Sequence + + +class ServerCallbackPrx(ObjectPrx): + """ + Callback interface for servers. You can supply an implementation of this to receive notification + messages from the server. + If an added callback ever throws an exception or goes away, it will be automatically removed. + Please note that all callbacks are done asynchronously; the server does not wait for the callback to + complete before continuing processing. + Note that callbacks are removed when a server is stopped, so you should have a callback for + ``MetaCallback.started`` which calls ``Server.addCallback``. + + Notes + ----- + The Slice compiler generated this proxy class from Slice interface ``::MumbleServer::ServerCallback``. + + See Also + -------- + :class:`MumbleServer.MetaCallbackPrx` + ``Server.addCallback`` + """ + + def userConnected(self, state: User, context: dict[str, str] | None = None) -> None: + """ + Called when a user connects to the server. + + Parameters + ---------- + state : User + State of connected user. + context : dict[str, str] + The request context for the invocation. + """ + return ServerCallback._op_userConnected.invoke(self, ((state, ), context)) + + def userConnectedAsync(self, state: User, context: dict[str, str] | None = None) -> Awaitable[None]: + """ + Called when a user connects to the server. + + Parameters + ---------- + state : User + State of connected user. + context : dict[str, str] + The request context for the invocation. + + Returns + ------- + Awaitable[None] + An awaitable that is completed when the invocation completes. + """ + return ServerCallback._op_userConnected.invokeAsync(self, ((state, ), context)) + + def userDisconnected(self, state: User, context: dict[str, str] | None = None) -> None: + """ + Called when a user disconnects from the server. The user has already been removed, so you can no longer use methods like ``Server.getState`` + to retrieve the user's state. + + Parameters + ---------- + state : User + State of disconnected user. + context : dict[str, str] + The request context for the invocation. + """ + return ServerCallback._op_userDisconnected.invoke(self, ((state, ), context)) + + def userDisconnectedAsync(self, state: User, context: dict[str, str] | None = None) -> Awaitable[None]: + """ + Called when a user disconnects from the server. The user has already been removed, so you can no longer use methods like ``Server.getState`` + to retrieve the user's state. + + Parameters + ---------- + state : User + State of disconnected user. + context : dict[str, str] + The request context for the invocation. + + Returns + ------- + Awaitable[None] + An awaitable that is completed when the invocation completes. + """ + return ServerCallback._op_userDisconnected.invokeAsync(self, ((state, ), context)) + + def userStateChanged(self, state: User, context: dict[str, str] | None = None) -> None: + """ + Called when a user state changes. This is called if the user moves, is renamed, is muted, deafened etc. + + Parameters + ---------- + state : User + New state of user. + context : dict[str, str] + The request context for the invocation. + """ + return ServerCallback._op_userStateChanged.invoke(self, ((state, ), context)) + + def userStateChangedAsync(self, state: User, context: dict[str, str] | None = None) -> Awaitable[None]: + """ + Called when a user state changes. This is called if the user moves, is renamed, is muted, deafened etc. + + Parameters + ---------- + state : User + New state of user. + context : dict[str, str] + The request context for the invocation. + + Returns + ------- + Awaitable[None] + An awaitable that is completed when the invocation completes. + """ + return ServerCallback._op_userStateChanged.invokeAsync(self, ((state, ), context)) + + def userTextMessage(self, state: User, message: TextMessage, context: dict[str, str] | None = None) -> None: + """ + Called when user writes a text message + + Parameters + ---------- + state : User + the User sending the message + message : TextMessage + the TextMessage the user has sent + context : dict[str, str] + The request context for the invocation. + """ + return ServerCallback._op_userTextMessage.invoke(self, ((state, message), context)) + + def userTextMessageAsync(self, state: User, message: TextMessage, context: dict[str, str] | None = None) -> Awaitable[None]: + """ + Called when user writes a text message + + Parameters + ---------- + state : User + the User sending the message + message : TextMessage + the TextMessage the user has sent + context : dict[str, str] + The request context for the invocation. + + Returns + ------- + Awaitable[None] + An awaitable that is completed when the invocation completes. + """ + return ServerCallback._op_userTextMessage.invokeAsync(self, ((state, message), context)) + + def channelCreated(self, state: Channel, context: dict[str, str] | None = None) -> None: + """ + Called when a new channel is created. + + Parameters + ---------- + state : Channel + State of new channel. + context : dict[str, str] + The request context for the invocation. + """ + return ServerCallback._op_channelCreated.invoke(self, ((state, ), context)) + + def channelCreatedAsync(self, state: Channel, context: dict[str, str] | None = None) -> Awaitable[None]: + """ + Called when a new channel is created. + + Parameters + ---------- + state : Channel + State of new channel. + context : dict[str, str] + The request context for the invocation. + + Returns + ------- + Awaitable[None] + An awaitable that is completed when the invocation completes. + """ + return ServerCallback._op_channelCreated.invokeAsync(self, ((state, ), context)) + + def channelRemoved(self, state: Channel, context: dict[str, str] | None = None) -> None: + """ + Called when a channel is removed. The channel has already been removed, you can no longer use methods like ``Server.getChannelState`` + + Parameters + ---------- + state : Channel + State of removed channel. + context : dict[str, str] + The request context for the invocation. + """ + return ServerCallback._op_channelRemoved.invoke(self, ((state, ), context)) + + def channelRemovedAsync(self, state: Channel, context: dict[str, str] | None = None) -> Awaitable[None]: + """ + Called when a channel is removed. The channel has already been removed, you can no longer use methods like ``Server.getChannelState`` + + Parameters + ---------- + state : Channel + State of removed channel. + context : dict[str, str] + The request context for the invocation. + + Returns + ------- + Awaitable[None] + An awaitable that is completed when the invocation completes. + """ + return ServerCallback._op_channelRemoved.invokeAsync(self, ((state, ), context)) + + def channelStateChanged(self, state: Channel, context: dict[str, str] | None = None) -> None: + """ + Called when a new channel state changes. This is called if the channel is moved, renamed or if new links are added. + + Parameters + ---------- + state : Channel + New state of channel. + context : dict[str, str] + The request context for the invocation. + """ + return ServerCallback._op_channelStateChanged.invoke(self, ((state, ), context)) + + def channelStateChangedAsync(self, state: Channel, context: dict[str, str] | None = None) -> Awaitable[None]: + """ + Called when a new channel state changes. This is called if the channel is moved, renamed or if new links are added. + + Parameters + ---------- + state : Channel + New state of channel. + context : dict[str, str] + The request context for the invocation. + + Returns + ------- + Awaitable[None] + An awaitable that is completed when the invocation completes. + """ + return ServerCallback._op_channelStateChanged.invokeAsync(self, ((state, ), context)) + + @staticmethod + def checkedCast( + proxy: ObjectPrx | None, + facet: str | None = None, + context: dict[str, str] | None = None + ) -> ServerCallbackPrx | None: + return checkedCast(ServerCallbackPrx, proxy, facet, context) + + @staticmethod + def checkedCastAsync( + proxy: ObjectPrx | None, + facet: str | None = None, + context: dict[str, str] | None = None + ) -> Awaitable[ServerCallbackPrx | None ]: + return checkedCastAsync(ServerCallbackPrx, proxy, facet, context) + + @overload + @staticmethod + def uncheckedCast(proxy: ObjectPrx, facet: str | None = None) -> ServerCallbackPrx: + ... + + @overload + @staticmethod + def uncheckedCast(proxy: None, facet: str | None = None) -> None: + ... + + @staticmethod + def uncheckedCast(proxy: ObjectPrx | None, facet: str | None = None) -> ServerCallbackPrx | None: + return uncheckedCast(ServerCallbackPrx, proxy, facet) + + @staticmethod + def ice_staticId() -> str: + return "::MumbleServer::ServerCallback" + +IcePy.defineProxy("::MumbleServer::ServerCallback", ServerCallbackPrx) + +class ServerCallback(Object, ABC): + """ + Callback interface for servers. You can supply an implementation of this to receive notification + messages from the server. + If an added callback ever throws an exception or goes away, it will be automatically removed. + Please note that all callbacks are done asynchronously; the server does not wait for the callback to + complete before continuing processing. + Note that callbacks are removed when a server is stopped, so you should have a callback for + ``MetaCallback.started`` which calls ``Server.addCallback``. + + Notes + ----- + The Slice compiler generated this skeleton class from Slice interface ``::MumbleServer::ServerCallback``. + + See Also + -------- + :class:`MumbleServer.MetaCallbackPrx` + ``Server.addCallback`` + """ + + _ice_ids: Sequence[str] = ("::Ice::Object", "::MumbleServer::ServerCallback", ) + _op_userConnected: IcePy.Operation + _op_userDisconnected: IcePy.Operation + _op_userStateChanged: IcePy.Operation + _op_userTextMessage: IcePy.Operation + _op_channelCreated: IcePy.Operation + _op_channelRemoved: IcePy.Operation + _op_channelStateChanged: IcePy.Operation + + @staticmethod + def ice_staticId() -> str: + return "::MumbleServer::ServerCallback" + + @abstractmethod + def userConnected(self, state: User, current: Current) -> None | Awaitable[None]: + """ + Called when a user connects to the server. + + Parameters + ---------- + state : User + State of connected user. + current : Ice.Current + The Current object for the dispatch. + + Returns + ------- + None | Awaitable[None] + None or an awaitable that completes when the dispatch completes. + """ + pass + + @abstractmethod + def userDisconnected(self, state: User, current: Current) -> None | Awaitable[None]: + """ + Called when a user disconnects from the server. The user has already been removed, so you can no longer use methods like ``Server.getState`` + to retrieve the user's state. + + Parameters + ---------- + state : User + State of disconnected user. + current : Ice.Current + The Current object for the dispatch. + + Returns + ------- + None | Awaitable[None] + None or an awaitable that completes when the dispatch completes. + """ + pass + + @abstractmethod + def userStateChanged(self, state: User, current: Current) -> None | Awaitable[None]: + """ + Called when a user state changes. This is called if the user moves, is renamed, is muted, deafened etc. + + Parameters + ---------- + state : User + New state of user. + current : Ice.Current + The Current object for the dispatch. + + Returns + ------- + None | Awaitable[None] + None or an awaitable that completes when the dispatch completes. + """ + pass + + @abstractmethod + def userTextMessage(self, state: User, message: TextMessage, current: Current) -> None | Awaitable[None]: + """ + Called when user writes a text message + + Parameters + ---------- + state : User + the User sending the message + message : TextMessage + the TextMessage the user has sent + current : Ice.Current + The Current object for the dispatch. + + Returns + ------- + None | Awaitable[None] + None or an awaitable that completes when the dispatch completes. + """ + pass + + @abstractmethod + def channelCreated(self, state: Channel, current: Current) -> None | Awaitable[None]: + """ + Called when a new channel is created. + + Parameters + ---------- + state : Channel + State of new channel. + current : Ice.Current + The Current object for the dispatch. + + Returns + ------- + None | Awaitable[None] + None or an awaitable that completes when the dispatch completes. + """ + pass + + @abstractmethod + def channelRemoved(self, state: Channel, current: Current) -> None | Awaitable[None]: + """ + Called when a channel is removed. The channel has already been removed, you can no longer use methods like ``Server.getChannelState`` + + Parameters + ---------- + state : Channel + State of removed channel. + current : Ice.Current + The Current object for the dispatch. + + Returns + ------- + None | Awaitable[None] + None or an awaitable that completes when the dispatch completes. + """ + pass + + @abstractmethod + def channelStateChanged(self, state: Channel, current: Current) -> None | Awaitable[None]: + """ + Called when a new channel state changes. This is called if the channel is moved, renamed or if new links are added. + + Parameters + ---------- + state : Channel + New state of channel. + current : Ice.Current + The Current object for the dispatch. + + Returns + ------- + None | Awaitable[None] + None or an awaitable that completes when the dispatch completes. + """ + pass + +ServerCallback._op_userConnected = IcePy.Operation( + "userConnected", + "userConnected", + OperationMode.Idempotent, + None, + (), + (((), _MumbleServer_User_t, False, 0),), + (), + None, + ()) + +ServerCallback._op_userDisconnected = IcePy.Operation( + "userDisconnected", + "userDisconnected", + OperationMode.Idempotent, + None, + (), + (((), _MumbleServer_User_t, False, 0),), + (), + None, + ()) + +ServerCallback._op_userStateChanged = IcePy.Operation( + "userStateChanged", + "userStateChanged", + OperationMode.Idempotent, + None, + (), + (((), _MumbleServer_User_t, False, 0),), + (), + None, + ()) + +ServerCallback._op_userTextMessage = IcePy.Operation( + "userTextMessage", + "userTextMessage", + OperationMode.Idempotent, + None, + (), + (((), _MumbleServer_User_t, False, 0), ((), _MumbleServer_TextMessage_t, False, 0)), + (), + None, + ()) + +ServerCallback._op_channelCreated = IcePy.Operation( + "channelCreated", + "channelCreated", + OperationMode.Idempotent, + None, + (), + (((), _MumbleServer_Channel_t, False, 0),), + (), + None, + ()) + +ServerCallback._op_channelRemoved = IcePy.Operation( + "channelRemoved", + "channelRemoved", + OperationMode.Idempotent, + None, + (), + (((), _MumbleServer_Channel_t, False, 0),), + (), + None, + ()) + +ServerCallback._op_channelStateChanged = IcePy.Operation( + "channelStateChanged", + "channelStateChanged", + OperationMode.Idempotent, + None, + (), + (((), _MumbleServer_Channel_t, False, 0),), + (), + None, + ()) + +__all__ = ["ServerCallback", "ServerCallbackPrx", "_MumbleServer_ServerCallbackPrx_t"] diff --git a/MumbleServer/ServerCallback_forward.py b/MumbleServer/ServerCallback_forward.py new file mode 100644 index 0000000..26d4f49 --- /dev/null +++ b/MumbleServer/ServerCallback_forward.py @@ -0,0 +1,10 @@ +# Copyright (c) ZeroC, Inc. + +# slice2py version 3.8.1 + +from __future__ import annotations +import IcePy + +_MumbleServer_ServerCallbackPrx_t = IcePy.declareProxy("::MumbleServer::ServerCallback") + +__all__ = ["_MumbleServer_ServerCallbackPrx_t"] \ No newline at end of file diff --git a/MumbleServer/ServerContextCallback.py b/MumbleServer/ServerContextCallback.py new file mode 100644 index 0000000..0dc2ec0 --- /dev/null +++ b/MumbleServer/ServerContextCallback.py @@ -0,0 +1,180 @@ +# Copyright (c) ZeroC, Inc. + +# slice2py version 3.8.1 + +from __future__ import annotations +import IcePy + +from Ice.Object import Object + +from Ice.ObjectPrx import ObjectPrx +from Ice.ObjectPrx import checkedCast +from Ice.ObjectPrx import checkedCastAsync +from Ice.ObjectPrx import uncheckedCast + +from Ice.OperationMode import OperationMode + +from MumbleServer.ServerContextCallback_forward import _MumbleServer_ServerContextCallbackPrx_t + +from MumbleServer.User import _MumbleServer_User_t + +from abc import ABC +from abc import abstractmethod + +from typing import TYPE_CHECKING +from typing import overload + +if TYPE_CHECKING: + from Ice.Current import Current + from MumbleServer.User import User + from collections.abc import Awaitable + from collections.abc import Sequence + + +class ServerContextCallbackPrx(ObjectPrx): + """ + Callback interface for context actions. You need to supply one of these for ``Server.addContext``. + If an added callback ever throws an exception or goes away, it will be automatically removed. + Please note that all callbacks are done asynchronously; the server does not wait for the callback to + complete before continuing processing. + + Notes + ----- + The Slice compiler generated this proxy class from Slice interface ``::MumbleServer::ServerContextCallback``. + """ + + def contextAction(self, action: str, usr: User, session: int, channelid: int, context: dict[str, str] | None = None) -> None: + """ + Called when a context action is performed. + + Parameters + ---------- + action : str + Action to be performed. + usr : User + User which initiated the action. + session : int + If nonzero, session of target user. + channelid : int + If not -1, id of target channel. + context : dict[str, str] + The request context for the invocation. + """ + return ServerContextCallback._op_contextAction.invoke(self, ((action, usr, session, channelid), context)) + + def contextActionAsync(self, action: str, usr: User, session: int, channelid: int, context: dict[str, str] | None = None) -> Awaitable[None]: + """ + Called when a context action is performed. + + Parameters + ---------- + action : str + Action to be performed. + usr : User + User which initiated the action. + session : int + If nonzero, session of target user. + channelid : int + If not -1, id of target channel. + context : dict[str, str] + The request context for the invocation. + + Returns + ------- + Awaitable[None] + An awaitable that is completed when the invocation completes. + """ + return ServerContextCallback._op_contextAction.invokeAsync(self, ((action, usr, session, channelid), context)) + + @staticmethod + def checkedCast( + proxy: ObjectPrx | None, + facet: str | None = None, + context: dict[str, str] | None = None + ) -> ServerContextCallbackPrx | None: + return checkedCast(ServerContextCallbackPrx, proxy, facet, context) + + @staticmethod + def checkedCastAsync( + proxy: ObjectPrx | None, + facet: str | None = None, + context: dict[str, str] | None = None + ) -> Awaitable[ServerContextCallbackPrx | None ]: + return checkedCastAsync(ServerContextCallbackPrx, proxy, facet, context) + + @overload + @staticmethod + def uncheckedCast(proxy: ObjectPrx, facet: str | None = None) -> ServerContextCallbackPrx: + ... + + @overload + @staticmethod + def uncheckedCast(proxy: None, facet: str | None = None) -> None: + ... + + @staticmethod + def uncheckedCast(proxy: ObjectPrx | None, facet: str | None = None) -> ServerContextCallbackPrx | None: + return uncheckedCast(ServerContextCallbackPrx, proxy, facet) + + @staticmethod + def ice_staticId() -> str: + return "::MumbleServer::ServerContextCallback" + +IcePy.defineProxy("::MumbleServer::ServerContextCallback", ServerContextCallbackPrx) + +class ServerContextCallback(Object, ABC): + """ + Callback interface for context actions. You need to supply one of these for ``Server.addContext``. + If an added callback ever throws an exception or goes away, it will be automatically removed. + Please note that all callbacks are done asynchronously; the server does not wait for the callback to + complete before continuing processing. + + Notes + ----- + The Slice compiler generated this skeleton class from Slice interface ``::MumbleServer::ServerContextCallback``. + """ + + _ice_ids: Sequence[str] = ("::Ice::Object", "::MumbleServer::ServerContextCallback", ) + _op_contextAction: IcePy.Operation + + @staticmethod + def ice_staticId() -> str: + return "::MumbleServer::ServerContextCallback" + + @abstractmethod + def contextAction(self, action: str, usr: User, session: int, channelid: int, current: Current) -> None | Awaitable[None]: + """ + Called when a context action is performed. + + Parameters + ---------- + action : str + Action to be performed. + usr : User + User which initiated the action. + session : int + If nonzero, session of target user. + channelid : int + If not -1, id of target channel. + current : Ice.Current + The Current object for the dispatch. + + Returns + ------- + None | Awaitable[None] + None or an awaitable that completes when the dispatch completes. + """ + pass + +ServerContextCallback._op_contextAction = IcePy.Operation( + "contextAction", + "contextAction", + OperationMode.Idempotent, + None, + (), + (((), IcePy._t_string, False, 0), ((), _MumbleServer_User_t, False, 0), ((), IcePy._t_int, False, 0), ((), IcePy._t_int, False, 0)), + (), + None, + ()) + +__all__ = ["ServerContextCallback", "ServerContextCallbackPrx", "_MumbleServer_ServerContextCallbackPrx_t"] diff --git a/MumbleServer/ServerContextCallback_forward.py b/MumbleServer/ServerContextCallback_forward.py new file mode 100644 index 0000000..4b4b61f --- /dev/null +++ b/MumbleServer/ServerContextCallback_forward.py @@ -0,0 +1,10 @@ +# Copyright (c) ZeroC, Inc. + +# slice2py version 3.8.1 + +from __future__ import annotations +import IcePy + +_MumbleServer_ServerContextCallbackPrx_t = IcePy.declareProxy("::MumbleServer::ServerContextCallback") + +__all__ = ["_MumbleServer_ServerContextCallbackPrx_t"] \ No newline at end of file diff --git a/MumbleServer/ServerException.py b/MumbleServer/ServerException.py new file mode 100644 index 0000000..e7f786a --- /dev/null +++ b/MumbleServer/ServerException.py @@ -0,0 +1,32 @@ +# Copyright (c) ZeroC, Inc. + +# slice2py version 3.8.1 + +from __future__ import annotations +import IcePy + +from Ice.UserException import UserException + +from dataclasses import dataclass + + +@dataclass +class ServerException(UserException): + """ + Notes + ----- + The Slice compiler generated this exception dataclass from Slice exception ``::MumbleServer::ServerException``. + """ + + _ice_id = "::MumbleServer::ServerException" + +_MumbleServer_ServerException_t = IcePy.defineException( + "::MumbleServer::ServerException", + ServerException, + (), + None, + ()) + +setattr(ServerException, '_ice_type', _MumbleServer_ServerException_t) + +__all__ = ["ServerException", "_MumbleServer_ServerException_t"] diff --git a/MumbleServer/ServerFailureException.py b/MumbleServer/ServerFailureException.py new file mode 100644 index 0000000..fa85dba --- /dev/null +++ b/MumbleServer/ServerFailureException.py @@ -0,0 +1,35 @@ +# Copyright (c) ZeroC, Inc. + +# slice2py version 3.8.1 + +from __future__ import annotations +import IcePy + +from MumbleServer.ServerException import ServerException +from MumbleServer.ServerException import _MumbleServer_ServerException_t + +from dataclasses import dataclass + + +@dataclass +class ServerFailureException(ServerException): + """ + This is thrown if ``Server.start`` fails, and should generally be the cause for some concern. + + Notes + ----- + The Slice compiler generated this exception dataclass from Slice exception ``::MumbleServer::ServerFailureException``. + """ + + _ice_id = "::MumbleServer::ServerFailureException" + +_MumbleServer_ServerFailureException_t = IcePy.defineException( + "::MumbleServer::ServerFailureException", + ServerFailureException, + (), + _MumbleServer_ServerException_t, + ()) + +setattr(ServerFailureException, '_ice_type', _MumbleServer_ServerFailureException_t) + +__all__ = ["ServerFailureException", "_MumbleServer_ServerFailureException_t"] diff --git a/MumbleServer/ServerList.py b/MumbleServer/ServerList.py new file mode 100644 index 0000000..4217866 --- /dev/null +++ b/MumbleServer/ServerList.py @@ -0,0 +1,12 @@ +# Copyright (c) ZeroC, Inc. + +# slice2py version 3.8.1 + +from __future__ import annotations +import IcePy + +from MumbleServer.Server_forward import _MumbleServer_ServerPrx_t + +_MumbleServer_ServerList_t = IcePy.defineSequence("::MumbleServer::ServerList", (), _MumbleServer_ServerPrx_t) + +__all__ = ["_MumbleServer_ServerList_t"] diff --git a/MumbleServer/ServerUpdatingAuthenticator.py b/MumbleServer/ServerUpdatingAuthenticator.py new file mode 100644 index 0000000..35875ac --- /dev/null +++ b/MumbleServer/ServerUpdatingAuthenticator.py @@ -0,0 +1,462 @@ +# Copyright (c) ZeroC, Inc. + +# slice2py version 3.8.1 + +from __future__ import annotations +import IcePy + +from Ice.ObjectPrx import checkedCast +from Ice.ObjectPrx import checkedCastAsync +from Ice.ObjectPrx import uncheckedCast + +from Ice.OperationMode import OperationMode + +from MumbleServer.CertificateList import _MumbleServer_CertificateList_t + +from MumbleServer.GroupNameList import _MumbleServer_GroupNameList_t + +from MumbleServer.NameMap import _MumbleServer_NameMap_t + +from MumbleServer.ServerAuthenticator import ServerAuthenticator +from MumbleServer.ServerAuthenticator import ServerAuthenticatorPrx + +from MumbleServer.ServerUpdatingAuthenticator_forward import _MumbleServer_ServerUpdatingAuthenticatorPrx_t + +from MumbleServer.Texture import _MumbleServer_Texture_t + +from MumbleServer.UserInfoMap import _MumbleServer_UserInfoMap_t + +from abc import ABC +from abc import abstractmethod + +from typing import TYPE_CHECKING +from typing import overload + +if TYPE_CHECKING: + from Ice.Current import Current + from Ice.ObjectPrx import ObjectPrx + from MumbleServer.UserInfo import UserInfo + from collections.abc import Awaitable + from collections.abc import Buffer + from collections.abc import Mapping + from collections.abc import Sequence + + +class ServerUpdatingAuthenticatorPrx(ServerAuthenticatorPrx): + """ + Callback interface for server authentication and registration. This allows you to support both authentication + and account updating. + You do not need to implement this if all you want is authentication, you only need this if other scripts + connected to the same server calls e.g. ``Server.setTexture``. + Almost all of these methods support fall through, meaning the server should continue the operation against its + own database. + + Notes + ----- + The Slice compiler generated this proxy class from Slice interface ``::MumbleServer::ServerUpdatingAuthenticator``. + """ + + def registerUser(self, info: Mapping[UserInfo, str], context: dict[str, str] | None = None) -> int: + """ + Register a new user. + + Parameters + ---------- + info : Mapping[UserInfo, str] + Information about user to register. + context : dict[str, str] + The request context for the invocation. + + Returns + ------- + int + User id of new user, -1 for registration failure, or -2 to fall through. + """ + return ServerUpdatingAuthenticator._op_registerUser.invoke(self, ((info, ), context)) + + def registerUserAsync(self, info: Mapping[UserInfo, str], context: dict[str, str] | None = None) -> Awaitable[int]: + """ + Register a new user. + + Parameters + ---------- + info : Mapping[UserInfo, str] + Information about user to register. + context : dict[str, str] + The request context for the invocation. + + Returns + ------- + Awaitable[int] + User id of new user, -1 for registration failure, or -2 to fall through. + """ + return ServerUpdatingAuthenticator._op_registerUser.invokeAsync(self, ((info, ), context)) + + def unregisterUser(self, id: int, context: dict[str, str] | None = None) -> int: + """ + Unregister a user. + + Parameters + ---------- + id : int + Userid to unregister. + context : dict[str, str] + The request context for the invocation. + + Returns + ------- + int + 1 for successful unregistration, 0 for unsuccessful unregistration, -1 to fall through. + """ + return ServerUpdatingAuthenticator._op_unregisterUser.invoke(self, ((id, ), context)) + + def unregisterUserAsync(self, id: int, context: dict[str, str] | None = None) -> Awaitable[int]: + """ + Unregister a user. + + Parameters + ---------- + id : int + Userid to unregister. + context : dict[str, str] + The request context for the invocation. + + Returns + ------- + Awaitable[int] + 1 for successful unregistration, 0 for unsuccessful unregistration, -1 to fall through. + """ + return ServerUpdatingAuthenticator._op_unregisterUser.invokeAsync(self, ((id, ), context)) + + def getRegisteredUsers(self, filter: str, context: dict[str, str] | None = None) -> dict[int, str]: + """ + Get a list of registered users matching filter. + + Parameters + ---------- + filter : str + Substring usernames must contain. If empty, return all registered users. + context : dict[str, str] + The request context for the invocation. + + Returns + ------- + dict[int, str] + List of matching registered users. + """ + return ServerUpdatingAuthenticator._op_getRegisteredUsers.invoke(self, ((filter, ), context)) + + def getRegisteredUsersAsync(self, filter: str, context: dict[str, str] | None = None) -> Awaitable[dict[int, str]]: + """ + Get a list of registered users matching filter. + + Parameters + ---------- + filter : str + Substring usernames must contain. If empty, return all registered users. + context : dict[str, str] + The request context for the invocation. + + Returns + ------- + Awaitable[dict[int, str]] + List of matching registered users. + """ + return ServerUpdatingAuthenticator._op_getRegisteredUsers.invokeAsync(self, ((filter, ), context)) + + def setInfo(self, id: int, info: Mapping[UserInfo, str], context: dict[str, str] | None = None) -> int: + """ + Set additional information for user registration. + + Parameters + ---------- + id : int + Userid of registered user. + info : Mapping[UserInfo, str] + Information to set about user. This should be merged with existing information. + context : dict[str, str] + The request context for the invocation. + + Returns + ------- + int + 1 for successful update, 0 for unsuccessful update, -1 to fall through. + """ + return ServerUpdatingAuthenticator._op_setInfo.invoke(self, ((id, info), context)) + + def setInfoAsync(self, id: int, info: Mapping[UserInfo, str], context: dict[str, str] | None = None) -> Awaitable[int]: + """ + Set additional information for user registration. + + Parameters + ---------- + id : int + Userid of registered user. + info : Mapping[UserInfo, str] + Information to set about user. This should be merged with existing information. + context : dict[str, str] + The request context for the invocation. + + Returns + ------- + Awaitable[int] + 1 for successful update, 0 for unsuccessful update, -1 to fall through. + """ + return ServerUpdatingAuthenticator._op_setInfo.invokeAsync(self, ((id, info), context)) + + def setTexture(self, id: int, tex: Sequence[int] | bytes | Buffer, context: dict[str, str] | None = None) -> int: + """ + Set texture (now called avatar) of user registration. + + Parameters + ---------- + id : int + registrationId of registered user. + tex : Sequence[int] | bytes | Buffer + New texture. + context : dict[str, str] + The request context for the invocation. + + Returns + ------- + int + 1 for successful update, 0 for unsuccessful update, -1 to fall through. + """ + return ServerUpdatingAuthenticator._op_setTexture.invoke(self, ((id, tex), context)) + + def setTextureAsync(self, id: int, tex: Sequence[int] | bytes | Buffer, context: dict[str, str] | None = None) -> Awaitable[int]: + """ + Set texture (now called avatar) of user registration. + + Parameters + ---------- + id : int + registrationId of registered user. + tex : Sequence[int] | bytes | Buffer + New texture. + context : dict[str, str] + The request context for the invocation. + + Returns + ------- + Awaitable[int] + 1 for successful update, 0 for unsuccessful update, -1 to fall through. + """ + return ServerUpdatingAuthenticator._op_setTexture.invokeAsync(self, ((id, tex), context)) + + @staticmethod + def checkedCast( + proxy: ObjectPrx | None, + facet: str | None = None, + context: dict[str, str] | None = None + ) -> ServerUpdatingAuthenticatorPrx | None: + return checkedCast(ServerUpdatingAuthenticatorPrx, proxy, facet, context) + + @staticmethod + def checkedCastAsync( + proxy: ObjectPrx | None, + facet: str | None = None, + context: dict[str, str] | None = None + ) -> Awaitable[ServerUpdatingAuthenticatorPrx | None ]: + return checkedCastAsync(ServerUpdatingAuthenticatorPrx, proxy, facet, context) + + @overload + @staticmethod + def uncheckedCast(proxy: ObjectPrx, facet: str | None = None) -> ServerUpdatingAuthenticatorPrx: + ... + + @overload + @staticmethod + def uncheckedCast(proxy: None, facet: str | None = None) -> None: + ... + + @staticmethod + def uncheckedCast(proxy: ObjectPrx | None, facet: str | None = None) -> ServerUpdatingAuthenticatorPrx | None: + return uncheckedCast(ServerUpdatingAuthenticatorPrx, proxy, facet) + + @staticmethod + def ice_staticId() -> str: + return "::MumbleServer::ServerUpdatingAuthenticator" + +IcePy.defineProxy("::MumbleServer::ServerUpdatingAuthenticator", ServerUpdatingAuthenticatorPrx) + +class ServerUpdatingAuthenticator(ServerAuthenticator, ABC): + """ + Callback interface for server authentication and registration. This allows you to support both authentication + and account updating. + You do not need to implement this if all you want is authentication, you only need this if other scripts + connected to the same server calls e.g. ``Server.setTexture``. + Almost all of these methods support fall through, meaning the server should continue the operation against its + own database. + + Notes + ----- + The Slice compiler generated this skeleton class from Slice interface ``::MumbleServer::ServerUpdatingAuthenticator``. + """ + + _ice_ids: Sequence[str] = ("::Ice::Object", "::MumbleServer::ServerAuthenticator", "::MumbleServer::ServerUpdatingAuthenticator", ) + _op_registerUser: IcePy.Operation + _op_unregisterUser: IcePy.Operation + _op_getRegisteredUsers: IcePy.Operation + _op_setInfo: IcePy.Operation + _op_setTexture: IcePy.Operation + + @staticmethod + def ice_staticId() -> str: + return "::MumbleServer::ServerUpdatingAuthenticator" + + @abstractmethod + def registerUser(self, info: dict[UserInfo, str], current: Current) -> int | Awaitable[int]: + """ + Register a new user. + + Parameters + ---------- + info : dict[UserInfo, str] + Information about user to register. + current : Ice.Current + The Current object for the dispatch. + + Returns + ------- + int | Awaitable[int] + User id of new user, -1 for registration failure, or -2 to fall through. + """ + pass + + @abstractmethod + def unregisterUser(self, id: int, current: Current) -> int | Awaitable[int]: + """ + Unregister a user. + + Parameters + ---------- + id : int + Userid to unregister. + current : Ice.Current + The Current object for the dispatch. + + Returns + ------- + int | Awaitable[int] + 1 for successful unregistration, 0 for unsuccessful unregistration, -1 to fall through. + """ + pass + + @abstractmethod + def getRegisteredUsers(self, filter: str, current: Current) -> Mapping[int, str] | Awaitable[Mapping[int, str]]: + """ + Get a list of registered users matching filter. + + Parameters + ---------- + filter : str + Substring usernames must contain. If empty, return all registered users. + current : Ice.Current + The Current object for the dispatch. + + Returns + ------- + Mapping[int, str] | Awaitable[Mapping[int, str]] + List of matching registered users. + """ + pass + + @abstractmethod + def setInfo(self, id: int, info: dict[UserInfo, str], current: Current) -> int | Awaitable[int]: + """ + Set additional information for user registration. + + Parameters + ---------- + id : int + Userid of registered user. + info : dict[UserInfo, str] + Information to set about user. This should be merged with existing information. + current : Ice.Current + The Current object for the dispatch. + + Returns + ------- + int | Awaitable[int] + 1 for successful update, 0 for unsuccessful update, -1 to fall through. + """ + pass + + @abstractmethod + def setTexture(self, id: int, tex: bytes, current: Current) -> int | Awaitable[int]: + """ + Set texture (now called avatar) of user registration. + + Parameters + ---------- + id : int + registrationId of registered user. + tex : bytes + New texture. + current : Ice.Current + The Current object for the dispatch. + + Returns + ------- + int | Awaitable[int] + 1 for successful update, 0 for unsuccessful update, -1 to fall through. + """ + pass + +ServerUpdatingAuthenticator._op_registerUser = IcePy.Operation( + "registerUser", + "registerUser", + OperationMode.Normal, + None, + (), + (((), _MumbleServer_UserInfoMap_t, False, 0),), + (), + ((), IcePy._t_int, False, 0), + ()) + +ServerUpdatingAuthenticator._op_unregisterUser = IcePy.Operation( + "unregisterUser", + "unregisterUser", + OperationMode.Normal, + None, + (), + (((), IcePy._t_int, False, 0),), + (), + ((), IcePy._t_int, False, 0), + ()) + +ServerUpdatingAuthenticator._op_getRegisteredUsers = IcePy.Operation( + "getRegisteredUsers", + "getRegisteredUsers", + OperationMode.Idempotent, + None, + (), + (((), IcePy._t_string, False, 0),), + (), + ((), _MumbleServer_NameMap_t, False, 0), + ()) + +ServerUpdatingAuthenticator._op_setInfo = IcePy.Operation( + "setInfo", + "setInfo", + OperationMode.Idempotent, + None, + (), + (((), IcePy._t_int, False, 0), ((), _MumbleServer_UserInfoMap_t, False, 0)), + (), + ((), IcePy._t_int, False, 0), + ()) + +ServerUpdatingAuthenticator._op_setTexture = IcePy.Operation( + "setTexture", + "setTexture", + OperationMode.Idempotent, + None, + (), + (((), IcePy._t_int, False, 0), ((), _MumbleServer_Texture_t, False, 0)), + (), + ((), IcePy._t_int, False, 0), + ()) + +__all__ = ["ServerUpdatingAuthenticator", "ServerUpdatingAuthenticatorPrx", "_MumbleServer_ServerUpdatingAuthenticatorPrx_t"] diff --git a/MumbleServer/ServerUpdatingAuthenticator_forward.py b/MumbleServer/ServerUpdatingAuthenticator_forward.py new file mode 100644 index 0000000..ec313b1 --- /dev/null +++ b/MumbleServer/ServerUpdatingAuthenticator_forward.py @@ -0,0 +1,10 @@ +# Copyright (c) ZeroC, Inc. + +# slice2py version 3.8.1 + +from __future__ import annotations +import IcePy + +_MumbleServer_ServerUpdatingAuthenticatorPrx_t = IcePy.declareProxy("::MumbleServer::ServerUpdatingAuthenticator") + +__all__ = ["_MumbleServer_ServerUpdatingAuthenticatorPrx_t"] \ No newline at end of file diff --git a/MumbleServer/Server_forward.py b/MumbleServer/Server_forward.py new file mode 100644 index 0000000..0cb0b41 --- /dev/null +++ b/MumbleServer/Server_forward.py @@ -0,0 +1,10 @@ +# Copyright (c) ZeroC, Inc. + +# slice2py version 3.8.1 + +from __future__ import annotations +import IcePy + +_MumbleServer_ServerPrx_t = IcePy.declareProxy("::MumbleServer::Server") + +__all__ = ["_MumbleServer_ServerPrx_t"] \ No newline at end of file diff --git a/MumbleServer/TextMessage.py b/MumbleServer/TextMessage.py new file mode 100644 index 0000000..3915c24 --- /dev/null +++ b/MumbleServer/TextMessage.py @@ -0,0 +1,55 @@ +# Copyright (c) ZeroC, Inc. + +# slice2py version 3.8.1 + +from __future__ import annotations +import IcePy + +from MumbleServer.IntList import _MumbleServer_IntList_t + +from dataclasses import dataclass +from dataclasses import field + +from typing import TYPE_CHECKING + +if TYPE_CHECKING: + from collections.abc import Buffer + + +@dataclass +class TextMessage: + """ + A text message between users. + + Attributes + ---------- + sessions : list[int] + Sessions (connected users) who were sent this message. + channels : list[int] + Channels who were sent this message. + trees : list[int] + Trees of channels who were sent this message. + text : str + The contents of the message. + + Notes + ----- + The Slice compiler generated this dataclass from Slice struct ``::MumbleServer::TextMessage``. + """ + sessions: list[int] = field(default_factory=list) + channels: list[int] = field(default_factory=list) + trees: list[int] = field(default_factory=list) + text: str = "" + +_MumbleServer_TextMessage_t = IcePy.defineStruct( + "::MumbleServer::TextMessage", + TextMessage, + (), + ( + ("sessions", (), _MumbleServer_IntList_t), + ("channels", (), _MumbleServer_IntList_t), + ("trees", (), _MumbleServer_IntList_t), + ("text", (), IcePy._t_string) + )) + +__all__ = ["TextMessage", "_MumbleServer_TextMessage_t"] diff --git a/MumbleServer/Texture.py b/MumbleServer/Texture.py new file mode 100644 index 0000000..e253a97 --- /dev/null +++ b/MumbleServer/Texture.py @@ -0,0 +1,10 @@ +# Copyright (c) ZeroC, Inc. + +# slice2py version 3.8.1 + +from __future__ import annotations +import IcePy + +_MumbleServer_Texture_t = IcePy.defineSequence("::MumbleServer::Texture", (), IcePy._t_byte) + +__all__ = ["_MumbleServer_Texture_t"] diff --git a/MumbleServer/Tree.py b/MumbleServer/Tree.py new file mode 100644 index 0000000..4ff7e14 --- /dev/null +++ b/MumbleServer/Tree.py @@ -0,0 +1,68 @@ +# Copyright (c) ZeroC, Inc. + +# slice2py version 3.8.1 + +from __future__ import annotations +import IcePy + +from Ice.Value import Value + +from MumbleServer.Channel import Channel +from MumbleServer.Channel import _MumbleServer_Channel_t + +from MumbleServer.TreeList import _MumbleServer_TreeList_t + +from MumbleServer.Tree_forward import _MumbleServer_Tree_t + +from MumbleServer.UserList import _MumbleServer_UserList_t + +from dataclasses import dataclass +from dataclasses import field + +from typing import TYPE_CHECKING + +if TYPE_CHECKING: + from MumbleServer.User import User + +@dataclass(eq=False) +class Tree(Value): + """ + User and subchannel state. Read-only. + + Attributes + ---------- + c : Channel + Channel definition of current channel. + children : list[Tree | None] + List of subchannels. + users : list[User] + Users in this channel. + + Notes + ----- + The Slice compiler generated this dataclass from Slice class ``::MumbleServer::Tree``. + """ + c: Channel = field(default_factory=Channel) + children: list[Tree | None] = field(default_factory=list) + users: list[User] = field(default_factory=list) + + @staticmethod + def ice_staticId() -> str: + return "::MumbleServer::Tree" + +_MumbleServer_Tree_t = IcePy.defineValue( + "::MumbleServer::Tree", + Tree, + -1, + (), + False, + None, + ( + ("c", (), _MumbleServer_Channel_t, False, 0), + ("children", (), _MumbleServer_TreeList_t, False, 0), + ("users", (), _MumbleServer_UserList_t, False, 0) + )) + +setattr(Tree, '_ice_type', _MumbleServer_Tree_t) + +__all__ = ["Tree", "_MumbleServer_Tree_t"] diff --git a/MumbleServer/TreeList.py b/MumbleServer/TreeList.py new file mode 100644 index 0000000..3098aab --- /dev/null +++ b/MumbleServer/TreeList.py @@ -0,0 +1,12 @@ +# Copyright (c) ZeroC, Inc. + +# slice2py version 3.8.1 + +from __future__ import annotations +import IcePy + +from MumbleServer.Tree_forward import _MumbleServer_Tree_t + +_MumbleServer_TreeList_t = IcePy.defineSequence("::MumbleServer::TreeList", (), _MumbleServer_Tree_t) + +__all__ = ["_MumbleServer_TreeList_t"] diff --git a/MumbleServer/Tree_forward.py b/MumbleServer/Tree_forward.py new file mode 100644 index 0000000..0751b5c --- /dev/null +++ b/MumbleServer/Tree_forward.py @@ -0,0 +1,10 @@ +# Copyright (c) ZeroC, Inc. + +# slice2py version 3.8.1 + +from __future__ import annotations +import IcePy + +_MumbleServer_Tree_t = IcePy.declareValue("::MumbleServer::Tree") + +__all__ = ["_MumbleServer_Tree_t"] \ No newline at end of file diff --git a/MumbleServer/User.py b/MumbleServer/User.py new file mode 100644 index 0000000..4a1623a --- /dev/null +++ b/MumbleServer/User.py @@ -0,0 +1,153 @@ +# Copyright (c) ZeroC, Inc. + +# slice2py version 3.8.1 + +from __future__ import annotations +import IcePy + +from MumbleServer.NetAddress import _MumbleServer_NetAddress_t + +from dataclasses import dataclass +from dataclasses import field + +from typing import TYPE_CHECKING + +if TYPE_CHECKING: + from collections.abc import Buffer + + +@dataclass +class User: + """ + A connected user. + + Attributes + ---------- + session : int + Session ID. This identifies the connection to the server. + userid : int + User ID. -1 if the user is anonymous. + mute : bool + Is user muted by the server? + deaf : bool + Is user deafened by the server? If true, this implies mute. + suppress : bool + Is the user suppressed by the server? This means the user is not muted, but does not have speech privileges in the current channel. + prioritySpeaker : bool + Is the user a priority speaker? + selfMute : bool + Is the user self-muted? + selfDeaf : bool + Is the user self-deafened? If true, this implies mute. + recording : bool + Is the User recording? (This flag is read-only and cannot be changed using setState().) + channel : int + Channel ID the user is in. Matches ``Channel.id``. + name : str + The name of the user. + onlinesecs : int + Seconds user has been online. + bytespersec : int + Average transmission rate in bytes per second over the last few seconds. + version : int + Legacy client version. + version2 : int + New client version. (See https://github.com/mumble-voip/mumble/issues/5827) + release : str + Client release. For official releases, this equals the version. For snapshots and git compiles, this will be something else. + os : str + Client OS. + osversion : str + Client OS Version. + identity : str + Plugin Identity. This will be the user's unique ID inside the current game. + context : str + Base64-encoded Plugin context. This is a binary blob identifying the game and team the user is on. + + The used Base64 alphabet is the one specified in RFC 2045. + + Before Mumble 1.3.0, this string was not Base64-encoded. This could cause problems for some Ice + implementations, such as the .NET implementation. + + If you need the exact string that is used by Mumble, you can get it by Base64-decoding this string. + + If you simply need to detect whether two users are in the same game world, string comparisons will + continue to work as before. + comment : str + User comment. Shown as tooltip for this user. + address : bytes + Client address. + tcponly : bool + TCP only. True until UDP connectivity is established. + idlesecs : int + Idle time. This is how many seconds it is since the user last spoke. Other activity is not counted. + udpPing : float + UDP Ping Average. This is the average ping for the user via UDP over the duration of the connection. + tcpPing : float + TCP Ping Average. This is the average ping for the user via TCP over the duration of the connection. + + Notes + ----- + The Slice compiler generated this dataclass from Slice struct ``::MumbleServer::User``. + """ + session: int = 0 + userid: int = 0 + mute: bool = False + deaf: bool = False + suppress: bool = False + prioritySpeaker: bool = False + selfMute: bool = False + selfDeaf: bool = False + recording: bool = False + channel: int = 0 + name: str = "" + onlinesecs: int = 0 + bytespersec: int = 0 + version: int = 0 + version2: int = 0 + release: str = "" + os: str = "" + osversion: str = "" + identity: str = "" + context: str = "" + comment: str = "" + address: bytes = field(default_factory=bytes) + tcponly: bool = False + idlesecs: int = 0 + udpPing: float = 0.0 + tcpPing: float = 0.0 + +_MumbleServer_User_t = IcePy.defineStruct( + "::MumbleServer::User", + User, + (), + ( + ("session", (), IcePy._t_int), + ("userid", (), IcePy._t_int), + ("mute", (), IcePy._t_bool), + ("deaf", (), IcePy._t_bool), + ("suppress", (), IcePy._t_bool), + ("prioritySpeaker", (), IcePy._t_bool), + ("selfMute", (), IcePy._t_bool), + ("selfDeaf", (), IcePy._t_bool), + ("recording", (), IcePy._t_bool), + ("channel", (), IcePy._t_int), + ("name", (), IcePy._t_string), + ("onlinesecs", (), IcePy._t_int), + ("bytespersec", (), IcePy._t_int), + ("version", (), IcePy._t_int), + ("version2", (), IcePy._t_long), + ("release", (), IcePy._t_string), + ("os", (), IcePy._t_string), + ("osversion", (), IcePy._t_string), + ("identity", (), IcePy._t_string), + ("context", (), IcePy._t_string), + ("comment", (), IcePy._t_string), + ("address", (), _MumbleServer_NetAddress_t), + ("tcponly", (), IcePy._t_bool), + ("idlesecs", (), IcePy._t_int), + ("udpPing", (), IcePy._t_float), + ("tcpPing", (), IcePy._t_float) + )) + +__all__ = ["User", "_MumbleServer_User_t"] diff --git a/MumbleServer/UserInfo.py b/MumbleServer/UserInfo.py new file mode 100644 index 0000000..e9a659b --- /dev/null +++ b/MumbleServer/UserInfo.py @@ -0,0 +1,46 @@ +# Copyright (c) ZeroC, Inc. + +# slice2py version 3.8.1 + +from __future__ import annotations +import IcePy + +from enum import Enum + +class UserInfo(Enum): + """ + Notes + ----- + The Slice compiler generated this enum class from Slice enumeration ``::MumbleServer::UserInfo``. + """ + + UserName = 0 + + UserEmail = 1 + + UserComment = 2 + + UserHash = 3 + + UserPassword = 4 + + UserLastActive = 5 + + UserKDFIterations = 6 + +_MumbleServer_UserInfo_t = IcePy.defineEnum( + "::MumbleServer::UserInfo", + UserInfo, + (), + { + 0: UserInfo.UserName, + 1: UserInfo.UserEmail, + 2: UserInfo.UserComment, + 3: UserInfo.UserHash, + 4: UserInfo.UserPassword, + 5: UserInfo.UserLastActive, + 6: UserInfo.UserKDFIterations, + } +) + +__all__ = ["UserInfo", "_MumbleServer_UserInfo_t"] diff --git a/MumbleServer/UserInfoMap.py b/MumbleServer/UserInfoMap.py new file mode 100644 index 0000000..efb4366 --- /dev/null +++ b/MumbleServer/UserInfoMap.py @@ -0,0 +1,12 @@ +# Copyright (c) ZeroC, Inc. + +# slice2py version 3.8.1 + +from __future__ import annotations +import IcePy + +from MumbleServer.UserInfo import _MumbleServer_UserInfo_t + +_MumbleServer_UserInfoMap_t = IcePy.defineDictionary("::MumbleServer::UserInfoMap", (), _MumbleServer_UserInfo_t, IcePy._t_string) + +__all__ = ["_MumbleServer_UserInfoMap_t"] diff --git a/MumbleServer/UserList.py b/MumbleServer/UserList.py new file mode 100644 index 0000000..81eb1e5 --- /dev/null +++ b/MumbleServer/UserList.py @@ -0,0 +1,12 @@ +# Copyright (c) ZeroC, Inc. + +# slice2py version 3.8.1 + +from __future__ import annotations +import IcePy + +from MumbleServer.User import _MumbleServer_User_t + +_MumbleServer_UserList_t = IcePy.defineSequence("::MumbleServer::UserList", (), _MumbleServer_User_t) + +__all__ = ["_MumbleServer_UserList_t"] diff --git a/MumbleServer/UserMap.py b/MumbleServer/UserMap.py new file mode 100644 index 0000000..8ab7383 --- /dev/null +++ b/MumbleServer/UserMap.py @@ -0,0 +1,12 @@ +# Copyright (c) ZeroC, Inc. + +# slice2py version 3.8.1 + +from __future__ import annotations +import IcePy + +from MumbleServer.User import _MumbleServer_User_t + +_MumbleServer_UserMap_t = IcePy.defineDictionary("::MumbleServer::UserMap", (), IcePy._t_int, _MumbleServer_User_t) + +__all__ = ["_MumbleServer_UserMap_t"] diff --git a/MumbleServer/WriteOnlyException.py b/MumbleServer/WriteOnlyException.py new file mode 100644 index 0000000..9465345 --- /dev/null +++ b/MumbleServer/WriteOnlyException.py @@ -0,0 +1,35 @@ +# Copyright (c) ZeroC, Inc. + +# slice2py version 3.8.1 + +from __future__ import annotations +import IcePy + +from MumbleServer.ServerException import ServerException +from MumbleServer.ServerException import _MumbleServer_ServerException_t + +from dataclasses import dataclass + + +@dataclass +class WriteOnlyException(ServerException): + """ + This is thrown when you ask the server to disclose something that should be secret. + + Notes + ----- + The Slice compiler generated this exception dataclass from Slice exception ``::MumbleServer::WriteOnlyException``. + """ + + _ice_id = "::MumbleServer::WriteOnlyException" + +_MumbleServer_WriteOnlyException_t = IcePy.defineException( + "::MumbleServer::WriteOnlyException", + WriteOnlyException, + (), + _MumbleServer_ServerException_t, + ()) + +setattr(WriteOnlyException, '_ice_type', _MumbleServer_WriteOnlyException_t) + +__all__ = ["WriteOnlyException", "_MumbleServer_WriteOnlyException_t"] diff --git a/MumbleServer/__init__.py b/MumbleServer/__init__.py new file mode 100644 index 0000000..f93d8bd --- /dev/null +++ b/MumbleServer/__init__.py @@ -0,0 +1,241 @@ + +# Copyright (c) ZeroC, Inc. + +# slice2py version 3.8.1 + +from .ACL import ACL +from .ACL import _MumbleServer_ACL_t +from .ACLList import _MumbleServer_ACLList_t +from .Ban import Ban +from .Ban import _MumbleServer_Ban_t +from .BanList import _MumbleServer_BanList_t +from .CertificateDer import _MumbleServer_CertificateDer_t +from .CertificateList import _MumbleServer_CertificateList_t +from .Channel import Channel +from .Channel import _MumbleServer_Channel_t +from .ChannelInfo import ChannelInfo +from .ChannelInfo import _MumbleServer_ChannelInfo_t +from .ChannelList import _MumbleServer_ChannelList_t +from .ChannelMap import _MumbleServer_ChannelMap_t +from .ConfigMap import _MumbleServer_ConfigMap_t +from .ContextChannel import ContextChannel +from .ContextServer import ContextServer +from .ContextUser import ContextUser +from .DBState import DBState +from .DBState import _MumbleServer_DBState_t +from .Group import Group +from .Group import _MumbleServer_Group_t +from .GroupList import _MumbleServer_GroupList_t +from .GroupNameList import _MumbleServer_GroupNameList_t +from .IdList import _MumbleServer_IdList_t +from .IdMap import _MumbleServer_IdMap_t +from .IntList import _MumbleServer_IntList_t +from .InternalErrorException import InternalErrorException +from .InternalErrorException import _MumbleServer_InternalErrorException_t +from .InvalidCallbackException import InvalidCallbackException +from .InvalidCallbackException import _MumbleServer_InvalidCallbackException_t +from .InvalidChannelException import InvalidChannelException +from .InvalidChannelException import _MumbleServer_InvalidChannelException_t +from .InvalidInputDataException import InvalidInputDataException +from .InvalidInputDataException import _MumbleServer_InvalidInputDataException_t +from .InvalidListenerException import InvalidListenerException +from .InvalidListenerException import _MumbleServer_InvalidListenerException_t +from .InvalidSecretException import InvalidSecretException +from .InvalidSecretException import _MumbleServer_InvalidSecretException_t +from .InvalidServerException import InvalidServerException +from .InvalidServerException import _MumbleServer_InvalidServerException_t +from .InvalidSessionException import InvalidSessionException +from .InvalidSessionException import _MumbleServer_InvalidSessionException_t +from .InvalidTextureException import InvalidTextureException +from .InvalidTextureException import _MumbleServer_InvalidTextureException_t +from .InvalidUserException import InvalidUserException +from .InvalidUserException import _MumbleServer_InvalidUserException_t +from .LogEntry import LogEntry +from .LogEntry import _MumbleServer_LogEntry_t +from .LogList import _MumbleServer_LogList_t +from .Meta import Meta +from .Meta import MetaPrx +from .MetaCallback import MetaCallback +from .MetaCallback import MetaCallbackPrx +from .MetaCallback_forward import _MumbleServer_MetaCallbackPrx_t +from .Meta_forward import _MumbleServer_MetaPrx_t +from .NameList import _MumbleServer_NameList_t +from .NameMap import _MumbleServer_NameMap_t +from .NestingLimitException import NestingLimitException +from .NestingLimitException import _MumbleServer_NestingLimitException_t +from .NetAddress import _MumbleServer_NetAddress_t +from .PermissionBan import PermissionBan +from .PermissionEnter import PermissionEnter +from .PermissionKick import PermissionKick +from .PermissionLinkChannel import PermissionLinkChannel +from .PermissionMakeChannel import PermissionMakeChannel +from .PermissionMakeTempChannel import PermissionMakeTempChannel +from .PermissionMove import PermissionMove +from .PermissionMuteDeafen import PermissionMuteDeafen +from .PermissionRegister import PermissionRegister +from .PermissionRegisterSelf import PermissionRegisterSelf +from .PermissionSpeak import PermissionSpeak +from .PermissionTextMessage import PermissionTextMessage +from .PermissionTraverse import PermissionTraverse +from .PermissionWhisper import PermissionWhisper +from .PermissionWrite import PermissionWrite +from .ReadOnlyModeException import ReadOnlyModeException +from .ReadOnlyModeException import _MumbleServer_ReadOnlyModeException_t +from .ResetUserContent import ResetUserContent +from .Server import Server +from .Server import ServerPrx +from .ServerAuthenticator import ServerAuthenticator +from .ServerAuthenticator import ServerAuthenticatorPrx +from .ServerAuthenticator_forward import _MumbleServer_ServerAuthenticatorPrx_t +from .ServerBootedException import ServerBootedException +from .ServerBootedException import _MumbleServer_ServerBootedException_t +from .ServerCallback import ServerCallback +from .ServerCallback import ServerCallbackPrx +from .ServerCallback_forward import _MumbleServer_ServerCallbackPrx_t +from .ServerContextCallback import ServerContextCallback +from .ServerContextCallback import ServerContextCallbackPrx +from .ServerContextCallback_forward import _MumbleServer_ServerContextCallbackPrx_t +from .ServerException import ServerException +from .ServerException import _MumbleServer_ServerException_t +from .ServerFailureException import ServerFailureException +from .ServerFailureException import _MumbleServer_ServerFailureException_t +from .ServerList import _MumbleServer_ServerList_t +from .ServerUpdatingAuthenticator import ServerUpdatingAuthenticator +from .ServerUpdatingAuthenticator import ServerUpdatingAuthenticatorPrx +from .ServerUpdatingAuthenticator_forward import _MumbleServer_ServerUpdatingAuthenticatorPrx_t +from .Server_forward import _MumbleServer_ServerPrx_t +from .TextMessage import TextMessage +from .TextMessage import _MumbleServer_TextMessage_t +from .Texture import _MumbleServer_Texture_t +from .Tree import Tree +from .TreeList import _MumbleServer_TreeList_t +from .Tree_forward import _MumbleServer_Tree_t +from .User import User +from .User import _MumbleServer_User_t +from .UserInfo import UserInfo +from .UserInfo import _MumbleServer_UserInfo_t +from .UserInfoMap import _MumbleServer_UserInfoMap_t +from .UserList import _MumbleServer_UserList_t +from .UserMap import _MumbleServer_UserMap_t +from .WriteOnlyException import WriteOnlyException +from .WriteOnlyException import _MumbleServer_WriteOnlyException_t + + +__all__ = [ + "ACL", + "_MumbleServer_ACL_t", + "_MumbleServer_ACLList_t", + "Ban", + "_MumbleServer_Ban_t", + "_MumbleServer_BanList_t", + "_MumbleServer_CertificateDer_t", + "_MumbleServer_CertificateList_t", + "Channel", + "_MumbleServer_Channel_t", + "ChannelInfo", + "_MumbleServer_ChannelInfo_t", + "_MumbleServer_ChannelList_t", + "_MumbleServer_ChannelMap_t", + "_MumbleServer_ConfigMap_t", + "ContextChannel", + "ContextServer", + "ContextUser", + "DBState", + "_MumbleServer_DBState_t", + "Group", + "_MumbleServer_Group_t", + "_MumbleServer_GroupList_t", + "_MumbleServer_GroupNameList_t", + "_MumbleServer_IdList_t", + "_MumbleServer_IdMap_t", + "_MumbleServer_IntList_t", + "InternalErrorException", + "_MumbleServer_InternalErrorException_t", + "InvalidCallbackException", + "_MumbleServer_InvalidCallbackException_t", + "InvalidChannelException", + "_MumbleServer_InvalidChannelException_t", + "InvalidInputDataException", + "_MumbleServer_InvalidInputDataException_t", + "InvalidListenerException", + "_MumbleServer_InvalidListenerException_t", + "InvalidSecretException", + "_MumbleServer_InvalidSecretException_t", + "InvalidServerException", + "_MumbleServer_InvalidServerException_t", + "InvalidSessionException", + "_MumbleServer_InvalidSessionException_t", + "InvalidTextureException", + "_MumbleServer_InvalidTextureException_t", + "InvalidUserException", + "_MumbleServer_InvalidUserException_t", + "LogEntry", + "_MumbleServer_LogEntry_t", + "_MumbleServer_LogList_t", + "Meta", + "MetaPrx", + "MetaCallback", + "MetaCallbackPrx", + "_MumbleServer_MetaCallbackPrx_t", + "_MumbleServer_MetaPrx_t", + "_MumbleServer_NameList_t", + "_MumbleServer_NameMap_t", + "NestingLimitException", + "_MumbleServer_NestingLimitException_t", + "_MumbleServer_NetAddress_t", + "PermissionBan", + "PermissionEnter", + "PermissionKick", + "PermissionLinkChannel", + "PermissionMakeChannel", + "PermissionMakeTempChannel", + "PermissionMove", + "PermissionMuteDeafen", + "PermissionRegister", + "PermissionRegisterSelf", + "PermissionSpeak", + "PermissionTextMessage", + "PermissionTraverse", + "PermissionWhisper", + "PermissionWrite", + "ReadOnlyModeException", + "_MumbleServer_ReadOnlyModeException_t", + "ResetUserContent", + "Server", + "ServerPrx", + "ServerAuthenticator", + "ServerAuthenticatorPrx", + "_MumbleServer_ServerAuthenticatorPrx_t", + "ServerBootedException", + "_MumbleServer_ServerBootedException_t", + "ServerCallback", + "ServerCallbackPrx", + "_MumbleServer_ServerCallbackPrx_t", + "ServerContextCallback", + "ServerContextCallbackPrx", + "_MumbleServer_ServerContextCallbackPrx_t", + "ServerException", + "_MumbleServer_ServerException_t", + "ServerFailureException", + "_MumbleServer_ServerFailureException_t", + "_MumbleServer_ServerList_t", + "ServerUpdatingAuthenticator", + "ServerUpdatingAuthenticatorPrx", + "_MumbleServer_ServerUpdatingAuthenticatorPrx_t", + "_MumbleServer_ServerPrx_t", + "TextMessage", + "_MumbleServer_TextMessage_t", + "_MumbleServer_Texture_t", + "Tree", + "_MumbleServer_TreeList_t", + "_MumbleServer_Tree_t", + "User", + "_MumbleServer_User_t", + "UserInfo", + "_MumbleServer_UserInfo_t", + "_MumbleServer_UserInfoMap_t", + "_MumbleServer_UserList_t", + "_MumbleServer_UserMap_t", + "WriteOnlyException", + "_MumbleServer_WriteOnlyException_t" +] diff --git a/MumbleServer/__pycache__/ACL.cpython-312.pyc b/MumbleServer/__pycache__/ACL.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b9828ef39522a0fe2a69a06564dc77b0fae89283 GIT binary patch literal 2134 zcmb7F&2Jk;6rWwM?e#}KY*&d&A~7_y#1e`5I$0G}lh8Jz4T!XtRi({(XKZh?-Z8Vg z1*0BEf*xjft#xcA$sD?tiK2)g0VFFe)GQHn|c0rW+sbZ z?Oo9xq*Dm}BEV?P#)NWuOF`%u5kwRhwG=~91g*NNp~5%eCR&=IDM&?BBk=n=d7{Re zD!PeC>M(^_ z*qoKT;xl=3=jhGmZV9cp&Gf4S}y)34$DfEvpkOlR^Twt-vOKYOO!P-BnNu=AulU=GeeY_-oY))-xoo)x%1F*X+uVar9!MrsMq;FszN^2 zltJ&Xzg>fIB6p$ByRKtXY_nDyJagQj9_5y}UoyY(%ZsmDEDW^>?EvrXRjYTxR?Vfm zls}}rT7{nN?Ztj?M4Gr)QD%J8hNQSNQD)p(E+%4>fQCh>xLOfF@DL?s>7%49L!^n6 zcFOrkH%-wU(~PpF*T(m$zU>EOoU<|ps;3#Eg%4qq2U zQ4%}-`NF~0;mYGX{JD|!k4n#I1ivWQq5$XT8|sEq#+;1_=MI$o~emK|)cK-?K%@Z}pnD64;{&nv|Ng6%Yc z)bc>W4FxThyY$C})$bNo``X36mhNk*pEDP_wa+epvG(~|PhahyiwfP>y5aGoqengc z#eQbKd#Ov0*%9mMS4PM^a(ntpKQq@YcJCeEKf2%3FAe7OWa>1NUrhHgg_epy3Gw{nJTmZ%7Z*(c99kb*j7hUOZ^m53+H7g2*Sik z+%SkcoG+8Z)bDz50_+kP+1_cBhUDx$VZuJ<99<&Wi#`TBTegq@N}!145XX zATJ#B;AoUDEqWQ;iYcO6qtJH)-uNPgpa-ldM3oT7^SFU{kO^OCx@Vq+K9~at*#OL4 zh|iNSGE*86xQc+eJ_L#55eB`GQDEj`H}h|BBN|Ohn|?@B54Kp1+wu=U@dn?%WQ_5* rhVbees(hgJv2NToUv=YIH!^eoaV6_GFM2ma^>Mk8Y0VpzRrswR)&+m& literal 0 HcmV?d00001 diff --git a/MumbleServer/__pycache__/Ban.cpython-312.pyc b/MumbleServer/__pycache__/Ban.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1f9321e5c061d51f179f2471890a02f0a5f1f571 GIT binary patch literal 2076 zcmaJ?&2Jk;6rWwM*Sr3R9p?+$lrF7k6C@Jaic3^gYTD9Ps8-cB609n1COhL~)BP~B zv$W>YKtamUIR#E!LE#TU;$qZFSX)&Bp&q!UiV#vyyqUG*5J5)roA;adX5P&2J-_|A zQYj)B%V)IpXL*GF5MVGyGDX?@SV3qT5kwRp1&XaGLRWp&R$D&?IP$TZyQ7hRFKH9O=1En_EAxyQXiEhD);x5<-STERU{e_s9l|{ zrMX2M;^UD2q6Oo!6?@^TPc5%y1vq|SH6vzWYXygM(w;eS&b*a`(^$gy_J@QxW6D~v zR@ws>d31lBN5kV*JRXCi7jn5(xHW)y%B-kqNuw7EZwofzR?BZ^w+L}SVOz}E{{e{{+s+0x*i>C_LnSCtDPZ?DG+G%=n=f zT!rBB(hqSgZ|%X^@Qx((9$DOjtHTii=2<9`Fj;qp4;d_H*E_&|BO0(OdEaN?-Ws*; z`kqTIHws#w4E(S-nUE@N}taj?1rS1D$_q)ca0dlsS zuJO)cG}<}eNwyzvJ?CjFA6f@{{YAe7@7b8 literal 0 HcmV?d00001 diff --git a/MumbleServer/__pycache__/BanList.cpython-312.pyc b/MumbleServer/__pycache__/BanList.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3604561319cd5322f17862f185552f3a1190ac3e GIT binary patch literal 461 zcmZWm%SyvQ6rD-Z2k8UBMIlRVg>Dkv25})G3R*;W*^FuDwx;IgWFpp`U!lJs{)pfv z;zEd*$1uN$_#sM@xW54?omqrCC&yetsjF6TNS{gkH+2w`%9 zys+Pcqfx%J=w%8krpaoZLf;ET>^Xre literal 0 HcmV?d00001 diff --git a/MumbleServer/__pycache__/CertificateDer.cpython-312.pyc b/MumbleServer/__pycache__/CertificateDer.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5ce771eb9489595ee9210ba85f67367e8f56fc2d GIT binary patch literal 457 zcmY*Vze~eF6uwKFwxrh0wGafMC}xU75Er{RR0KgJ6wWmFT2n8%c)f^m^RIAq75@~M z6o*1w3Qlf9ap~lRQrbSayYGANeecJ8G#Um{cC%L=VvNvtL6)X30G_!Dyda7wW+=q2 zN>o^5nyYCDv|(i_SiQ7F%PLY^d6wwCv_P&-^#OJ(sn)9e6s{J|>s}Ob>B)dcqw}Yx z<8+d+$KVpg0|>`C1tEie;Cm9AZFva+)wW5e-#ceLNc3>iR8VjQP`40!#e$D^@ literal 0 HcmV?d00001 diff --git a/MumbleServer/__pycache__/CertificateList.cpython-312.pyc b/MumbleServer/__pycache__/CertificateList.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..319a417a6b00cef57f25992bed10b655c2cfd518 GIT binary patch literal 508 zcmZ{h&r8EF6vvacTgQI*4+st>3Ikoi!-OGT9D<-j^dd!#b$OeeX*<(Yoan*7!mC&D zPw`UmAk@o1Ja`j^mz_);gI)|I?|mQNeBL8@E|u~~u9HQhcZ3o8P-40=lLU|UWO9!v zqL?8M+Zd}{W16kWs59L&Yy%?=f!6z@O#zcg4VnStNuMY?OS4^Un**(CeyLIwCk4m% z1K|ia@WYnWb7Uv-P8sY2zXVP;fD5RbW-#W(lCy(&_J1Tyn&0(efu<%x?zf|h+>OpKD#>Y3WmD?DVhlQm$zkFx% HqP+GCNCuV5 literal 0 HcmV?d00001 diff --git a/MumbleServer/__pycache__/Channel.cpython-312.pyc b/MumbleServer/__pycache__/Channel.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..cf42a2127872252331110f9206dccc311feffa82 GIT binary patch literal 2404 zcmaJ@-*4MQ96viwVkc?S-_h0%4#p-bwdt6I1XYE^+HR``-B>pXjF9X4E{!+G&d!&W zOnWE{q&{X(?Vk1uDt`zPFF~6`Fq#BHd*H38LP&e!duJ!jCN^t3e}Dh{#Mhq&2670V z_0!soQWl{<1=D>7V?sInR6%GL5kwRZ)f7`v1g(0islq$urD~d~Ntx!QYZ)^m=`_$; zGb`zgr`HVAP!Kg(27Iz!u9i3Rz-Lr+0TKNhM2vkk&bOcBHw!AF>W$;wa*p04M++oR z;6Lc6j^tgck|G0A_gYtS^akDFEBuO})4*ov75>9ghmT@*DexP4dF)DdUyCixVPcTc zP1PJ}s?%eC3E{L7&xXs^5cAiqAiCLvC?U8N}wc@tZMHHC|L8f{gmTRVn zYHB1!(?nYUElHahk^wF&In~Tcoh~?7jZTdpjD3KHc+4CuB~9{)UtanZBsX9d$ROy7 zNt6K@Wk_(%;pvemyI6(Jsb?=hZ8;3jhuDclWy!`e&Y8Q>;53x%Z10h*OYl5)eJ&Xh zB8iDtmdf~A)eSNHYxwT12E}#Cy76bQ?Gwza6tf`UU8%6Oy)C;5UId?si}39lg&ZMg zy&S7T6jY>tw_r#{8O4t6V^}8MpqOt3-M}HAh@R`;451Sb!1Otc?2BGM0$w68G!3V)qoh}Q z>`Z9rFt;u+`ob`l`ZVC(o5xx;*z&PxE(kpC)^P>ulofVOWPVO-^?=!|31K(DvRBk% zj0CZho=v>AE!XqJfEld?x1rLlD)r?E;djAtBZM`3)V@t&i@c1lQk%>MzSm6V8ia1r zML%q=bj8qu7++E&#CDyk#83#CTpurbu2`LDCJY#N{mnS8ta~+h4yL_c02_GCa~+5q z)atGW6>d_WGMhtCIg{S+8dq3QON;??4Tt0P_4)b!FT(tMGMn}FI5!g?&?p7{M5;?7 zAi*=z1el^sj28GP6bY@^4UbzD+u;Fg-Z6Seh|&@qQNC}@=Oaz*BQko^kMw#nrPb-d zNVhDJz_Oy8Wz_=G@C043tXmD+OEg)_B7tLBtRM<3T2|ke4x~kpvLSI~gkBT%uo1zJ ziep?H6L5Tw4&g-4&d*hY8lBsu0o$Z=0KA(#sLwS>-J)N@kK3)mW^B)5)Cm}&Y_5N3 zbIHug^(GTHpFBjG@Dn(`MSp9hw0>{~6^FLZ?WFEq>I{u+FYTPXx7ryQ-9Epwc<=JB zrK#_(JuaQyUfy~Ck#@FII<|eOHTp<9)|r^xUfJP~w8_rc`1Zve=dm`<#0?~K+$p_e zd+dZT5tHc~#Q${v;(d@b0{6kF7=5L|8w^Iz#0Ne~uQ>EdGaBn}y}T0NAWYmsu;cC( zLPM4o+2!yvyjce@Gx%EoHsu7KM;&=1mF*3O>B3HoEh+$tT%WEIgg?S@kWv)opBz$7{)P%q(R)wP z8&A-QrwIR%8hWCgKFA<7|F8PGGI4<5I7|V1AlY*Ynw;G`^~>>@pO4RUv=bdI-_bI^ z8v{G6_3rM%{e`xUJ4UfJ(z?ED-M8BMsg5z+I@@aO-o1aft-sYVhFWj7CuZAvxnoT1 zse8*0FF&~4)@M4#SZibN)Wg{apnJPxjJB@sjX#`vFxA#i9~AX;=FliiX4|NAFog=^ P?TNW|?#x$Nx&HqEDy@)5 literal 0 HcmV?d00001 diff --git a/MumbleServer/__pycache__/ChannelInfo.cpython-312.pyc b/MumbleServer/__pycache__/ChannelInfo.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..199c342792d6afb4119c1051946b5634cea88f96 GIT binary patch literal 946 zcmaJHV%6u-02`LI(8sHCNliV>)i2a*vKAr?TWNR&!t^1#LTUJ@67gtLuEw@MW= zTM^br#(y5VIDj|k$sZy3s+&PJoi5uSgy`S%W+|Tdl(vptEX>F3dwt~=a8O%;; z0`T~o07r-+hJ6%Z8)JzTU$GV8RbLH=O)yf>3&hAFVj7TRb&_jq3Ib)XGAlXvtNU&drcuug~z@v(k6vm`q~3%rsW+D7M~LEd5-P7S0SO45P$JyeN#fMNFQDY2eN) zAcQ9Y9-gaFx?A@K}st4y&8Q*EtJEG;vhc111lx59R`|5-Q1*^Uy3bM!!-97+C7 z7tCGXbHQ|@py&C(%?^aXodlSfbiLRFF@@>+P8^$U9tG3el9ji_ux6{(Y`#i^cRuU_ z{|LO4((ur(cScvd9(m&1t!3 z5WC##$)4Hrl-r47PZB@SSc-G?veAtKXmlXr9cYM*_es=iq^w8bQxCWoK$ti_<={q~ z0dFkM-B=jA-s|&%D3}|$WbukHhv-5fT4_{4>$L%?o>f;5Ui0PIwf)+Ebl`GREG3tL z7X{90bg?;IXigK$kixXnB;`UFF849hwp`fhXGBWR5ei$wb2Ty+#aky9O#b@ Hih2Kkb|LZ< literal 0 HcmV?d00001 diff --git a/MumbleServer/__pycache__/ChannelList.cpython-312.pyc b/MumbleServer/__pycache__/ChannelList.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ac187b21c8d956771cc2835ab7044a54d6b2b28b GIT binary patch literal 482 zcmZuuze~eF6uwK+rldb6!J&{v5VJH87YW5h7e%F1amaGU-fNqBN$MpL>*imf|AP3Z zxI`R;xD>>}O(-s%yjTkvd~o-^_r81Iy}S2RuWLxy*}5`nV}#!GU}>cVz_YFZcZed2 z8S=4%agHS>Ig;=)lYPZeFp>~RqhGb9z`|37mOy!w7m-t@vEFBMkUh-=_hf* zfe@Z|la=;*(3xZ_Ma|ZqBv zAs>Lb3(-X!j?ILQ30#kXdp-oQ%Ls>F$SH8Mc%xZ(L~A^mSK59^69(J7A*97nP-Kbi wOU4*~YY4Bsq1p%9n(Ed)yz17oZl#-@w0n}C`Y(ErqUN-^k!r@R%4?$R2dc%2$N&HU literal 0 HcmV?d00001 diff --git a/MumbleServer/__pycache__/ChannelMap.cpython-312.pyc b/MumbleServer/__pycache__/ChannelMap.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..41211e253d94c572630451455ca4ecee6df54e70 GIT binary patch literal 520 zcmZuuJ5K^Z5Z*nGhdiQ%i3tgniAuv2SQs=m(okTC4~nx`4|agVy+@WkBWmNX(7#~( zDK6r0Q7>2FJiJfs=!dt8)ePPbVnh(r7Cd~gAWn$E zn3Ri3G?tDg6|Lh~ptZr_ZP3clyAY16dDJCvrhOD8YXmJWV!ckkZ&zIPAqtzOrWtgB{utYL&ci_5AiOMvH*1W$+}ihUH| zA;tw(d}XL82$b<(-)gKlX^EDlQr+a1_<#1byi|uORb4!+q)MyuRZuOQ*X%H4!WJG2 zz|GBE<~rAYlrE}=0i%fz9bT8l@()nlk=u6(WBj8dy!(N+XGZ(^ sWNNf0Mmsy`W&QJPa5)_~lYx`LcnV?y;@wCx)R@(pnZEa^@tU;w1qpY69smFU literal 0 HcmV?d00001 diff --git a/MumbleServer/__pycache__/ContextChannel.cpython-312.pyc b/MumbleServer/__pycache__/ContextChannel.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c364ac84ebb82d03ef91a8889dc18be099321be3 GIT binary patch literal 312 zcmY+Au};H442JDX(n3fp1Z%ew= zy^KMib}Sb1lK; zjILKYaNOrSlali{*jNeMX);#@B{?abQ*uG|qfu4Th>Fv)BE2Z6G@0a@W=adv$+Ri% zB;AmHvf}^hlWMiyIW3fEB%SHVy4%a49^2G;i1-}>jz1yldT?;~JnUEx{cazk(MLFX I>1+3}A2M)Mi2wiq literal 0 HcmV?d00001 diff --git a/MumbleServer/__pycache__/ContextServer.cpython-312.pyc b/MumbleServer/__pycache__/ContextServer.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..37d67a5c69c79e8fff7719aaa8fbd82e99991016 GIT binary patch literal 310 zcmY+AJx;?w5QS&_lYp@$piLQsCKbDiD41gOJ!$5>(R?IH1h(!DgQsHz_;%v2yba*$z`_Cq2$WD_hUnOnUgilu z^S40+1!lqAOT(pGNwM3>t4f*NOjXrfFRd|j$(gDQ&CD(77t(3iMVvphrq#r`_T5By zF`=8e4jm6U&!y!29adJt`jS1Wl2}1X7sSq~c{ZwMt*AN8YSPn^Dw9jDX`-|s&92(= zUeYFu{YyTo=j*MLQi)d5sgA9=JFgkr*87O~69JCDAnpgSxBr^--T;Gs7vj-pGLd?OAvO0RknIm?1j$q?dWZ z&-_ggL4jE?_tJ3bT2k!dysDJR%~Vy*Jaem*LRukviclGdW zLRWJgIv#SKOUd~=tgMCgIeSngv4WH?h@DdNWK_*sQFEHrq^BiSCYM~(L}@{qU9{z$ zq-)a8*8JOhP|w#JN2L<2q+^}f(e`F&c5LWHV%6u)!q#I@5;C_#;oEFq9mM9mzb4yY6u2p?s#kS?z8C3QL5;cO$)iAo({ zVk|=Z1E_xhe*{ZAH8M*j#Lz8O%F>BDCsDd^!+XE?{JwtA@8|Tify8UxR<~a$2>q7E z_~}D{2VVu)M-)-aP=FnbC03Z?C_)!lAy6F^BLzJ|RNX^V1NERV%yl#cfwEm5mz-!? z1dWzJ+n$;D#z=VQ#(1Ks{!KYhhqg0CH9FN+9HXn$j8o~X;mmZyFiPCSkHWYiZ1rK7 z2HvCsLU?H4!F2)l5g-RsBxqo#Kov)&1xM?uH7zTxJ=hS1VCRQniMQsrTEHPptXO(u zD{5KE7FcOWfwQh3wk_%=?xq_<9-oUwBqDQkSH2v{Vy{Hv2J=0zyeR1S47k;X5V$Bz zMO8nxK#Xm9%#CBK#iL*pExj^Iu(O)Ydi`k{Y%q}!+! zGo6so4S+TTuXZ z8zSBYdkx|@Nz}1Z+9B}11Kbb9f?P&8co7$Su`ds3kLFwHba_z}%Y{6>_=*sF=u9bU zdVdbh%zjuunVs8x%xA|@JC*-%dA597ig}qKHsmrU@@3!QeDX{$^!vk=uJVd7<<8^R zLi7t5AGCO`nt1*rJx4_g+;ZYl5n58vwX$N&HU literal 0 HcmV?d00001 diff --git a/MumbleServer/__pycache__/Group.cpython-312.pyc b/MumbleServer/__pycache__/Group.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0938a5af1d34a238e1df1d9cf23e21042667e00c GIT binary patch literal 2327 zcmaJ?&2Q936d!wSue~4Hd~6^Kq_{$$CM3I2p;8qgP)Q(-C=n`fz!h@5p4nunz21&( z)a8__t(4>TM7WeIRr*)-+RIjn)WsE2tBON!TSZkRPJJ`>Za$P^$usY3-n{pFZ)SeZ z=Q9Yt)eF+2t7(M(WK91XiV0zFPC)1>!Uzivas@*W7%e)YA;O$;Qm$l3TqZfPs~8HW zWuVhWn$wD-x|*R0h-g%SHEAc~W{oWHiinmFR=+`5+ZN;fwv+vhoQR0{=u|(P{TXLS z4rej^pg*%O?^CrD&U4*6eaZd|x}mq|3UAR3gHD3=Bgs4(&$aZn6#F-Zv4+RiL}R2S zP8I)R!YLujT8)MmSV7%u_$$DlG;fD))ggBYeN3pi+z39Y`+*sNO2bxQ*^cG=z{s^a zaWD}1dk^m1Fc&_)v2bg7WeEhz^{`eW)ZWhup;XKWd*1``6cJoZD;`Y8CghK#<^p4tQ<1VAFE^Kkns@H zwF*WmKGNBSBQlyxrmb&C=mlUlt&u-+t8x7Ptg;>_q)1M9Zc(CdwL zLhFI<61PgIuh*#O>P=YI2>Ql;nY)ht2LY{D!+`jlogI9fZCEbR=XF1zoMi#=ICQ4q zqGUUWW?rv)o-?pp_Vr-B?#JQxqXIJ?k98!XYx<|e!n0n(X~nVivpC{((IdyXeQUDU z4#sIgdmW8*0Z{Y9YJ#NSkM*$A{aj*y7G@bc(4U{x8^Oat+N@)Bucn7S13&O|W(ZTT zPLfJ;Q%YR#F^lB?J?tYp@Rh9M5FT;ZFZXdC7edO*-?xGA2CHWvUE2w9y|LC$9Ey}! zmXDT&$G+kn>Xt$3_aMc)PTeND?YYgm1Kqhs8iZN_c;xsE4sqNCu`x7PXb1Z0>iqn{ z<3B&oJ8g9}Ziom)DX@$r)_FH0iS=5f4KRw*2^nP*f>j!BgaRBED|7<0X4!#9TTiqB z;!z4}6DcvMQ98+aWojr=O_Ob7no-6yT@Qy2qjRSDMQAyRCT*J7vrUuc;pj#M(>!pQ zfwTZpI?RR#3>D+i&faHPu37G+NsAJ``TLm0kAe@iE2wKs=G#x@o=&wahpJ#l(t zc{A9NPIrr?jit?dJ5s4TF}ZQ8UEGl-Uyh%8ad~%qZewAyv?I;EoS1xpcPB1w+}vE= zkuJR~z4Id2EnS9X4|b)?bh5wSlksD#N6#<=hR{(!4xk@;_LM;Z_7wC0~3k{3!^lUtnKJoW(M`Q90#J}DRLm#qxwd@5;x3MIt?s)9{itR z=%oZf_$PyebHAb7YxLo3^zJJ(`5Nheq=sKf7kUa3v;T@`g%5fNhP@Q9Jn5ye`>ZZAho93M8xG{e~S^b}xoFcqg&QwAM2~QXh z!g3#3;iwO%<7|CZuQiurO3trQ7`TBjaG5~R2Ug6%5+Szd35on+rsAO4p*{?K&>aYw z1Nt7s7d(vgghm9eBVeu%0k=KEpdT^{Okdrn|JiRv<5_vf4{74TE?X1A;wwXl}sWeh`>$b$IV(J&8IEK3b literal 0 HcmV?d00001 diff --git a/MumbleServer/__pycache__/GroupNameList.cpython-312.pyc b/MumbleServer/__pycache__/GroupNameList.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..40cab9235070985f5f45df4da0e1c30b7029b23b GIT binary patch literal 456 zcmY+AK}*9h6vvZp-DcBDf=l}AOk4D2lDz10RLxd6fE|Nv)bHG!g-~}$l3vEu!_NzWN j+at4`buO~YtBlYw@kYe^G=~{#PU^dvvG-gRb>;jAu`+&& literal 0 HcmV?d00001 diff --git a/MumbleServer/__pycache__/IdList.cpython-312.pyc b/MumbleServer/__pycache__/IdList.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1f648fc7a6c45539ad47e04a4948fd5b3129abf1 GIT binary patch literal 428 zcmYjMO-sW-5Zz6iw4~OXg`6uw4{h)o#FG^YRRmAwvc~STrfxQIvys-Dze4|l_(v)p ztauROrQk(xLh;g*8$xLZX6DTs-h8}Nt0q!*zEd22tNfJ}OVe|J=dJ?xh$4y^3b2cD zhBcA6Kra*& zguQ-`o!`@n#*6Y^5YmLfzNo6HSb4mw!fyd%{AVIu|3n)ztNF0?VKv{Z=CpM<(I)NJ W?sNCuI-8=}tWuwv+jk{VQL2Am6mrx6 literal 0 HcmV?d00001 diff --git a/MumbleServer/__pycache__/IdMap.cpython-312.pyc b/MumbleServer/__pycache__/IdMap.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..892bc16cef0551ee92402e9dad28263f18d19128 GIT binary patch literal 469 zcmY*TO-sW-5Zz6iwDv>16mqs8^pf0zc&b7VwSu=mS<~(`rsj*yMvOOqh5iNck5oLE z;-L^P1yA0DB1lheS_^excHX?1_jX?D^$HSkaZnupi29K?n^4vOFG2zC5k(Zc$ipVa zIhI_>lq3Yw_-}6`%PTF=qL`GoxiuE->c{_+r{cOd6)M}6@+CbcZP75WP21w zjt^~Tm|I&c$#w`Q5oeBXXNrK1&zYPHN`zRhE9Ci=3z2Bq)-MAObQ=O@gWiVdiU*+{ z(~!VT2+Z-o=ax$t3D#yItJ}0NS(XpIfW|Hyv0Y(`MMj2rz6u!Q?+U`rcT}6J s+Jih(wW+G5`pHC^9KZISdue|#>pRoF^QMkd)RnsAxE`BF9}|QcoMOoB6y33HFl>pb+d_^jaYB~3jGV>AE|h- z;z5X)f+z7J6fZrwp)Kve%)FV$n~#@T%|gn~Hp{&qmA{H&Zu%79v9G{AqKIOKBJ5*a zV2x?MrXkRJ#$2$-v_#8_sVq8k^i-N6U#EH(`$k`D8s9~$iSuf}c`O4N#ymZ`t$W^K z7M(LV0dWn&^IBXUgsFT)d7UgXWJVC#G;@oPP9`$}got8QuD9B7+|O4jbV9CXU1h-A zkQ+pjkV{cKnVWr6qY%F_sZUx#B`DJ zA3{k%0m@IIF%lBiAtVG!LFdTOq+<4*hlx@!#q2lV&dy_Z_T%_?k)YIP)Xg6`LVil) zRP-UBgLeq_2`8L-#HSXe5-Xl!DY)jmoUdAH#;J%kOUtn4<$c}KDFIy}D}?9w2-iV9 zz${V@h6}L_g@Ceo^~4-mxB&()fW`|4+K{%2=vzXz2*uMlm`mrSreckCl*-sI=~$s@ z$qs@ru@g58;u_lJbr7#WEbllFNfN2MY_09T@L;&ZE;z6RT?*VzY{#?X*cqvd(4j#G z*AeU!AQt5W?}A!6u2^a(S5ecc)gS>8*xs@b;d$QI{i2Do(GuZyV7d)6X@MDMwV4n& zVOySxO&j-4&YK_unAicP?RtH2arELA7ccL$UZ2m>AJ6=sf32dW z24jKk17m5CF+b#OPvSAgw%WFLvZFJ`LkDS{VL!~}AILzy$MN%OEA*k-giti0`UK*a zNf=ezJYujDfpC2Y65C?}oKSEO)zK!Zm-jFqb%cSjGc|!AmTHe2sd>%lPm=P&?uwW^ zbr1!K%Ba#pR$J1EAf5Sl%q~xa(>5-9ZnTrOz@CNtB&oLQz_U(zd$iK|3v((|nN1z5R1H|W$kI1L&FW=Z1lx7$?7rS_eca@BeOjZQ_8}J&0IlrY&;r1z>>IyrX2Y= zLe{t(Q>Rf6O4_W^B{N48gc@Dr&f8LVZv8Xa_+Fas-e2n$YrA?@(O*onS&9Gv literal 0 HcmV?d00001 diff --git a/MumbleServer/__pycache__/InvalidCallbackException.cpython-312.pyc b/MumbleServer/__pycache__/InvalidCallbackException.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ce44127008df9f6971dc213f103716b5799b8c56 GIT binary patch literal 1174 zcma)5&1=*^6raf^o9u4C{6GW?MvB^{wR;k55vi!u9xQ5wN-nc$=Cw_muTHXU*NYVT zKh&cK4@&B%=qTh~ItM|kslzj^aMCT~9X_Ld1s{g%4CUm)a% zG)_d%0quN1uuVAO)FVE%D3w_86idOi;1zt;QZr6PtXW!yHLvLFmQD%i3Yj9jxJ9@Q z>JDa+vXd{wG86*J^2KAbYvBeMyaXCA?Pxh|mC?6?Y#GWYaWI$8D~pQN(^RTGKc!=p zrWHE~!o*J8Fo!K1ws*XvGsZ&)X`NwD%;ld*M_&EWTx}`zp|%L2ScKYRh*y#@sx^4TU?T$I z`Vb_x#{@W`;2>(EFY)sCGROQFiN@;RiH(?1BYC`wvZ zpZ0TDa057yQMWR%GDJ44o?rn$Q(kUR(mPGps8GT4U-rXIU{4z4Rr;hEZgL`Um qPaQ(tsc54{iwqz35o)vy^ZiJxHusgh{$9D+y8WV6ez~bDpPX6#My z5sCkS9((AaRsNJ-773}5Dua2gRRK&E$kanBes3J;%vl@?^M`{nz8Gpr5b1(_*r=l(o@DVoi-7gu{K;^klOA}o1&(YTIyLRL(YJ$a8``rtn9G%&J;jc&^6O4RF?$o zP80?xN5yFvVd6bVK#LsJ-!oum8^l zI~z{vah`}6I4|3r$4ZVOgO@meI1?il-`5h zPmukZtF$+gDThZX=rD#P7ZKMGC@n$v7R%_JQbji{w1>efa|S_X%oFm~ZaUuNELqun zd_$j|Ip~%_D`?7AB`z;gDAzx}(5Ga=i@j{B9*pvl#;Ub>kEOF6!0n>^W>IVRlP96^ z|3I{Pie+bhdXVX+p^f-*MZzFVV1C*47lw5+z?Yb7+(<5>2vZv6bv5S@9edx^NASH~ z#i4m!*+Vpw2Bq|Uo6t-DlBL&V^9A|kHMuxx607shYSGQ#)RbU1Z6Gl*#N;b-^#}Ur z<$tbRe|F{ik$vsRUOlp#NA@MO(~fi189+dtmURDrXB7z`Aylq*%^yIvxTh~ItA+JB4SfN;X8M|^5gDzV}zmV&b26@1lFGnO*s6avcT)iZTSa03ip0*#lBwA^f!(YJ!uGL#4RU@o0k))i}{t<*+-O2-;a zD|QfsiJiD%5HF)%T>-HTVqw>TNE*>}mpyCwuRO?4*aZicpi7C{iS2lH96LjG5t=Ks ze;vUA0b)^3a2C`maK%#Fg_@e)Tne^r&*e)&)Jo>@n)B3e(z1!Py5Ytqe#wRicLH-~ z0|L{{V^Cs{DU+K!c5KEGIPRJYd^U^B*m9UaoS_*>8OpB(bH#HVFrCnkTn~h~4gm-| z0gkyaAq-}aCCIun*F@-_h5bElHXDuM5j7f@_S9_VrJdIPJ7l@0r3Pbx?E_WA*%ioi}od4;I`bOwOeH}uv4)uA6UngNyZ}Eu1ZUn;h zAxLbG32;KeLDYv^sbAX3Y}6J8UZ1fs1hHiM=6yA|!_NJepNRFXGS#`a(kZX*=~+pC0OWR5_y7O^ literal 0 HcmV?d00001 diff --git a/MumbleServer/__pycache__/InvalidListenerException.cpython-312.pyc b/MumbleServer/__pycache__/InvalidListenerException.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a57584db6f1d6b06e4fe1a7e58603359a7550126 GIT binary patch literal 1198 zcma)6&1(}u6rb7bW;Y)-^#c(sxKh-H*5)MGB2q!A1ubfY%3dbx&P%g(KhoJv+jx;e z|A%_?;6dr1;w6G$SP=y2!ILS`OHaPpq%{@_K9)DX_vX#K_nUdMA4W#<1f_aaUF~HE z`7Vt^(ffe*-Xho`oN($9pIVektays0;F$3;zG|tdPerU*T8cF<>+6>vnZJ9fh$T130F1Y#Y;y-f!i(uuB1>|xV??m>Ts9SdMFhUB;%+m2^Pkuy{m zp?!n)&LP+#KrG4$o&~isT(Q(vrmQ9x7J_x#bNK@|iXj-v{PJhsM0r|wBNM;4F2aq# z+^9o<7)${*5D+-PO{b0|z%#wU7A6lNGLe>PJ8{$Yyp{=@IG661s>LvdC`H$$q^O?^ z%q7otz;r^t;d&s<6B#{!Uk`v$MnJHamL~(Q0)%E#P3{ ze^)G)wZvd7uzg@G$us7Myy;0?WNZx?4`y`6c<7*8XUK`U{5|Q(D>+!M)I%RCD-enm zsN990|9G zRGC&jlcaETgAj?Vbj#|K5{H@_z|jj3XQfw<0AEQg@F*E}6sDA=_vxHQbYR@-U&3v1 z5lz|o(Hg35hEn=FPw4m;QrsgqzmofVJc39m!cH9($PInrtZ*p zH$G3!eVm-@sM8&FtfOW->Nx6NL7Ot#WMcmmp+?&<-%PeE%b&=zZ-p!EYmeLcCtG@2 F(jRFxT$BI+ literal 0 HcmV?d00001 diff --git a/MumbleServer/__pycache__/InvalidSecretException.cpython-312.pyc b/MumbleServer/__pycache__/InvalidSecretException.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e5c60ee55d5c7ff925360efd1e6137d2a9de082c GIT binary patch literal 1183 zcma)5%}*0S6rb7dcDF59{NkWS*APicgdQ=(;6;NRASU2tFVl7B(Jt^XBvTc$uIyrq#`(0wF)8 zF%UfmwEqFYKH-E@kNDK0RAR+bECuI+SMXI!%{UdYW@#DLyrQpLIwhbhWQp+N9^pEu z2N*@lK|T@7PzWfS*Urt6i5p<>5@@`1pyjkxM&AmuWhf8M!B{%4G!<*CqtwPuq+^Yy z6*~yR#7^8Wh*#0Bu7TJB@odL|NRmk1V=Ha{l?V9>yWqeQbSZH=u^rEjV`n5ULUV)m zZy?wwKrG4$-UYP^T(Q(np{Ayj%fXiIxqJ;A0m(4#+mo`1vfgrI6Gze#;dWqdw;(V( zVcU$`QRH=y26J14LDP)0?WP-KoMU^Qi>wm{3G5_u*;$!d4HJknG%F=Tc_1*?Jl6r- z<43Ls!fZkS!cKtWk(dGuuEZP`Yi@|pKi~FuxzSiy7`?HDh09B9H1fR8rvJ}>wWg&8 zV}b1hV`-T&Kjdvs;xWeFv~BNvMQ4nM4$?ZqdYH>Uk-mJ0vzPT&=tI2;p=d(=Da5an zFsiqC#9$`^;rb9Hw#NiGq2M6uqeav&uVF6g2m{Z~)D;A=RD0x9Eow$@f>h^sm&C-t zL6jt_qDo6yZb>JCbo$@^x;zlJ*|@BEqn)$`)-2@jNVR1LUUbqsqnXZKXi%Zbpz>p+ zmEp@lEQ*qrxu;bQ8*Tu@-V@g)tH*%yBsIrcbXBYIKde? literal 0 HcmV?d00001 diff --git a/MumbleServer/__pycache__/InvalidServerException.cpython-312.pyc b/MumbleServer/__pycache__/InvalidServerException.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..fa038224e946da64a6302651c5fc95b741f9b5ef GIT binary patch literal 1245 zcma)5zi-n(6uxup*!fXfesur@hYFQa(Pjiis4O60XoXZ*yj)D~wQ;e1=Ipf1h{XQ@ zBLf4de+o;Gkf@B1kWdGQtn-Z`Ma-WFuOCoGA zcS}Xo-SH`|V-PSl&y1%NKjDBQDqxAqu2s-(6@6>SR-t+r2hXxaZNqTueWOwTp&c7E zt9el*Q!n*pl&s=>dJWVTsCzpdh&74S6~597p9WB@@M8`i4v;X+k-?6iq)SD-(Cf3V7snXOUuTI7K}LW~ z!W4vZ3k2?kahRoCMs8MR3Q3L@^~h175!hPbcYt+d82bSzwgHirlt)7Ka9B`wR4TTv zWH{dTce&kewI=J`YMor5cDvAZF#mu4s|_o2IFGy#IM1q_hf?$cjq990?|H#^#pYbd z4$?Nqe7G;(laap0gD1@{mZ`Y`Qf)x?(=CFg+_d|$MFW?F~QVCGa$t0R5 z=dcv_m4mT!a|%JC%}esrEL+ZShD_glabL|GI;e_9(`d3vt}X4ykj?-5I!`_bAL*3N zdA*nR6y~gSZ)MiQ4m|2-mnM}i9ealgdz~oVR$1-n<{(jJO>6Dhw19O#f}@U6XEkdl zfL)a;EF<@V0FTtdi)2nCI&f|m7qF}@;#7A^5~CTGD5bxvgwA~-^?h>dD|xU_t`5t@ zsQof3^yX_mBKRAXkQi!WI7=4pygUE7vHY>Iyl39nGcW9!_;u%?+-v463Uy>|D_wm>X#n literal 0 HcmV?d00001 diff --git a/MumbleServer/__pycache__/InvalidSessionException.cpython-312.pyc b/MumbleServer/__pycache__/InvalidSessionException.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..31d147e8cb25b33a1905a01589c9687df55317b7 GIT binary patch literal 1283 zcma)6%WKp?7@x@|o9u3DeW8a6j`%3GboW|{s0T$oScR>qZH|?QS$LXR_)Z1^)*< zdhnq1Pw}#XV2KEVc<{Eedg;k;l5Jguf&w~4kbWSh|3jf1&t(drrQ+|XE_`>qX_Y0>hN zB+dOiOcS+%`obp2#~`mh4ItAbQYZP%L3}@gYK8w}z;iTd2tW6O$X663&#=|jSX z>42#Wg0MSee!{{k22)j#cI6ZML)Q1R4DG`%x&s?1kVq*eLKUP*0znRfsW1sZhm;Ik z$XVb=5zABNc~!6N9^`k?Q+ZySZ35teR@>8To>!Jxij6b}RiafrN>ud#Y%>ZmO_0V} z7-1PbNI?2Jf36#Z-5qCpd&#;oji+vZmOXEMefB`s*Z0{$thUU*v-F=18_QPVaGv-v za9%Vyk5e&-G@j%9(ZG+UD>mmM4Uo1ucEm&RmQ3_X@7(M3(-=BENM#Q?S3o_?)2uTP z8HcAC$S{T^_aiPLNTmSTnQf!9PZ#ZMC>;!5iUSCg7SG8Kvu-)#gJfat*)@4^*FZKj zT0l`W%Hr~22F23fH+Y{+c$4RK*WE!rkl3}<53sOq1aNy;oS3b(UEPblyDIUAK%{&qzhY;;J7pfz;C>K%H&q+N( zF|JWce>Dj`{fW$dBWs_@^>5_VxK51LPoqKCUZxX*)1-#PSQF!8WaTn_bN1u;OYhHL z+BR3W&BblAzHOdHIcZrd&WJ4iI6$Z~a!$Tl9JTL$Aosqs&Wz688Z~b}v&)ix1K^@~ AB>(^b literal 0 HcmV?d00001 diff --git a/MumbleServer/__pycache__/InvalidTextureException.cpython-312.pyc b/MumbleServer/__pycache__/InvalidTextureException.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..314f93cf37f7e35c43afb02e4f078ace236c4513 GIT binary patch literal 1172 zcma)5%}*0S6rb7dcDEl`{D>YfVGRl?g!W1rBOWx!K_me=>}9&{Jle(mD6>x%pmkr z8fT)X01w^^u#YIB*h4@Dsr6!yzux4oq*1W8*TRKLdD`)}H>>i>z zs0Sj8l!J6ZmZ2a}Hg24nLkl&)pgGWJ?m$avD=&Ntg3UwzERM*f(?UbBiXEj~{3RXB zI4;;h5OSNlVGu0|yR-sq3)s^g2U?O8)Hr$G_Fs9B?vP6kgbSA(wYlwhb`&{7bs?M@ zcyLRAeFVtD6p6dQR)#8;+R2pF_|9UmWqU4Ng&p2zaGv-c=XsKRL3p<(m&jU+kEj9=VY##`T^Mv>z zZF>?I3E6Dh-sz4`2n`)U>qK-!T>23WNCcjh;EMoJ1v|;#^W3 z@3bJE`gf$R$RtKT!_gNt!vHzli!d9pcY;v$Ldc_O8(JniPXKqtn-^a&oZF=5L2jy8qrXE4Tp@(53S zL&YOB_Z>YuLihSvq!fNDIXw3^93Zg_GJ@z!qJJCBJjNd$e3_pAJU!o2XM5^cPtEq! o384oCZN})LspD%18(m}k-B`Es@(`{4DBSN(zUbzcclD&CzsqJ)4FCWD literal 0 HcmV?d00001 diff --git a/MumbleServer/__pycache__/InvalidUserException.cpython-312.pyc b/MumbleServer/__pycache__/InvalidUserException.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8cd69f63926f94b6b0eb7c3c6a523401e6ffb4df GIT binary patch literal 1152 zcma)4%}>-o6rbs~+wLx3DlsOKSOO8y$eu_HLA_`Y6OjbH^fFsJZ=ujHr!BDFNcbP% z=)sHO=D*=(H71f86BEP1+mh7_C*QPyE8*Zv^WN|M=FPm1z7PHVRf5vEsjj^*5%NPi zr=k~tcHbh{C7f{T5uaL=O00N_rJyZ&C117FoKq2NmX>49EBm^oQv$j|<_RzF5Uzu| zk6EPb7lv4dLO@x&eB$;PZh*lnpz+GSR?t=zV{6D(p?dlb=F)j>MX~x?%2eM^88}6= znjHjTVkd4G#Ea+;E`!(r@o39|NRmk1U{6#3r3b|cI~Twb45@HCu^rEjW2dJsLJNm> zhY{=&AQt5WXF;tJS1h$vno_gjgT>c{N$@=c%F1$*Kr919Ni~0<#sS zW*mXzHe040m~L^~O!2zQr}JyMS_~72b96^aj*2(IT=rZCOegds*8^d$Kmfu{fMX)e z2B*E7XI+_15&9?B{vJ0Pv$MUUnVr3;mqw$g>UjKrq8F#M%wR0AePArBGUkUo^(5|N z>{V)eCnq{%JamxO8TP_l{*H9zw2znTtDz6|6$r%&)E`2;o`g|7ky_S_&JY=#*`60ervaiO(IBdmCGDQs5&J|>F+9`V_!+%A-VgF zJU%3&oib5szmy7{*?Z6>Xu2gNI+EyIC6o8wq+cfHK2FRXsJ9N(YX@riKpjKft!a}+ in~Wa~5NfoIk-hcy?Ps6K()ZeEdu*XyeX_0R75xFwQ%UXs literal 0 HcmV?d00001 diff --git a/MumbleServer/__pycache__/LogEntry.cpython-312.pyc b/MumbleServer/__pycache__/LogEntry.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4acfcce929e3644f9c1eb79a3bdbd736ffa5a830 GIT binary patch literal 1235 zcmZ`&ON-P%5bku6Niq)~>$7IYO>L2~KIPWQ}4^B6lFam0gy zg2(l=deW<`Kf!QIeAch=; zA_rdwVjPuXN24lSUONq5syhW*0Lze8*Q{Epc`0gN2nFxDdliI=HmtKYlYs4owpe4f zAGH@VJa-Dgz12jpI5QWH=`uvoZ3$F9S1kzq3BwJ{D!uP-m%uw^941H@ec;j!R< z!t=5=B#YfPn<&2={Z;v|6Dz*gWOg$OI-bwC-DV-h?Ik$Q28r5@V$U=X?^SZ*5!0>lZezJiXF04-IrxFAObX&gh}p T!4xXb^!6O@6;C`gGCqF;gl$35 literal 0 HcmV?d00001 diff --git a/MumbleServer/__pycache__/LogList.cpython-312.pyc b/MumbleServer/__pycache__/LogList.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5d5eea8aeb38a06e62e89c751306dcf941bae647 GIT binary patch literal 471 zcmZWmze~eF6uwK+rlhT#R5Gd+x+I8O5GNIdT12-jXY9Sk)co>t5##1xq5p#Tj|eUi z2O%y6ac~ogOD8YZLcs@j?|tvb_df2PnoSJ}J6ThP8yKPY63nbJ4e|E z6ec}^m&idHoceGK>=GF1M($3?Sw{GE%d+N6mL+OkFX8v7X#E>13xs!Sg+|CA8xNE=a#2 literal 0 HcmV?d00001 diff --git a/MumbleServer/__pycache__/Meta.cpython-312.pyc b/MumbleServer/__pycache__/Meta.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d5a7554b2492fa8fdd175e5fd9d544fa05b5d801 GIT binary patch literal 29921 zcmeHQYiwM{b-ug2OD><6Z%QI1UcO0*4@s6^v}K8;WSNd7%c3kN>nh9D-b-oaebBQ@ z$z+v8Nu0*+D{@~_ilA151f^i0A<#br(jRIIv;m3&OE3V5ZH1<36`+3##!~+X{n78t z+$VRJq#TQ~Ev=~G*?F9KoHJ);&N(yu=koFr37_#!`Fzt^N%~LvVty0>c<%gdp(I_E zG)ePBrI;t+@eu5ddIMhkE{GPyYKm!r{_rWvnVt#o@AOb*v^(!{PF1ZLBU($Ki@-eXJqS zz+ol2CAKxNmBW?MZL!8cBZsS^O|k8P?HsO-?ua!9nmJqpSPiHgu8p?DS_7>dt^?c_ zX!A&VE8B^F)<@f89f1y>)`0eP20A&sCE6A14s>&PYqTe}Gq97x+oHQ-y@6g1Hv;Yp z^l`WeaDSlRBYCAGlD7R_N!y_pepDdFIxygsbnp3blLYo}tyv%V$Sb}ZWmS}I(Ph2) zBU!`;_VCi0UCM;CR;^VpJwIW7w|{G1txan~o#*U06Vlo>X+oax@EqI4H@#-U^HH(L zq3;PkY39vabBES}nxkeu`?sih4ct$gdGq4#)H>Jd702C}v)#|Ei@Qtf`h>WjT^Dz^ z*1az7@|^7+To-qb*0VP5wP?LICu|_~g4sU%x4}g+(c8f}&zm{&Qg^4e6FtexIeMLe znfTMISAjFV4*dJq#lK72^&8-SVO{*aTJPGFSZ_QXy*aRMZGBqb25QSo9~W&7u3KBb z*1v9TN=^u35-m8d-nV{MfP|yrJ;B{ zkqV_EiFooDz8AiF=DZ$G0V)>IarO>n3!l@&Z|T}dC`oCRj;}+>>3A4%a&P&T*|4-Jo@RXR`Vb|;O-FNC5I zG$k566AHg|_?@smN$ux(J9Fk8)5A<>GBk{8U z{bTyuQ+hnChfOY`-#+ohbLX!;v=P#!fJc+C`SAn_v=%I_1@HO-GN3k12IK?OuK55J z0_xBT0Tlu2)QSN40d;A9K*c<+7*Gk1D*;prs9P%qR0gO=D+5#xXs1>Vr~=R~tpbn& zs8>?}RRZeMDgjmTxGF%^Jgyp04WNFl22d@a0j(BL9iZJ>9iVzZd$f8$4S@D)4S==) zdP3U*Xe*$7+Ezf@06nQ~1JtND6-&jE_7sKoKkaF)@m=3X#+U`R=gIYq*5t^wLvPlb zfcaT$f~>L@4%J8<)OO@drIOES&30Nq1-9ok^qGKo{J<^ z{G`t5D!449M&c=*O@zXFzdD+tlt~teg;*pytxhF%O`S+E6*G!O^b6n!I*D#A%TW5p60IRg+vO^z-KM;8-H1Cppwd9}bDO>grfD64upl zA~qR`>P$VW$4SzlT`B6wBul(At@7rm6D$!kvRi#p$HxZ;oz28Ibb5ST)P5{%>^(X4 zh}H4kbLS-hSEZCeQb{^*>^-dr0OyT~;f%W^UGhwLE_or7jS^!JyrJ)!V^4j0QBU#F zFa}*sCDi1k9*#^z!mfd#yw*S*53vx4r86-~l*UKOJzNn@9i*|hicvm67IpMcKR_Mh zAtL(E>Zwu990$r6PJj{KNdbix38&tK9O_jOoOWS539exzCXy+u05J%0QzU*N5$214 z7+gYX6+WS-rdT|y`Bu8cJ?bU(SR$@l34~?TWKqse#&CfJ1S9pTXh2AfPer2!KSU-} zj0N$zSU>Fc^b}-dVt`C}Ffkd#7>If^h1B@B^czS{>d}deH=<>Vj1fr^kDwLzMh4C$ zV*0>YJ;BcE1BdkFTdBn4z?3!_)ZfAS7l}a>hoV8IhZ9WG*?^Pp2B_Bl$>~h7Rq0F> z#bE^?T8MVgzA)L2;IedAl`3nOl$HghWl8B?P`YPp=c?xl=Zn$<2N#v0w14OhvEHUI z@E<*9V0AqPwieYlSF^Hv27Q{m%v!(!tQA3~R4_2#p)ukhlWSQwC0AH1#&gWnXR#iS zKSl*}@L%78(l@KkotZl||3-S>;YH=ewEso66S>1q(P#VN}IVX$)+aaTr6Sjg5-g;uonf$+zG5lY9!T_B*|zA8w=Q&!2R5a zOvhkZUA!Un6mSL-vJhDW`(jmZx-)-^)c^Y<+64Q7V$rsw93UsYyk8&IEn2B%z7!AWRXm*vGE#CVAHP&k(1;yC!1#~v1+;U&1`Y3 zTdtJL#BVOqLwlwrWne)Wn3Lz&{L^!>MdeW1e`vG#X7thG8(X5}<{^@M*8bK zQl@S-#|UAwJs;cfy$@Xez6{fo+I+CREkyt8|4-qCbyU##=bqbF%d z?q*3@mz1e8q|8t>y0(ZZ2gBHzX6hV_Vn<)kVvvpnrDI9yT~K;wPtFa`7tMh|=uEa* z4D#Hgz#yNBNLiOx7#U0Qh?8m;cL-UsEhmfcw7EQdvS&frGuJ*}J^#jh`R1OT{t

4lOZBQ3&qbi6Gg^z9 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 I;%n^x16P^vWB>pF literal 0 HcmV?d00001 diff --git a/MumbleServer/__pycache__/MetaCallback.cpython-312.pyc b/MumbleServer/__pycache__/MetaCallback.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..199da5445c3cab85ba192ac9841b53537a47d3ca GIT binary patch literal 9298 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 RnZ@Hil6qVCag1B)zX9~VP>}!t literal 0 HcmV?d00001 diff --git a/MumbleServer/__pycache__/MetaCallback_forward.cpython-312.pyc b/MumbleServer/__pycache__/MetaCallback_forward.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..340895deb8f3973c968e301d08a78bf2327a4e3c GIT binary patch literal 410 zcmYjOF-yZh6uwK-R?_w#2!)73K+RH@A`a@}pcLwq<-F!zYuigMye8VX`72yq#h>C* zaS-BCa1s}xxO6f{DdrpQecye&_df1k8V!r&xY{vC-+BGiVvW*@(8Y019*7`g=q;Q-uIn2ci;xrvAvOe4Ty0Ab7}L+}*}K)0C1EoNbTg|{5V zev~dZ4g)0;2}fAZcj$MRIQj8YqLltxgl>J1`rK|kZok{DSGzSk=)T#PGt!*bc4yY! JeHHbW`~j;2bmIU3 literal 0 HcmV?d00001 diff --git a/MumbleServer/__pycache__/Meta_forward.cpython-312.pyc b/MumbleServer/__pycache__/Meta_forward.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3192831113bbcdcc81184be57eff67bba7cc25a0 GIT binary patch literal 386 zcmYjNu}T9$5Z%4IByveQA#klmIEY>!#6r`EC;_``)-^kciF>!lWKVN;eue&m_$fA# z6vEjAtn7qflge8{FjLID_m-J?vv2jfONzMKb4IhGei^b3dj;s?xByQ?5J4r0Xh^BS zmb604B4CZm>xTa->{q&Cp(C6D4NIBjm%feU)4a;#SZS_@Djr`vY`5FzX>={&67UYN zV4!*4V4ET{S{Elw`{mqate@%>fiW~5^U`S#x>;Tm(32dYi)xagV_qtZaVZ&lAq%s6 zc^2HL2!a7996->4@vT-#kcx!CBmo>o5Nj?OLQkOp3^qLk#sljsyyqwml5Dwk7%7oT zIKo;n+uS?$i}YhtN`GBKcRopN?zNtqA71O-Yfbl0W?pAX8uRMz)NMXi(0u(L4PI*u literal 0 HcmV?d00001 diff --git a/MumbleServer/__pycache__/NameList.cpython-312.pyc b/MumbleServer/__pycache__/NameList.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a1a40bbbbb720bdd95f855af94e375ec1370df18 GIT binary patch literal 440 zcmYjMO-sW-5Zz6hwx-r|AxE*$i|auzK|F{cik5(Q$z>b6)0mnsHyg3u{1y5a#6Kc< zN%2sKmx3p6O7YT@8%k&gX6DU2-h8|_n>v!#YgdN9GJh3CY1#tdnJvK+Vu)cM1=z;8 zz>2Tfih@8HR!hM$GnG{&Q(tyU^r|k9tuf8Tc6Fq5s^3McgY$+HhLLcD7lldpp=Fxq zX>jGk1@JrIrrC7@IP((mg7Ow!rD(}e(W&J+rGr$Y94O_*vRpgqgEh)G7!15nPP_fgr1x*C^LYEhx<~2$k-Nm)$cJ_hau5DLeq z9QqMwz{%=Sq&#Xn9?k3fLBvuY4tP_}#nO{q8GclZ@t=FviFZ%E-kr80PM literal 0 HcmV?d00001 diff --git a/MumbleServer/__pycache__/NameMap.cpython-312.pyc b/MumbleServer/__pycache__/NameMap.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..eadf2a4393203deb62d85f89eb4781520a95260b GIT binary patch literal 478 zcmY*T!AiqG5Zz7Nw5C`-Iy_k9p>OqR2&{7aDrF4zmX-!QwVY3nA&9Bg35PwAQ zlH#EdF9lEDgyN+KabsJk1GDeVyqUN2y1uR<85cX*;g7_Rv{;5ZCwS^h@_;C!*g-CC zW1MouQQC@vKp8IPmTM`}49!ZVu-cn*+5P+Rzw(@&*KL*N2DqJ%l&bofwyHQOT8w$Z z61K;J=3Ut|8=-sYz!~rx;HKHMTxeMS6H3ZtRUr$3h-x9x2Jzy2f!i)HVL60D&*K!hv3i}cxNg^vW`%v%qoD(bd_&q|nZbd4zA_l&Zw=wC zcT}3_wa3a>uZ{Ftym$I?6t~XDt`iMzdV*By1;H=V_(JSlF+TID{^OVZ&NTOEM` literal 0 HcmV?d00001 diff --git a/MumbleServer/__pycache__/NestingLimitException.cpython-312.pyc b/MumbleServer/__pycache__/NestingLimitException.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6769ebad03c8c9f8706884c180e5e1fd6d73840c GIT binary patch literal 1187 zcma)5OK;Oa5Z-m{*m;zcr-T4uC`FBc=2oGI_5>=35+3czmyO9z6Bj?i+Mx}cD)m3K zKY#kf@B1kWdfYQUxwOF>ALWt$JV-&3-dGnQvx1`)O<}Pf+SN)s;9y$WLh; zik<>Gc#mL{aKfoeJZe!YvEnM0f@j9fc&eo)J{7TMX$jWctfyN#C7>&0p787j;X0_> z$RcGsJ&0u}1eBFC2j$VpT} z73Y%DqHY`F$)ihlA`hQD8!>w(BCLtUK-HG@^auUON6caS2Vi?_nENKSL?~ zlP7fI8!7IRyWh#fU2?6TB}(D9lA|+QPX`2#K?WUt>F8e|<+%^q*QwdhQ?onjtsV8^ tj+)(3Cr}RxTG{B4$-PsA8a?C6*1O*A=U>Q+ABF3^8;^VWg>^lt=r4iZSG52D literal 0 HcmV?d00001 diff --git a/MumbleServer/__pycache__/NetAddress.cpython-312.pyc b/MumbleServer/__pycache__/NetAddress.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6999b757149d4629c2ad0df854e1a4cc18c5db68 GIT binary patch literal 445 zcmYjM!AiqG5Zz6iwxre%DC8uly%;KZ2_gtydax9&2Xk4|?zFaUvT?I1#+zTEzaV~! zmlO|$cqw@DCX`-!aziQU!0fy?k2f>>S*saH#oc~!yj1lkBb(6I052Q`UJ*qUGvr|h z;|yy|b2JTsHZE-pd8GwfR7xf9Y|uwxjU1ioL+q4dtx@{TS`D05UEk-@l_Tzl?dQ5} zUq)V!!8M2p2-|LhJf~DZ7`~&lPPRpoYeY86sX@pfl92#HM7A*1TYc!n=`MxA$X62| zBk=o>mWd?2Sc1s@su*z@QuKNQ}dmvZyNOKSI}fz5oCK literal 0 HcmV?d00001 diff --git a/MumbleServer/__pycache__/PermissionBan.cpython-312.pyc b/MumbleServer/__pycache__/PermissionBan.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c7b3529b886988329731aaf53b346ea464c1582f GIT binary patch literal 310 zcmY+9u};H442JDX($ch%U}ET4gp`H60AfHaAV8JavK*mjLg12%oCMJgo}$mdv#>CS zk%=u*#nOq35Ca~p@3;K_mfwQF2V2+s?)@18eD>n6#4q4_&%z26DAbT+jM%f#A{NSt zoe?NE#n@en(EI8wA-3bBC`_HynJKEv3_w5|%!%`?s_f`EDMGLHrMzwGhDl0xtgZD< z7c^h8+w)M$L~AKuVckb=&Z9e%Q611s;5N_}V5ET>@M3Ly+EG9b`!>-pF+lX{<3eLb;XsAs| zmCjN`lZv$v4SzBE{?R-%^FA5{V0C@y-5(*qS8x90`~t2IEWCmQi3&6(h&?;XNgU}W z?lwp-!^B%Uk-zF&B5ZfkqA+z@=ccG;E6*m|@tj!aRb^A>MNJ&}Z6L&LQ#VXPu-n)8 z7Ymv%+3$HMM5>e!Z?Lu&HnaH7Xo@p3oKbv6)kAH{xRIrxr;<3=RMe>wObf%3IKFK3 zjiM{!M{EA=J}#G=trKlzqv(`FJKo+7)zpU0Ma1s_aQX>hH-NqU=W*u@(Cc;~oO}e6 Jmm&8r`vC^2RgC}u literal 0 HcmV?d00001 diff --git a/MumbleServer/__pycache__/PermissionKick.cpython-312.pyc b/MumbleServer/__pycache__/PermissionKick.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..bb92e95f4ed9e78941c7d8b46f74bf9264404cba GIT binary patch literal 312 zcmY+9Jx;?w5QS&fc0!yVAsU)=K}c@!1rQYtLPnA3+$<(L7?WMEwYCxN;1rx8XQ81s zB^8~eh$aRS039ua}d9JIZ%5+{{WdI26Y)M9CWobv3*=iklt+!0Rd za5r_gfqOZo-olCfl^uz(+sVpOHCa=rvc6h98?zfvNXw$Gjdf9!^V6A$kcj;*VC=qa zT1|{;*Cze*DNPpIw|vN0CIn+|ur?AlH_1#%N^(*ue)Z@)djo-$Ikx zlvL>~MKr0n6QX0PnbE9vcRog=01WPry{9____E>;&M(2uks)uufujJ4DWc_$a8if6 zsk;l@%Q5wqPVBGkNQ~WHR+g&CnnIQJ_4?eH-FQk`7Ikf`Nw%Pixrva7{Vrhav29vS zjA_><{i_*Gm)f^{$XF%>WACsr61KO=TuDlDQaY#PlIlgHs-)!=qnCq+0C& literal 0 HcmV?d00001 diff --git a/MumbleServer/__pycache__/PermissionMakeTempChannel.cpython-312.pyc b/MumbleServer/__pycache__/PermissionMakeTempChannel.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..059a4ddac3c5ee87de22536fe91bb2c1500033f7 GIT binary patch literal 335 zcmZ`#yH3ME5Zpc632_pMHU$L&5xK!XfM}qh2#N#+a&ws6;+Wj|tg{{AlCR(!_!gSf zrlg{?6w##OEJVpvv#Xie$NPBfgT?)c`?N-Y&#w3b`z5$Nw&WEA2$Y~OLhLw`EMmfm zoB;?o!N{#y;C*$L0GnZ)Wx9;ZRAZt~-QJnfqLOrOhIWws2Nd1yt%Hc)KH$*@jM^R?9ByFJ TvL3qaK8&UtfBMol11tOiPCi|b literal 0 HcmV?d00001 diff --git a/MumbleServer/__pycache__/PermissionMove.cpython-312.pyc b/MumbleServer/__pycache__/PermissionMove.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..978dfc6a23c5afd20c4fe5ffa0f404c0989407a0 GIT binary patch literal 312 zcmY+AJ5Iwu5Qb;`NWeG|LX;_xf{@(c3m_^Qil9hzZWfarjA7Snt?dYR&~kyCfwRz1 zo02M>rHCdKyFwKF#pwG-^U%!uXcU0a&58H$iU42M{K@$R+#DNN0SAr(BqoTK9pNMn zcN2FPxR+t#wNB)(ZA*mRURo5YPU~D1)z$jQB)jpPw9Ko@q-JVKk>3T3-8FTii81Zk z68~~R^H%$ohm55{F!lx;V_`ds@0FxDBc(HnFQ|H~RT($DWb{;$&LtIfDww8)(wuZW zYviq?+noE_aU5o L1e2Gcwh#LO$6Hl5 literal 0 HcmV?d00001 diff --git a/MumbleServer/__pycache__/PermissionMuteDeafen.cpython-312.pyc b/MumbleServer/__pycache__/PermissionMuteDeafen.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f40b4e22f8dd5163e239d3fd5b55e9bdd77ce8de GIT binary patch literal 325 zcmZvYu};H442JDX(n3h34jm9kV+5SI9BOgrNox6{>2=HaaU$I}n-I;+m5Fk)OjxnNTCRxmc z6FY|>+!SNCWudpVBO!K2Nl~aesWVknH`}o>yUBudo>i5x=1omAO4d|_UgvYZZt6x8 z=i0H2-t~$Wt@bPrIZveI{2g{i!hRV&sGOpdlujv{QT0@-GHOK0>7^u{A>tTDL`dE?j1z@_5n{nA?OEie6oQ_&j#rB OV+f`jfBHJqHoYH+yjlDJ literal 0 HcmV?d00001 diff --git a/MumbleServer/__pycache__/PermissionRegister.cpython-312.pyc b/MumbleServer/__pycache__/PermissionRegister.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..59eb8ee9ecb8c446c99f3706405bfeba4241d8c3 GIT binary patch literal 321 zcmZXQzfQwI494yJX=&O@r~?y2B@j{;@&bs7g#lDx%W|YW69Si9NrZlSzap<>!5O=kynS@~1 zdRzZ|MT>^Lo`*stN(u1>n||;1D!SJ>MJZ`cDLSL-(daU&Whv;nB+hawOriwSO0y)6 zF6w-#=!W>oivRJ)WwYHm$+fH%o$}Zw*bhL}U)#Be_#FTqe88j|z~25EW}P!YuiJ&m Md>zbRhCH%^KeBIFJpcdz literal 0 HcmV?d00001 diff --git a/MumbleServer/__pycache__/PermissionRegisterSelf.cpython-312.pyc b/MumbleServer/__pycache__/PermissionRegisterSelf.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9046b1e156e687e9fefe41c93bdedd600b45a598 GIT binary patch literal 329 zcmZvYJ5Iwu5Qb;`$iqn_suWa6SV(U01rQYt1t=n-akH50#2D6IYiuK2athACS<<97 zB^8~eh$a_+^^meU^|KPTvu_G>b$&80Y=cy7sOdwmL_#WNm^FKOH%8=Z9O5@byYJ7 z!M5?Y?&XRW4Ldy#g@~0B;vIH<@BMA~pfd^+(wtCuLFH4Wi?Ei3pqGL;%_y&8C74#4 zC2@FFXZMPh#Lq_jzrtzJ>_=yrmbIdDo|q}-6HxY7cQzt^dw|CuFzp6#c(jFiXARKl P4q)nUJ^yvcV^jD8{X|=R literal 0 HcmV?d00001 diff --git a/MumbleServer/__pycache__/PermissionSpeak.cpython-312.pyc b/MumbleServer/__pycache__/PermissionSpeak.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..171824eae98dcdeb877106444221e59332ef1f0b GIT binary patch literal 314 zcmZ9IJ5Iwu5Qb;`NP=+`Bxq9wAz4WH0*H!+f+$itH;c&*#$?xPt!;!mI0a|mEHu=n zq)KNgqDjTB5DkAZ`u@>8H1j?l2Vit_;ys)qz?U_Da()4~#|B=314jW86GY37a1w{R ziMt2f%P{d;C-OJ8CBkk$Eechqb*_qPz8RThH(8LDc~zOzvZQn!`CY)+T~jxj7}Kt; z@vm02Xti&7$XF@_V{foE7IyRaUP+2GQaYpflB#vB%DCYrqoSsX9z9QbXMkRR0O9l_ Kn7$0Pec2BKlU0BK literal 0 HcmV?d00001 diff --git a/MumbleServer/__pycache__/PermissionTextMessage.cpython-312.pyc b/MumbleServer/__pycache__/PermissionTextMessage.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..618988d3506445d2e1b6f7938228b158abd39b77 GIT binary patch literal 327 zcmZutyH3ME5Zv`6Ax*i5GZSlpd@PuB?W*^56ozXW$Dmb?K6jsgly5PR+jCvmu& zxFg_RhKbiWk^j|OB5cQLSxS?dT$cJK2bxxufP-#-Z6s@G< zq~dv9+zYxT^Hupc5K3vPQ1rg1o*Pz56&;a&9Ncxz=5Lxi7BGxj&M?k zyQ#Yi+{-cbIw$hi))HaAmzAYzvZhdFeZ2;g+)oqIvZ!k_x?L1?MLP2PfU$?RX*DsX zU1RP2%Q+>T_AMVXmI=Yw5;it=o5TwxDb7jhoZ<_rpBh!gEw328n7Bex*<^xgnk&so z$5*Yq7j#4V*@%Dbr&YJzIg^UFg3fhl3e1*J+gk@05x)b#qfZEj5gZ(@U^+M>^oD&1 MXRBcLHrDoUKXQ*)2LJ#7 literal 0 HcmV?d00001 diff --git a/MumbleServer/__pycache__/PermissionWrite.cpython-312.pyc b/MumbleServer/__pycache__/PermissionWrite.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2bcd72876d8de0aff47cd8dd544da795133e9c90 GIT binary patch literal 314 zcmZ9IzfQwI494yJX(6O460Dtykg|{$KujzQRFxQzvK*mj(!eDbISHa0JO$6dv#>CS zk*Qmxilq~GLM(W&exGH3w){RC1z_Ul*t=gMz?T(&;rs$_jtsnl1c?d?Ob{(Q%1IpQ zChjgsFT=!JIg!7%BN29cX<6zfZE{`Kv$ZjXZagP0^13#qYt9>r{4NmUu5DT-A=tG& z{>6gkEA}l9g-DeW;te)N!gdxfbwP1Pnlp;eseWj56}Pey^i&b&1(i*z1k*yZB#tlJ z;#ScW@uLy{cAr$M?apbTWvl3nLt}4GtfwaRE+T#hfYVP1`vDvrK9756fL^~3;p8Kj JybRgC><3+YRpbBw literal 0 HcmV?d00001 diff --git a/MumbleServer/__pycache__/ReadOnlyModeException.cpython-312.pyc b/MumbleServer/__pycache__/ReadOnlyModeException.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..59db7dfa25f4288b6c641f68771d61e4f3625959 GIT binary patch literal 1229 zcma)5OHUL*5bmCx*_nO7;xigGjv|JQ!rqA42qz611r#{VrFYma*ui-$J+s2b6AAwT zet-uJKgG+Mm`KK$m>3S;maJYlSv|vJB^>Nbs=uzT{_3lm?oR^)d4i*MUtOgtAwT8f zc<3phz4r*V2`8Mo#G@9a5-YA^DL7}`jHg;^;!_c8mX=`6&3d|}Qv$j|rU}n(5w3%} zn@L%BkFr>XLO@x)c(m-BxB&*wfyQ&YTI#m)7+XMZ9`eULm`mq{6~!vHm2&Zy3@p>Q zVEcX$*^v|Y;ViC83n1Qtc)C%CrgWm~Hk)aAOD?24>`VZQFeJzA$gaC~7}ooA5t=S& z?=pgI0>q-6U@xeZ;fkfUGi5ctG7mPN^WFALz~LmVeGSj%O&p62Cp7Vk8X{Qt&GiQO zh`|gKoo2(v-6%ArfF(Nw)A3D#jAH>(njUhRw$JgH9Rb#5wu2V#ueBhIfJ>rT`_b~_qRawldsh#*YRm>da8g@L)?I(0B5f#V|i3iu!}5l0TBhT|qC>XP=D z%OdcOj-77TYSn6gkE_*ln^LQ#vJOZ7D}1)B#Rg-(?EzzPo-yo3%aypu*jmeWk9Ks% zcu+^T&afKh@Qr4e{gS%E;TK;;R9Z=#@CY4Ik5jV1`k13$7|CZHY&4x-Xu zLgm~F#+z+nAa!B}5roogkpnfW8QmdLn%JBcL&pIkCs7GaoJ*ud?Iy${|6a#)^Wdc% zkQFbtqL#plg?vk~_Ph?S+VRbPo#SV&v%t4agnUME;p9?7D6-NmrN<=>%Z`6~RmCOg z)kDBn6bWo1vt1WcO5JHK7Z4p9kJI)~i5s|-FC%QC>1HUUfAWM5eSfT;m5%OJQl9#teI1?rJUY3jKG;*Q@2S~6br@~0pp}gd895jv d)aV$ucHVU!zWzeye-!R^?!D;bUvBD&qQ9p!V(9f?u2NV>KkciR`WichG2EO?>`a(d^+iyKN}0?Qs%p*)fC#$iiW)LE4e4W58LCVibRp;Wt!XuJu05OV zg3~!&F0}7>$ay9u=Wnoft(%MFL6wx`q;yWn2{lhf)k!OAPA@g-qO_fvt LIC~xHkv;qY{nu7q literal 0 HcmV?d00001 diff --git a/MumbleServer/__pycache__/Server.cpython-312.pyc b/MumbleServer/__pycache__/Server.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e7153c8a3fff906f1301973e5f12835c9e19fd51 GIT binary patch literal 149024 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 DMq_Aa literal 0 HcmV?d00001 diff --git a/MumbleServer/__pycache__/ServerAuthenticator.cpython-312.pyc b/MumbleServer/__pycache__/ServerAuthenticator.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..161a9c8eb4977e10640445f32f58c6161f2400a5 GIT binary patch literal 23276 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 b)}^ht-RWna$@A}(tKDl4yX8mgW~S&b^W1S- literal 0 HcmV?d00001 diff --git a/MumbleServer/__pycache__/ServerCallback.cpython-312.pyc b/MumbleServer/__pycache__/ServerCallback.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d6f870bf355474b7f8e1623f76eaeb2a2c31b6a0 GIT binary patch literal 20457 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 JzOSNM%pV}6cl`hW literal 0 HcmV?d00001 diff --git a/MumbleServer/__pycache__/ServerContextCallback.cpython-312.pyc b/MumbleServer/__pycache__/ServerContextCallback.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..47071a75c2cb3c425ba7b178a21352e4621c75f9 GIT binary patch literal 7617 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 BsK@{S literal 0 HcmV?d00001 diff --git a/MumbleServer/__pycache__/ServerContextCallback_forward.cpython-312.pyc b/MumbleServer/__pycache__/ServerContextCallback_forward.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..843c79b315d9ca0c048aaa72d00105dbfc8cbc38 GIT binary patch literal 437 zcmZuuKTpCy6u&D4Oo2~fG&D`@ghL|?;^LqoacfM@(t99q?KO|97B@eIUqRzXalts4 z)P=;!&4jox*$Xi;@Eh*^-o1anyZ6#)Sfs$!zB#T?LO!+ghtitR<#9nC2q&Bh5>cO0 z%?)ArhC#p>SN;nAEiXM6-86iYn?vfCXNFz=(ib+(Ye5`K6{wMnr{{Njo_Cf;eE}DM zH-MhEwp|%3$W%8Fq925lyva7R*w&;TW=z?Y++u8ysuY1S)UU|Pry=xad7VQj0)!sQ zY=)+eR2eHKF!n^2THWf>y_ONULy$NG_XMUBB@;L034<&F97PbTKrn<*A_sIgMY&r= zv4On{#br_s=(5TJ3A?%3vYP$z3-mi``-C|u2v1it-Ye`97_oO5W&>6 z0^so>2M35EihUGd8)JbbU$P~B%Dx;Zwvuy-uLdQ%gb|b^w27#?k7x;$Be|$_G^uQB z5&~)G(j=TYs0JF@X&oww(hVrxy?^U8kSF+8%R5yQ$#5&GQCk&(1Nxdjc zT0E}4NPunZx)2MB6J_e8j_W%~;?A^0xCrq0DhCG$kc}zgqhVX7lCAXRx{}qlfW4Wi z_V$Beace~>BssbxEJuQWz75uv@3~;PQ4o7RFsln8Fee3SrQ2R&!Bm%ZF3Re#D42Zq z_qyF~HlOx_mp&8{n#~JR+U?c6@7cnC5?ggO(+LTk00_wpLV}3)e1R*3yzV*vHV%6u)!q*h$)^e02Z>MirG(waHi%p|Svlp%qfg;^pl6UQ!o-gtG$;Tc!RF zWn^Fg^-p055)zdW5)$gbmMXAxfp>O4qN)Q=*1O+(e&6@*)A)FqAlWnO=3#-5pHes> zJqL979>Ff*gj1gc)S^^k#aAo^&w^hFR7=ftDq_vjGOYQtru%iUnzhx`vaXTTCPDRC!pT;GXfccd;tbAb-8 zBG@HBEXoPaf?5TxSZc3OQ`4zD-ebq}y8=%0zWG}=k=8c6*u*c{5Yg+<^jfBE=MMEa zaYSOasMcJ|x0o6XTVHk%hWZrgcX zM>GFtzf#jugR#&FfU&g9SP=29FYy>-FT0L^{6}YuM=q*$hW#*)ewg3C89dv0|TTpq@Rd^4%`)P-lg^yX-# z^}N#4{SvB7DxXVQIlVcEMNz6{?P--m%L~soQe2T*JqCO&iNG;3Tro^33(uRmgy_h) zpI^YDxPhX40dWV}pg<}8Qzmr!8yPzw_r8-S2jtG6NR-NNr9>CrvLV4^SU|-Ym58p+`f8!UoGyd)5wPvZPw_MnZpS}jlOZ~U8O(2`h~3hs7&|oF89kT I+j>^fKbAgSod5s; literal 0 HcmV?d00001 diff --git a/MumbleServer/__pycache__/ServerList.cpython-312.pyc b/MumbleServer/__pycache__/ServerList.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3693a3da9505280f847ae16638e875afc7382831 GIT binary patch literal 488 zcmZuuJx{|h5Ve!EsnU;~qD)9YmqzUvAtaQSz zAO@tcR6-1FNEJ&b97070PO{(KJ>R>t{a7w*NZ84yGHPLj-qK)cxy-@yo^WmvMHDmS zVhiKcmzZQp0%azb(!%5NhJU_HU z$M?n^5wDSh$US9n2>cQ_$)L+8B)qPg<|=2J8M*I_!+Vre|0_&664nZdM#vxvBMyY{ zbebgB?n8H)tgkB8f13_`er0pYmGoeR!ocywJQopoec<^tsS;u{CbZIbnu~=NZR5;$ z!5D(ihhVf|d>;CN5z&CaBmnNX;Dt6L9Qr<|z>U?$#@|iq!E{mBaeW#w*yRf@&YYS3m)hDY4xWjF{0#R7$Ndpstf!U{p0(pV$9={r zoZ?AvNsr|5Ani?fB`^H?622ra@idMH+AsMj?FTv_1t=XzR3w8^kkS>2%4C&PMd@Io zI$0ytP`WZvo2--SC|#8hlJ!zOrK^E%kQyjmlL#dnrAA8ECYqAXQZuFN5-rJAsg=?~ zVn=ePw3E{HK<|=vQMw_qJJ}|+Q91x;e2w zc|bZq>6S!$vP0^ibSu!EQYWQ%0DVw8Na>wGcS&6y&dUvP%C7sIvRiF<=wtmTb$dD0 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 literal 0 HcmV?d00001 diff --git a/MumbleServer/__pycache__/ServerUpdatingAuthenticator_forward.cpython-312.pyc b/MumbleServer/__pycache__/ServerUpdatingAuthenticator_forward.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5310b9ed6e8ca1fb4a99c5d84231b9f7c4cf18a5 GIT binary patch literal 455 zcmaJ;ze~eF6uwK-R?>D9+yx;B4OwFmv|SvOg1BTk)7-N^yyW8RMH@H&3jYRi@&9nC zI0$hmIJpVMrIR^Iu~Wa{z3<(9ckg?5uZ@O93S91)qa8}fmo8Q)EeV|;7vzy}!l@t; z^(ocd5Qc9U1dLH-b>Khq(sOZ}hHrASPyKRc*yV4%VAH%7#IaO?8p?QlcE9g=r)ks^ za1MA2=y}V0k?=wh_m5IFfLIN~KuOG-Y+cJXNV_;;%C6)VV^^t45g0=~QC>a?p_}D( z4xtDTx+o_ZntG?oSRe#rPh_s0E_%*DM&R^8Vjr9ijIWhUoRlXFCJEp$DtrZkA%qe+ zptEkx*DA3fY88mfRl1K@@eU6x_0$vG-bAFS+oVXyfLm(61nV6qkyF z7?*;Rn^0UjnIjbYhWq__yu07=UfOM&ly%XyCLbk!X|XP|B6N9Bk_RG)ppry1pj2~1 z8i8RDFedf&z&{G}nN}*Wgf*f;EjQfSx3*kbG{ZPnX_$^xJUzSH_WfQKT}n6yyaDw6 z3X2Zkw0Y(BamG`(Uf7%uvou5C9Cgm3b~=E5UbF-ZWQfp5HOtY`od)Njl$<}2rG9_a zV^=ByHUfnsV23chPF2D(k#LwLfa3__G?W}+pils^%@nLk!G{WOLlj<;ueSCgB{B*7 y*eY+=zn;3~@ncd-e{Di{K1plgc#lW#j`!+#b9VgZoXkmQ(d^Fc-TMaW1^fX)!fqx2 literal 0 HcmV?d00001 diff --git a/MumbleServer/__pycache__/TextMessage.cpython-312.pyc b/MumbleServer/__pycache__/TextMessage.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5659352fc7bca8f3297d07cd5e96d1d2128e2afb GIT binary patch literal 1785 zcmah}-EZ7P5MTRzKKt&{OB$4rq%x9N#j}==nFxG68vOx(A0ArwC=I zFN;f~&lBX6Qmstmo>=fsz5U;^@w3LpDcS^4!>;VslPPN>&hr+~RH+ zL@S6V>7Cf$@L(0#=fLQ4z&~^&PC2S{$KsalSy6-_Uw6TCP#9VJ`0f&2yuGye!Sc#2 z+)&?(>vdpu?+NLW%YbymQP?LyOvxdpd=CjWa~QM&`S0WdDLZAVP7Vr=as%OibXuy* zpQzJQoho!r!7Mr&TG0h+73WGxX$>CmI}k-y1FS#LSJA-nuEBBJ@Uwkm1Nb&TV8juy zXg)oW9pjw28!?9{g_j2-g%REs1R6ENL$>a_0skab2oI}$-JyVzI0%nD}!C!1JHHDTQtIC`lqK~~L(I2**bwh0DC z#xaD*KwBJfkIo?iSHff59lO2ixwf$3H(d{y(SQJ$C1^?+8C0E7XQ6Lohw%Zi&5iZ- zT5Y&qYqg;yudiqRu_h}H)UDX#v~JlvWUYt#AWwv>gdbKGVujM7e+>_e;4V8QrZJqp zB}X`u7w=a$Lm#RQ2w4NFHzE3zhs|p2G$}l20&{)j+43j@J7f;9>Tvkgq3GwEEhai$ zI*p?cy@S)2GsgGIlj&JOG<nYJGr6AE$0klBB;B=Hj*iGRAnZ5Eg{B(BV$FmC^>ri+Znls!;K-l W@@M{TpN~*=T;3X4wY#D$Yu7&zxOLwE literal 0 HcmV?d00001 diff --git a/MumbleServer/__pycache__/Tree.cpython-312.pyc b/MumbleServer/__pycache__/Tree.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8ca982a6cc5fd19460e134494dcdfe399b015082 GIT binary patch literal 2141 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 literal 0 HcmV?d00001 diff --git a/MumbleServer/__pycache__/UserInfo.cpython-312.pyc b/MumbleServer/__pycache__/UserInfo.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a893e0d74832d65e38891f7c3f2f95ba38338aba GIT binary patch literal 1262 zcmZ`&O-~a+7@pnkw%gqTg;FTrD+ZIwN27@sVoZ!65U?RZFMHXpoq;ayN1ffGaKgyJ z#2!peD&>N(9;pDtqYMNNz!?Vx(%!nGt0p;Lqr<}74$8pi?WEnef7mzyBw zxll12$Mp^0bRDnAd|}n8+2!t&SlPh1)&j#*M3BZ|#EQmgG0bZMj%gwmv^W;E1deMG zPH0IiY4Tw*FNe}AkI)Tg*FE|utIUe7PrQgNf<+AUmldM!SZ0~1W!J8n7NP1MaR@bh zf>pm_dMaUIsb$OXJaw14_U&#^VHb;DEtQs+U)1c^7TF>6fY9aT&gG@jQgjpLSq4qW zrx`J5ZxgE16anH4ig_iJblov*qU)io>$Zz)7Vwm=zpWY8?Mgz|v0G+xlwpx=50h}+ zs%@B7r~rND+BR|g_KtPKtAr_#w^<7BT#Cbf@U{%ke_Hm<0}>8`zq#^!!@teQ`-WO9 zBy_V@sJJ#M>=Bplk-`e`-uP~{P{UQ7ysr{!!Zn7aQ&MK<5?bi4LIF;N4lGpY5Z%38OpFF?1R)R$K}_Q{u{p#-MNo){U&uA4Js0-A z%L`s0V;2^2jHK!3ShPypTY+=_Sz&zok&V7E^QqpvhKG9dzTQmcx00Q`WIs&s?2C@` ZCGEYR$lcVkmay8>$ZS$+T$Zp(Qa_5=msbD) literal 0 HcmV?d00001 diff --git a/MumbleServer/__pycache__/UserList.cpython-312.pyc b/MumbleServer/__pycache__/UserList.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..cfed1ae7217191407280f9887b9e35e3a44bb493 GIT binary patch literal 466 zcmZWmJxc>Y5Z%4IJW%5J41`px9iqp4myfcpq_ZPmG|6>xfz$RKWNjx$R;j^g+IL_DCp_J2ZksA!aOi_%UiQVx`I zbwpm+Z9{92&(Eqgl^8cvdyYZJkL2>p6rwipq9RR7y&#YZ>QP40(RhcP$03j|#Jme+ z8le+R3P_in+w~jIX ru@GK-N0m>sHnhq8`kPH&Y?7_)J#A$z_G&|hYQyqUX4P*^UXfG3hhT(5 literal 0 HcmV?d00001 diff --git a/MumbleServer/__pycache__/UserMap.cpython-312.pyc b/MumbleServer/__pycache__/UserMap.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9223405748d3e36cf74813dc4fd9d797e9de41e2 GIT binary patch literal 504 zcmZWmJ4*vW5Z=999_E1xLLjY1NRx{;!XXwC1cgXI(j39{%ubTid$G4C#?D`%e?j~s zg3Sesz}W=E!cGV_soXUNA`a}#eBUtN%Z3YijWkX5u#p)kmGp&n3%o`ep>uA-39u_*q!kFqZ;HCUNb9=f8>at&;^O}XQ6Rjs6lV$P zhCF0I2up}@aq_SO%|X1ns8y9xOl}yjQ0Q7N)UA$O$7F*zML4ls&g3J-X+lif7FtPx zCgPy!f!6mN(0bsp9%yw4F1hDxA@vDd`@k#*TyENgLC0ehn6@}r`@KWeA51g5jz>cq z_SmwJ6<>q`UAWH##`r6X@cJvtzoYGOsdir;m1@IME!sMI+K-y8QL{a4wxd(_QVJqe P9OpKoZ230L3ZnfRA?S>r literal 0 HcmV?d00001 diff --git a/MumbleServer/__pycache__/WriteOnlyException.cpython-312.pyc b/MumbleServer/__pycache__/WriteOnlyException.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..10b3a6ccec626b69bad673f6c2fe7eb4148919e7 GIT binary patch literal 1175 zcmah|J#Q015ZyiB`ObENA)pk1lp_%lE{KaX$RH{ppg;ftLb_&sxt-WY?!)Y@NlX_h z|ACYgG$=oUA3$RyB%(t|NGJuJBSVvl*}Ei|q+n#tzI{91c{4ZraeTZ?(3-RQiw^}t zeyGi%nK_`tcL?4PPB;xnNF7QQ)&kAZa4iIdPTS2xA<->b0m&q$F%^B-ywXvTn zutw908%42nr5{Jh67H){K)eERd)FLCC;Y)ZJ1-+x3ulLF}+S9h5*!Yue5wAt|S{ov} z7k6zpSw#-)BvWe3*yeuX1#yB@9D;27Q40fHX(#Qt8*qDB#d-qdTy}5fmSPD>hOR2h zP@WX*CxP#Q?Zsio4?x&0h(Nd!I9`f!;IK9JQPK8_h{J=w{XK3r8;#MJfbc_zq#G~+UMx6>`l$H&N$qo;p0M!V%$-7zD7Q)W^rB%6 zPLt~V#)3F~7$8atRneuTOqc9+Af5hqwoWF&@fugPu5@KrV68&EiqyF0!J}S!aa7^l zvB4C&N~j)0S~>bskcgt9mF~34Va1Q&Xzs*W#hMA=dyoR#$J`*mluC47$QeZY){VUJ zH^l|qsu@o@=mrH!>F+Y3GhfNrF1hxN+}$OY21TM(erY8-zcn=^xC{$O3=}b#B(vAw zKKpXH@#%77N58V8Pwwc&9eoDo!?sQ*A_pM``;^5{Y$s|uxWf8qDO+gn;%l&n?)dk|jnT(l?<76@! zCwZ8Y*SzJ=$aDUKI;WoUl((GB$;&+D-dojM(IoRWoIYPZ^}F|Xe@oxrQvLUeic*dK zHaZGl{_TRM{evG;f5$xd@okZ&{h)=lZ~!%>ffissMjU{EZ~-1u1yCSdh=r;U3WbY^ zi=asOI38C)2nq+WSd~DDa50vuGAI)+!E#j&<-(=J6;L5uhLx%kDuv65tDs7_0#B%F zs1~lold1-4gsZSt)j^%`39MK3P%m7K4XObegim6lYJ^7N8f;Qc&?H<-+zidab=aa> zphdWz_!OKHZopR625rKPcv_u-Gr~=HR-J=$!p(SIwL`mb3tmti&>?&ZJ5?ui3bzt> zL6>kFcB^ja7CudU5iSa!!At5AToOJ@d>JkapTi#213kj$iF=_}xE=dcAM^=dAie@u zggdZb^+UgKC-GIdD%^$F)HS#!+)aEPt_xqp0W|;v!k36|zzyNcIH(3;P`HQqCfpS6 z#arqY+!F31z74m9ui%gxf+694;$avTzKVC$2#g3{!@KG(+!ek~d=Ksk58$X8g;C)f z#A7ffJc#3J0w#oS;-s2_DdAf4?PA)HmSFe^MvJO^{acW_=Uz=H4y zE~-UX6uyf~Y6+Hv@8LuB5FQGT;<8$XW#KVgQ7f<_JdUes6;_2Oa80ejn(!n(Qjg$~ z@D#4Abyydk#>eV0JQlu>Pt+55B0Phj06_QwK2=ZQsqid5Q_tX;@Ekr@&*8c7Jibsb z;Dzu4aR@@fi@2dSU_*Ebb)|zY{E&DPHiegQOKriH@CtDl!osU)sBPF5Uc-orKt%Wv z@eb?=uVYk2Au9Zs_$9m)euBFS0fhmTQlNyN62~AW{0!qN0SV#f_)5KkSHdrdO)!N+ zm{dtf3U3fwUEyo0}1pTpFd?CDxzg1ttm%@ne)q8j^tcbsYuY_axL4AM^ z!g1oS;cMXp{!V=Z-w40L->YxoTVWIbpuU6egp>GDeT0v~7V-D+eL#z7;k~~E;E!+i zyI=n^Kzng_z%CdapQC>@q4_%1t?Pw%rtQ?QWEaSk+bh^STap#-*R^}C~B@L4vgA-#b7EQ_F z@p%Smv}oFl?;HKAL2cAW0KaSprYjEg7Bh#5JvlYd-?JS7gzv5b1f*fI?( zyE}*GIG>*{2JZzwCq|B+#7NEWijhpxcbpw0|NQzLbE2%$+SxOW{~yKgC{b#?IpL+1 z9ilz&7nI{A^^51?k;#~4zM)KQ%&n8MxV=4OOQ(L}ykY57J;?u;%mc!5##9>9b5-`U z>*Cu7eGd8B^umkD*VUYb?OUa6OD*8K1tV!iW05&JkaH5~LhkVLx=F*njdH=TM#Eu~ z5<#pLONObUk`?X=Qk5y7S(e?eGE+1g-P)zusmqkiMPs{}jWo+JukRWeLsO;(8&(aK z$QZL4n2+!CE?b-BzQ;$AzHRWXr>Xycokb^YL)b((rvzdEMlzII(Ob z4T}?A4xbpGy~oohQi)4$D%Q9UqkGnl5wrNTj>|mcDRwLPwwwHZ(u+FRHWrUtMmT$Y z`o@vhO(ImfrmV$Oom=8|>1=KSA9Bg=P3pk*jv1PmM$g|n$vuM`*|$R<uu46tsmx{fZ z$-7mR6QF zmeVX}SkAJXV>!>#&O$#TX=VpYCrcMgH_JtqODvaJdRTf{`dF^8^s`)LxyEvxWq{=d z%OJ~5mRl^hS%z4KS?;imu-s+2$1=(?#xl+_!7|A*#WKxupJj&S0n04Q9Lqe*0?Q)H z63auDWtJ6|RhBiDM=a|sk6E6u0LxRBXDrWIUa*8%Hdu6)O_nW|FpI&m%@SeRVTrQ5 zWZ7jw7R3@{iL)eFUa^=gNfwJ`k7b`^q5DsnG_r&A&d5pY%O^YNz57XG*_FAkdy;5& zRaT*dI4bk#Ey=xxix;P%UFwz4nvj&VOK9tMU%h^AcG@NB*CI(&yF#8*7beMD`?&k^ zBl&9=$@`9^u^seYaeje(wu5y4l&Lr>vF+OIOJis|Zobydu%x?t0ZkWi^4rDfG4nF8 zgWkQ+w;t@$%$4pJSR1x?Qstab>2VyjaBS}cO=Ap-Rhn~zVkorebjohOWk_% zZRD;!`@Cz)dlaSv^8&TKi%hyOcfs00?^w&MT)Q}RjL90d%jM)sea%O$XuB-y0Fvcx z%Rwfc=Y?(uy<^6=;_YB4L>He>=&#z3J-M150Mqk8;n-QaL!bt8~@kHNVI1w@q z=;9hxbXn9fWExv>Gi;cB**`M%g+kF-)Cz@q6K{Sh9#--29vUO&pD8Z?HkI5Z{Z~OC z5cp5I7N~Qyc1OGHXtgQ0?P$Y}c1jA#bX`7I9qo#vU39cAadWMW@<`=3QznW-)gL(8 zh@&k?oH<9k=V(i*64&Y~wL(@`Z#deNqqR9&ue4k5XibjR;b`5CHtJ~osd8%QzN1lR zs2kK4^@mF6LroA<5HeA4GEt%1XP2oKMQ(PqRvFHqqb-ULl~ctYN1K$#AxB%0>eMT@ ylN4ma(WV_O1^dX>rx;-b8+kdJx_V43+fwE)og60o2>Hh_Z`1VQw literal 0 HcmV?d00001 diff --git a/MumbleServer_ice.py b/MumbleServer_ice.py new file mode 100644 index 0000000..df900a4 --- /dev/null +++ b/MumbleServer_ice.py @@ -0,0 +1,6804 @@ +# -*- coding: utf-8 -*- +# +# Copyright (c) ZeroC, Inc. All rights reserved. +# +# +# Ice version 3.7.10 +# +# +# +# Generated from file `MumbleServer.ice' +# +# Warning: do not edit this file. +# +# +# + +from sys import version_info as _version_info_ +import Ice, IcePy +import Ice.SliceChecksumDict_ice + +# Included module Ice +_M_Ice = Ice.openModule('Ice') + +# Start of module MumbleServer +_M_MumbleServer = Ice.openModule('MumbleServer') +__name__ = 'MumbleServer' + +if '_t_NetAddress' not in _M_MumbleServer.__dict__: + _M_MumbleServer._t_NetAddress = IcePy.defineSequence('::MumbleServer::NetAddress', ('python:seq:tuple',), IcePy._t_byte) + +if 'User' not in _M_MumbleServer.__dict__: + _M_MumbleServer.User = Ice.createTempClass() + class User(object): + """ + A connected user. + Members: + session -- Session ID. This identifies the connection to the server. + userid -- User ID. -1 if the user is anonymous. + mute -- Is user muted by the server? + deaf -- Is user deafened by the server? If true, this implies mute. + suppress -- Is the user suppressed by the server? This means the user is not muted, but does not have speech privileges in the current channel. + prioritySpeaker -- Is the user a priority speaker? + selfMute -- Is the user self-muted? + selfDeaf -- Is the user self-deafened? If true, this implies mute. + recording -- Is the User recording? (This flag is read-only and cannot be changed using setState().) + channel -- Channel ID the user is in. Matches Channel.id. + name -- The name of the user. + onlinesecs -- Seconds user has been online. + bytespersec -- Average transmission rate in bytes per second over the last few seconds. + version -- Legacy client version. + version2 -- New client version. (See https://github.com/mumble-voip/mumble/issues/5827) + release -- Client release. For official releases, this equals the version. For snapshots and git compiles, this will be something else. + os -- Client OS. + osversion -- Client OS Version. + identity -- Plugin Identity. This will be the user's unique ID inside the current game. + context -- Base64-encoded Plugin context. This is a binary blob identifying the game and team the user is on. + The used Base64 alphabet is the one specified in RFC 2045. + Before Mumble 1.3.0, this string was not Base64-encoded. This could cause problems for some Ice + implementations, such as the .NET implementation. + If you need the exact string that is used by Mumble, you can get it by Base64-decoding this string. + If you simply need to detect whether two users are in the same game world, string comparisons will + continue to work as before. + comment -- User comment. Shown as tooltip for this user. + address -- Client address. + tcponly -- TCP only. True until UDP connectivity is established. + idlesecs -- Idle time. This is how many seconds it is since the user last spoke. Other activity is not counted. + udpPing -- UDP Ping Average. This is the average ping for the user via UDP over the duration of the connection. + tcpPing -- TCP Ping Average. This is the average ping for the user via TCP over the duration of the connection. + """ + def __init__(self, session=0, userid=0, mute=False, deaf=False, suppress=False, prioritySpeaker=False, selfMute=False, selfDeaf=False, recording=False, channel=0, name='', onlinesecs=0, bytespersec=0, version=0, version2=0, release='', os='', osversion='', identity='', context='', comment='', address=None, tcponly=False, idlesecs=0, udpPing=0.0, tcpPing=0.0): + self.session = session + self.userid = userid + self.mute = mute + self.deaf = deaf + self.suppress = suppress + self.prioritySpeaker = prioritySpeaker + self.selfMute = selfMute + self.selfDeaf = selfDeaf + self.recording = recording + self.channel = channel + self.name = name + self.onlinesecs = onlinesecs + self.bytespersec = bytespersec + self.version = version + self.version2 = version2 + self.release = release + self.os = os + self.osversion = osversion + self.identity = identity + self.context = context + self.comment = comment + self.address = address + self.tcponly = tcponly + self.idlesecs = idlesecs + self.udpPing = udpPing + self.tcpPing = tcpPing + + def __eq__(self, other): + if other is None: + return False + elif not isinstance(other, _M_MumbleServer.User): + return NotImplemented + else: + if self.session != other.session: + return False + if self.userid != other.userid: + return False + if self.mute != other.mute: + return False + if self.deaf != other.deaf: + return False + if self.suppress != other.suppress: + return False + if self.prioritySpeaker != other.prioritySpeaker: + return False + if self.selfMute != other.selfMute: + return False + if self.selfDeaf != other.selfDeaf: + return False + if self.recording != other.recording: + return False + if self.channel != other.channel: + return False + if self.name != other.name: + return False + if self.onlinesecs != other.onlinesecs: + return False + if self.bytespersec != other.bytespersec: + return False + if self.version != other.version: + return False + if self.version2 != other.version2: + return False + if self.release != other.release: + return False + if self.os != other.os: + return False + if self.osversion != other.osversion: + return False + if self.identity != other.identity: + return False + if self.context != other.context: + return False + if self.comment != other.comment: + return False + if self.address != other.address: + return False + if self.tcponly != other.tcponly: + return False + if self.idlesecs != other.idlesecs: + return False + if self.udpPing != other.udpPing: + return False + if self.tcpPing != other.tcpPing: + return False + return True + + def __ne__(self, other): + return not self.__eq__(other) + + def __str__(self): + return IcePy.stringify(self, _M_MumbleServer._t_User) + + __repr__ = __str__ + + _M_MumbleServer._t_User = IcePy.defineStruct('::MumbleServer::User', User, (), ( + ('session', (), IcePy._t_int), + ('userid', (), IcePy._t_int), + ('mute', (), IcePy._t_bool), + ('deaf', (), IcePy._t_bool), + ('suppress', (), IcePy._t_bool), + ('prioritySpeaker', (), IcePy._t_bool), + ('selfMute', (), IcePy._t_bool), + ('selfDeaf', (), IcePy._t_bool), + ('recording', (), IcePy._t_bool), + ('channel', (), IcePy._t_int), + ('name', (), IcePy._t_string), + ('onlinesecs', (), IcePy._t_int), + ('bytespersec', (), IcePy._t_int), + ('version', (), IcePy._t_int), + ('version2', (), IcePy._t_long), + ('release', (), IcePy._t_string), + ('os', (), IcePy._t_string), + ('osversion', (), IcePy._t_string), + ('identity', (), IcePy._t_string), + ('context', (), IcePy._t_string), + ('comment', (), IcePy._t_string), + ('address', (), _M_MumbleServer._t_NetAddress), + ('tcponly', (), IcePy._t_bool), + ('idlesecs', (), IcePy._t_int), + ('udpPing', (), IcePy._t_float), + ('tcpPing', (), IcePy._t_float) + )) + + _M_MumbleServer.User = User + del User + +if '_t_IntList' not in _M_MumbleServer.__dict__: + _M_MumbleServer._t_IntList = IcePy.defineSequence('::MumbleServer::IntList', (), IcePy._t_int) + +if 'TextMessage' not in _M_MumbleServer.__dict__: + _M_MumbleServer.TextMessage = Ice.createTempClass() + class TextMessage(object): + """ + A text message between users. + Members: + sessions -- Sessions (connected users) who were sent this message. + channels -- Channels who were sent this message. + trees -- Trees of channels who were sent this message. + text -- The contents of the message. + """ + def __init__(self, sessions=None, channels=None, trees=None, text=''): + self.sessions = sessions + self.channels = channels + self.trees = trees + self.text = text + + def __hash__(self): + _h = 0 + if self.sessions: + for _i0 in self.sessions: + _h = 5 * _h + Ice.getHash(_i0) + if self.channels: + for _i1 in self.channels: + _h = 5 * _h + Ice.getHash(_i1) + if self.trees: + for _i2 in self.trees: + _h = 5 * _h + Ice.getHash(_i2) + _h = 5 * _h + Ice.getHash(self.text) + return _h % 0x7fffffff + + def __compare(self, other): + if other is None: + return 1 + elif not isinstance(other, _M_MumbleServer.TextMessage): + return NotImplemented + else: + if self.sessions is None or other.sessions is None: + if self.sessions != other.sessions: + return (-1 if self.sessions is None else 1) + else: + if self.sessions < other.sessions: + return -1 + elif self.sessions > other.sessions: + return 1 + if self.channels is None or other.channels is None: + if self.channels != other.channels: + return (-1 if self.channels is None else 1) + else: + if self.channels < other.channels: + return -1 + elif self.channels > other.channels: + return 1 + if self.trees is None or other.trees is None: + if self.trees != other.trees: + return (-1 if self.trees is None else 1) + else: + if self.trees < other.trees: + return -1 + elif self.trees > other.trees: + return 1 + if self.text is None or other.text is None: + if self.text != other.text: + return (-1 if self.text is None else 1) + else: + if self.text < other.text: + return -1 + elif self.text > other.text: + return 1 + return 0 + + def __lt__(self, other): + r = self.__compare(other) + if r is NotImplemented: + return r + else: + return r < 0 + + def __le__(self, other): + r = self.__compare(other) + if r is NotImplemented: + return r + else: + return r <= 0 + + def __gt__(self, other): + r = self.__compare(other) + if r is NotImplemented: + return r + else: + return r > 0 + + def __ge__(self, other): + r = self.__compare(other) + if r is NotImplemented: + return r + else: + return r >= 0 + + def __eq__(self, other): + r = self.__compare(other) + if r is NotImplemented: + return r + else: + return r == 0 + + def __ne__(self, other): + r = self.__compare(other) + if r is NotImplemented: + return r + else: + return r != 0 + + def __str__(self): + return IcePy.stringify(self, _M_MumbleServer._t_TextMessage) + + __repr__ = __str__ + + _M_MumbleServer._t_TextMessage = IcePy.defineStruct('::MumbleServer::TextMessage', TextMessage, (), ( + ('sessions', (), _M_MumbleServer._t_IntList), + ('channels', (), _M_MumbleServer._t_IntList), + ('trees', (), _M_MumbleServer._t_IntList), + ('text', (), IcePy._t_string) + )) + + _M_MumbleServer.TextMessage = TextMessage + del TextMessage + +if 'Channel' not in _M_MumbleServer.__dict__: + _M_MumbleServer.Channel = Ice.createTempClass() + class Channel(object): + """ + A channel. + Members: + id -- Channel ID. This is unique per channel, and the root channel is always id 0. + name -- Name of the channel. There can not be two channels with the same parent that has the same name. + parent -- ID of parent channel, or -1 if this is the root channel. + links -- List of id of linked channels. + description -- Description of channel. Shown as tooltip for this channel. + temporary -- Channel is temporary, and will be removed when the last user leaves it. + position -- Position of the channel which is used in Client for sorting. + """ + def __init__(self, id=0, name='', parent=0, links=None, description='', temporary=False, position=0): + self.id = id + self.name = name + self.parent = parent + self.links = links + self.description = description + self.temporary = temporary + self.position = position + + def __hash__(self): + _h = 0 + _h = 5 * _h + Ice.getHash(self.id) + _h = 5 * _h + Ice.getHash(self.name) + _h = 5 * _h + Ice.getHash(self.parent) + if self.links: + for _i0 in self.links: + _h = 5 * _h + Ice.getHash(_i0) + _h = 5 * _h + Ice.getHash(self.description) + _h = 5 * _h + Ice.getHash(self.temporary) + _h = 5 * _h + Ice.getHash(self.position) + return _h % 0x7fffffff + + def __compare(self, other): + if other is None: + return 1 + elif not isinstance(other, _M_MumbleServer.Channel): + return NotImplemented + else: + if self.id is None or other.id is None: + if self.id != other.id: + return (-1 if self.id is None else 1) + else: + if self.id < other.id: + return -1 + elif self.id > other.id: + return 1 + if self.name is None or other.name is None: + if self.name != other.name: + return (-1 if self.name is None else 1) + else: + if self.name < other.name: + return -1 + elif self.name > other.name: + return 1 + if self.parent is None or other.parent is None: + if self.parent != other.parent: + return (-1 if self.parent is None else 1) + else: + if self.parent < other.parent: + return -1 + elif self.parent > other.parent: + return 1 + if self.links is None or other.links is None: + if self.links != other.links: + return (-1 if self.links is None else 1) + else: + if self.links < other.links: + return -1 + elif self.links > other.links: + return 1 + if self.description is None or other.description is None: + if self.description != other.description: + return (-1 if self.description is None else 1) + else: + if self.description < other.description: + return -1 + elif self.description > other.description: + return 1 + if self.temporary is None or other.temporary is None: + if self.temporary != other.temporary: + return (-1 if self.temporary is None else 1) + else: + if self.temporary < other.temporary: + return -1 + elif self.temporary > other.temporary: + return 1 + if self.position is None or other.position is None: + if self.position != other.position: + return (-1 if self.position is None else 1) + else: + if self.position < other.position: + return -1 + elif self.position > other.position: + return 1 + return 0 + + def __lt__(self, other): + r = self.__compare(other) + if r is NotImplemented: + return r + else: + return r < 0 + + def __le__(self, other): + r = self.__compare(other) + if r is NotImplemented: + return r + else: + return r <= 0 + + def __gt__(self, other): + r = self.__compare(other) + if r is NotImplemented: + return r + else: + return r > 0 + + def __ge__(self, other): + r = self.__compare(other) + if r is NotImplemented: + return r + else: + return r >= 0 + + def __eq__(self, other): + r = self.__compare(other) + if r is NotImplemented: + return r + else: + return r == 0 + + def __ne__(self, other): + r = self.__compare(other) + if r is NotImplemented: + return r + else: + return r != 0 + + def __str__(self): + return IcePy.stringify(self, _M_MumbleServer._t_Channel) + + __repr__ = __str__ + + _M_MumbleServer._t_Channel = IcePy.defineStruct('::MumbleServer::Channel', Channel, (), ( + ('id', (), IcePy._t_int), + ('name', (), IcePy._t_string), + ('parent', (), IcePy._t_int), + ('links', (), _M_MumbleServer._t_IntList), + ('description', (), IcePy._t_string), + ('temporary', (), IcePy._t_bool), + ('position', (), IcePy._t_int) + )) + + _M_MumbleServer.Channel = Channel + del Channel + +if 'Group' not in _M_MumbleServer.__dict__: + _M_MumbleServer.Group = Ice.createTempClass() + class Group(object): + """ + A group. Groups are defined per channel, and can inherit members from parent channels. + Members: + name -- Group name + inherited -- Is this group inherited from a parent channel? Read-only. + inherit -- Does this group inherit members from parent channels? + inheritable -- Can subchannels inherit members from this group? + add -- List of users to add to the group. + remove -- List of inherited users to remove from the group. + members -- Current members of the group, including inherited members. Read-only. + """ + def __init__(self, name='', inherited=False, inherit=False, inheritable=False, add=None, remove=None, members=None): + self.name = name + self.inherited = inherited + self.inherit = inherit + self.inheritable = inheritable + self.add = add + self.remove = remove + self.members = members + + def __hash__(self): + _h = 0 + _h = 5 * _h + Ice.getHash(self.name) + _h = 5 * _h + Ice.getHash(self.inherited) + _h = 5 * _h + Ice.getHash(self.inherit) + _h = 5 * _h + Ice.getHash(self.inheritable) + if self.add: + for _i0 in self.add: + _h = 5 * _h + Ice.getHash(_i0) + if self.remove: + for _i1 in self.remove: + _h = 5 * _h + Ice.getHash(_i1) + if self.members: + for _i2 in self.members: + _h = 5 * _h + Ice.getHash(_i2) + return _h % 0x7fffffff + + def __compare(self, other): + if other is None: + return 1 + elif not isinstance(other, _M_MumbleServer.Group): + return NotImplemented + else: + if self.name is None or other.name is None: + if self.name != other.name: + return (-1 if self.name is None else 1) + else: + if self.name < other.name: + return -1 + elif self.name > other.name: + return 1 + if self.inherited is None or other.inherited is None: + if self.inherited != other.inherited: + return (-1 if self.inherited is None else 1) + else: + if self.inherited < other.inherited: + return -1 + elif self.inherited > other.inherited: + return 1 + if self.inherit is None or other.inherit is None: + if self.inherit != other.inherit: + return (-1 if self.inherit is None else 1) + else: + if self.inherit < other.inherit: + return -1 + elif self.inherit > other.inherit: + return 1 + if self.inheritable is None or other.inheritable is None: + if self.inheritable != other.inheritable: + return (-1 if self.inheritable is None else 1) + else: + if self.inheritable < other.inheritable: + return -1 + elif self.inheritable > other.inheritable: + return 1 + if self.add is None or other.add is None: + if self.add != other.add: + return (-1 if self.add is None else 1) + else: + if self.add < other.add: + return -1 + elif self.add > other.add: + return 1 + if self.remove is None or other.remove is None: + if self.remove != other.remove: + return (-1 if self.remove is None else 1) + else: + if self.remove < other.remove: + return -1 + elif self.remove > other.remove: + return 1 + if self.members is None or other.members is None: + if self.members != other.members: + return (-1 if self.members is None else 1) + else: + if self.members < other.members: + return -1 + elif self.members > other.members: + return 1 + return 0 + + def __lt__(self, other): + r = self.__compare(other) + if r is NotImplemented: + return r + else: + return r < 0 + + def __le__(self, other): + r = self.__compare(other) + if r is NotImplemented: + return r + else: + return r <= 0 + + def __gt__(self, other): + r = self.__compare(other) + if r is NotImplemented: + return r + else: + return r > 0 + + def __ge__(self, other): + r = self.__compare(other) + if r is NotImplemented: + return r + else: + return r >= 0 + + def __eq__(self, other): + r = self.__compare(other) + if r is NotImplemented: + return r + else: + return r == 0 + + def __ne__(self, other): + r = self.__compare(other) + if r is NotImplemented: + return r + else: + return r != 0 + + def __str__(self): + return IcePy.stringify(self, _M_MumbleServer._t_Group) + + __repr__ = __str__ + + _M_MumbleServer._t_Group = IcePy.defineStruct('::MumbleServer::Group', Group, (), ( + ('name', (), IcePy._t_string), + ('inherited', (), IcePy._t_bool), + ('inherit', (), IcePy._t_bool), + ('inheritable', (), IcePy._t_bool), + ('add', (), _M_MumbleServer._t_IntList), + ('remove', (), _M_MumbleServer._t_IntList), + ('members', (), _M_MumbleServer._t_IntList) + )) + + _M_MumbleServer.Group = Group + del Group + +_M_MumbleServer.PermissionWrite = 1 + +_M_MumbleServer.PermissionTraverse = 2 + +_M_MumbleServer.PermissionEnter = 4 + +_M_MumbleServer.PermissionSpeak = 8 + +_M_MumbleServer.PermissionWhisper = 256 + +_M_MumbleServer.PermissionMuteDeafen = 16 + +_M_MumbleServer.PermissionMove = 32 + +_M_MumbleServer.PermissionMakeChannel = 64 + +_M_MumbleServer.PermissionMakeTempChannel = 1024 + +_M_MumbleServer.PermissionLinkChannel = 128 + +_M_MumbleServer.PermissionTextMessage = 512 + +_M_MumbleServer.PermissionKick = 65536 + +_M_MumbleServer.PermissionBan = 131072 + +_M_MumbleServer.PermissionRegister = 262144 + +_M_MumbleServer.PermissionRegisterSelf = 524288 + +_M_MumbleServer.ResetUserContent = 1048576 + +if 'ACL' not in _M_MumbleServer.__dict__: + _M_MumbleServer.ACL = Ice.createTempClass() + class ACL(object): + """ + Access Control List for a channel. ACLs are defined per channel, and can be inherited from parent channels. + Members: + applyHere -- Does the ACL apply to this channel? + applySubs -- Does the ACL apply to subchannels? + inherited -- Is this ACL inherited from a parent channel? Read-only. + userid -- ID of user this ACL applies to. -1 if using a group name. + group -- Group this ACL applies to. Blank if using userid. + allow -- Binary mask of privileges to allow. + deny -- Binary mask of privileges to deny. + """ + def __init__(self, applyHere=False, applySubs=False, inherited=False, userid=0, group='', allow=0, deny=0): + self.applyHere = applyHere + self.applySubs = applySubs + self.inherited = inherited + self.userid = userid + self.group = group + self.allow = allow + self.deny = deny + + def __hash__(self): + _h = 0 + _h = 5 * _h + Ice.getHash(self.applyHere) + _h = 5 * _h + Ice.getHash(self.applySubs) + _h = 5 * _h + Ice.getHash(self.inherited) + _h = 5 * _h + Ice.getHash(self.userid) + _h = 5 * _h + Ice.getHash(self.group) + _h = 5 * _h + Ice.getHash(self.allow) + _h = 5 * _h + Ice.getHash(self.deny) + return _h % 0x7fffffff + + def __compare(self, other): + if other is None: + return 1 + elif not isinstance(other, _M_MumbleServer.ACL): + return NotImplemented + else: + if self.applyHere is None or other.applyHere is None: + if self.applyHere != other.applyHere: + return (-1 if self.applyHere is None else 1) + else: + if self.applyHere < other.applyHere: + return -1 + elif self.applyHere > other.applyHere: + return 1 + if self.applySubs is None or other.applySubs is None: + if self.applySubs != other.applySubs: + return (-1 if self.applySubs is None else 1) + else: + if self.applySubs < other.applySubs: + return -1 + elif self.applySubs > other.applySubs: + return 1 + if self.inherited is None or other.inherited is None: + if self.inherited != other.inherited: + return (-1 if self.inherited is None else 1) + else: + if self.inherited < other.inherited: + return -1 + elif self.inherited > other.inherited: + return 1 + if self.userid is None or other.userid is None: + if self.userid != other.userid: + return (-1 if self.userid is None else 1) + else: + if self.userid < other.userid: + return -1 + elif self.userid > other.userid: + return 1 + if self.group is None or other.group is None: + if self.group != other.group: + return (-1 if self.group is None else 1) + else: + if self.group < other.group: + return -1 + elif self.group > other.group: + return 1 + if self.allow is None or other.allow is None: + if self.allow != other.allow: + return (-1 if self.allow is None else 1) + else: + if self.allow < other.allow: + return -1 + elif self.allow > other.allow: + return 1 + if self.deny is None or other.deny is None: + if self.deny != other.deny: + return (-1 if self.deny is None else 1) + else: + if self.deny < other.deny: + return -1 + elif self.deny > other.deny: + return 1 + return 0 + + def __lt__(self, other): + r = self.__compare(other) + if r is NotImplemented: + return r + else: + return r < 0 + + def __le__(self, other): + r = self.__compare(other) + if r is NotImplemented: + return r + else: + return r <= 0 + + def __gt__(self, other): + r = self.__compare(other) + if r is NotImplemented: + return r + else: + return r > 0 + + def __ge__(self, other): + r = self.__compare(other) + if r is NotImplemented: + return r + else: + return r >= 0 + + def __eq__(self, other): + r = self.__compare(other) + if r is NotImplemented: + return r + else: + return r == 0 + + def __ne__(self, other): + r = self.__compare(other) + if r is NotImplemented: + return r + else: + return r != 0 + + def __str__(self): + return IcePy.stringify(self, _M_MumbleServer._t_ACL) + + __repr__ = __str__ + + _M_MumbleServer._t_ACL = IcePy.defineStruct('::MumbleServer::ACL', ACL, (), ( + ('applyHere', (), IcePy._t_bool), + ('applySubs', (), IcePy._t_bool), + ('inherited', (), IcePy._t_bool), + ('userid', (), IcePy._t_int), + ('group', (), IcePy._t_string), + ('allow', (), IcePy._t_int), + ('deny', (), IcePy._t_int) + )) + + _M_MumbleServer.ACL = ACL + del ACL + +if 'Ban' not in _M_MumbleServer.__dict__: + _M_MumbleServer.Ban = Ice.createTempClass() + class Ban(object): + """ + A single ip mask for a ban. + Members: + address -- Address to ban. + bits -- Number of bits in ban to apply. + name -- Username associated with ban. + hash -- Hash of banned user. + reason -- Reason for ban. + start -- Date ban was applied in unix time format. + duration -- Duration of ban. + """ + def __init__(self, address=None, bits=0, name='', hash='', reason='', start=0, duration=0): + self.address = address + self.bits = bits + self.name = name + self.hash = hash + self.reason = reason + self.start = start + self.duration = duration + + def __hash__(self): + _h = 0 + if self.address: + for _i0 in self.address: + _h = 5 * _h + Ice.getHash(_i0) + _h = 5 * _h + Ice.getHash(self.bits) + _h = 5 * _h + Ice.getHash(self.name) + _h = 5 * _h + Ice.getHash(self.hash) + _h = 5 * _h + Ice.getHash(self.reason) + _h = 5 * _h + Ice.getHash(self.start) + _h = 5 * _h + Ice.getHash(self.duration) + return _h % 0x7fffffff + + def __compare(self, other): + if other is None: + return 1 + elif not isinstance(other, _M_MumbleServer.Ban): + return NotImplemented + else: + if self.address is None or other.address is None: + if self.address != other.address: + return (-1 if self.address is None else 1) + else: + if self.address < other.address: + return -1 + elif self.address > other.address: + return 1 + if self.bits is None or other.bits is None: + if self.bits != other.bits: + return (-1 if self.bits is None else 1) + else: + if self.bits < other.bits: + return -1 + elif self.bits > other.bits: + return 1 + if self.name is None or other.name is None: + if self.name != other.name: + return (-1 if self.name is None else 1) + else: + if self.name < other.name: + return -1 + elif self.name > other.name: + return 1 + if self.hash is None or other.hash is None: + if self.hash != other.hash: + return (-1 if self.hash is None else 1) + else: + if self.hash < other.hash: + return -1 + elif self.hash > other.hash: + return 1 + if self.reason is None or other.reason is None: + if self.reason != other.reason: + return (-1 if self.reason is None else 1) + else: + if self.reason < other.reason: + return -1 + elif self.reason > other.reason: + return 1 + if self.start is None or other.start is None: + if self.start != other.start: + return (-1 if self.start is None else 1) + else: + if self.start < other.start: + return -1 + elif self.start > other.start: + return 1 + if self.duration is None or other.duration is None: + if self.duration != other.duration: + return (-1 if self.duration is None else 1) + else: + if self.duration < other.duration: + return -1 + elif self.duration > other.duration: + return 1 + return 0 + + def __lt__(self, other): + r = self.__compare(other) + if r is NotImplemented: + return r + else: + return r < 0 + + def __le__(self, other): + r = self.__compare(other) + if r is NotImplemented: + return r + else: + return r <= 0 + + def __gt__(self, other): + r = self.__compare(other) + if r is NotImplemented: + return r + else: + return r > 0 + + def __ge__(self, other): + r = self.__compare(other) + if r is NotImplemented: + return r + else: + return r >= 0 + + def __eq__(self, other): + r = self.__compare(other) + if r is NotImplemented: + return r + else: + return r == 0 + + def __ne__(self, other): + r = self.__compare(other) + if r is NotImplemented: + return r + else: + return r != 0 + + def __str__(self): + return IcePy.stringify(self, _M_MumbleServer._t_Ban) + + __repr__ = __str__ + + _M_MumbleServer._t_Ban = IcePy.defineStruct('::MumbleServer::Ban', Ban, (), ( + ('address', (), _M_MumbleServer._t_NetAddress), + ('bits', (), IcePy._t_int), + ('name', (), IcePy._t_string), + ('hash', (), IcePy._t_string), + ('reason', (), IcePy._t_string), + ('start', (), IcePy._t_int), + ('duration', (), IcePy._t_int) + )) + + _M_MumbleServer.Ban = Ban + del Ban + +if 'LogEntry' not in _M_MumbleServer.__dict__: + _M_MumbleServer.LogEntry = Ice.createTempClass() + class LogEntry(object): + """ + A entry in the log. + Members: + timestamp -- Timestamp in UNIX time_t + txt -- The log message. + """ + def __init__(self, timestamp=0, txt=''): + self.timestamp = timestamp + self.txt = txt + + def __hash__(self): + _h = 0 + _h = 5 * _h + Ice.getHash(self.timestamp) + _h = 5 * _h + Ice.getHash(self.txt) + return _h % 0x7fffffff + + def __compare(self, other): + if other is None: + return 1 + elif not isinstance(other, _M_MumbleServer.LogEntry): + return NotImplemented + else: + if self.timestamp is None or other.timestamp is None: + if self.timestamp != other.timestamp: + return (-1 if self.timestamp is None else 1) + else: + if self.timestamp < other.timestamp: + return -1 + elif self.timestamp > other.timestamp: + return 1 + if self.txt is None or other.txt is None: + if self.txt != other.txt: + return (-1 if self.txt is None else 1) + else: + if self.txt < other.txt: + return -1 + elif self.txt > other.txt: + return 1 + return 0 + + def __lt__(self, other): + r = self.__compare(other) + if r is NotImplemented: + return r + else: + return r < 0 + + def __le__(self, other): + r = self.__compare(other) + if r is NotImplemented: + return r + else: + return r <= 0 + + def __gt__(self, other): + r = self.__compare(other) + if r is NotImplemented: + return r + else: + return r > 0 + + def __ge__(self, other): + r = self.__compare(other) + if r is NotImplemented: + return r + else: + return r >= 0 + + def __eq__(self, other): + r = self.__compare(other) + if r is NotImplemented: + return r + else: + return r == 0 + + def __ne__(self, other): + r = self.__compare(other) + if r is NotImplemented: + return r + else: + return r != 0 + + def __str__(self): + return IcePy.stringify(self, _M_MumbleServer._t_LogEntry) + + __repr__ = __str__ + + _M_MumbleServer._t_LogEntry = IcePy.defineStruct('::MumbleServer::LogEntry', LogEntry, (), ( + ('timestamp', (), IcePy._t_int), + ('txt', (), IcePy._t_string) + )) + + _M_MumbleServer.LogEntry = LogEntry + del LogEntry + +if 'Tree' not in _M_MumbleServer.__dict__: + _M_MumbleServer._t_Tree = IcePy.declareValue('::MumbleServer::Tree') + +if '_t_TreeList' not in _M_MumbleServer.__dict__: + _M_MumbleServer._t_TreeList = IcePy.defineSequence('::MumbleServer::TreeList', (), _M_MumbleServer._t_Tree) + +if 'ChannelInfo' not in _M_MumbleServer.__dict__: + _M_MumbleServer.ChannelInfo = Ice.createTempClass() + class ChannelInfo(Ice.EnumBase): + + def __init__(self, _n, _v): + Ice.EnumBase.__init__(self, _n, _v) + + def valueOf(self, _n): + if _n in self._enumerators: + return self._enumerators[_n] + return None + valueOf = classmethod(valueOf) + + ChannelInfo.ChannelDescription = ChannelInfo("ChannelDescription", 0) + ChannelInfo.ChannelPosition = ChannelInfo("ChannelPosition", 1) + ChannelInfo._enumerators = { 0:ChannelInfo.ChannelDescription, 1:ChannelInfo.ChannelPosition } + + _M_MumbleServer._t_ChannelInfo = IcePy.defineEnum('::MumbleServer::ChannelInfo', ChannelInfo, (), ChannelInfo._enumerators) + + _M_MumbleServer.ChannelInfo = ChannelInfo + del ChannelInfo + +if 'UserInfo' not in _M_MumbleServer.__dict__: + _M_MumbleServer.UserInfo = Ice.createTempClass() + class UserInfo(Ice.EnumBase): + + def __init__(self, _n, _v): + Ice.EnumBase.__init__(self, _n, _v) + + def valueOf(self, _n): + if _n in self._enumerators: + return self._enumerators[_n] + return None + valueOf = classmethod(valueOf) + + UserInfo.UserName = UserInfo("UserName", 0) + UserInfo.UserEmail = UserInfo("UserEmail", 1) + UserInfo.UserComment = UserInfo("UserComment", 2) + UserInfo.UserHash = UserInfo("UserHash", 3) + UserInfo.UserPassword = UserInfo("UserPassword", 4) + UserInfo.UserLastActive = UserInfo("UserLastActive", 5) + UserInfo.UserKDFIterations = UserInfo("UserKDFIterations", 6) + UserInfo._enumerators = { 0:UserInfo.UserName, 1:UserInfo.UserEmail, 2:UserInfo.UserComment, 3:UserInfo.UserHash, 4:UserInfo.UserPassword, 5:UserInfo.UserLastActive, 6:UserInfo.UserKDFIterations } + + _M_MumbleServer._t_UserInfo = IcePy.defineEnum('::MumbleServer::UserInfo', UserInfo, (), UserInfo._enumerators) + + _M_MumbleServer.UserInfo = UserInfo + del UserInfo + +if '_t_UserMap' not in _M_MumbleServer.__dict__: + _M_MumbleServer._t_UserMap = IcePy.defineDictionary('::MumbleServer::UserMap', (), IcePy._t_int, _M_MumbleServer._t_User) + +if '_t_ChannelMap' not in _M_MumbleServer.__dict__: + _M_MumbleServer._t_ChannelMap = IcePy.defineDictionary('::MumbleServer::ChannelMap', (), IcePy._t_int, _M_MumbleServer._t_Channel) + +if '_t_ChannelList' not in _M_MumbleServer.__dict__: + _M_MumbleServer._t_ChannelList = IcePy.defineSequence('::MumbleServer::ChannelList', (), _M_MumbleServer._t_Channel) + +if '_t_UserList' not in _M_MumbleServer.__dict__: + _M_MumbleServer._t_UserList = IcePy.defineSequence('::MumbleServer::UserList', (), _M_MumbleServer._t_User) + +if '_t_GroupList' not in _M_MumbleServer.__dict__: + _M_MumbleServer._t_GroupList = IcePy.defineSequence('::MumbleServer::GroupList', (), _M_MumbleServer._t_Group) + +if '_t_ACLList' not in _M_MumbleServer.__dict__: + _M_MumbleServer._t_ACLList = IcePy.defineSequence('::MumbleServer::ACLList', (), _M_MumbleServer._t_ACL) + +if '_t_LogList' not in _M_MumbleServer.__dict__: + _M_MumbleServer._t_LogList = IcePy.defineSequence('::MumbleServer::LogList', (), _M_MumbleServer._t_LogEntry) + +if '_t_BanList' not in _M_MumbleServer.__dict__: + _M_MumbleServer._t_BanList = IcePy.defineSequence('::MumbleServer::BanList', (), _M_MumbleServer._t_Ban) + +if '_t_IdList' not in _M_MumbleServer.__dict__: + _M_MumbleServer._t_IdList = IcePy.defineSequence('::MumbleServer::IdList', (), IcePy._t_int) + +if '_t_NameList' not in _M_MumbleServer.__dict__: + _M_MumbleServer._t_NameList = IcePy.defineSequence('::MumbleServer::NameList', (), IcePy._t_string) + +if '_t_NameMap' not in _M_MumbleServer.__dict__: + _M_MumbleServer._t_NameMap = IcePy.defineDictionary('::MumbleServer::NameMap', (), IcePy._t_int, IcePy._t_string) + +if '_t_IdMap' not in _M_MumbleServer.__dict__: + _M_MumbleServer._t_IdMap = IcePy.defineDictionary('::MumbleServer::IdMap', (), IcePy._t_string, IcePy._t_int) + +if '_t_Texture' not in _M_MumbleServer.__dict__: + _M_MumbleServer._t_Texture = IcePy.defineSequence('::MumbleServer::Texture', (), IcePy._t_byte) + +if '_t_ConfigMap' not in _M_MumbleServer.__dict__: + _M_MumbleServer._t_ConfigMap = IcePy.defineDictionary('::MumbleServer::ConfigMap', (), IcePy._t_string, IcePy._t_string) + +if '_t_GroupNameList' not in _M_MumbleServer.__dict__: + _M_MumbleServer._t_GroupNameList = IcePy.defineSequence('::MumbleServer::GroupNameList', (), IcePy._t_string) + +if '_t_CertificateDer' not in _M_MumbleServer.__dict__: + _M_MumbleServer._t_CertificateDer = IcePy.defineSequence('::MumbleServer::CertificateDer', (), IcePy._t_byte) + +if '_t_CertificateList' not in _M_MumbleServer.__dict__: + _M_MumbleServer._t_CertificateList = IcePy.defineSequence('::MumbleServer::CertificateList', (), _M_MumbleServer._t_CertificateDer) + +if '_t_UserInfoMap' not in _M_MumbleServer.__dict__: + _M_MumbleServer._t_UserInfoMap = IcePy.defineDictionary('::MumbleServer::UserInfoMap', (), _M_MumbleServer._t_UserInfo, IcePy._t_string) + +if 'Tree' not in _M_MumbleServer.__dict__: + _M_MumbleServer.Tree = Ice.createTempClass() + class Tree(Ice.Value): + """ + User and subchannel state. Read-only. + Members: + c -- Channel definition of current channel. + children -- List of subchannels. + users -- Users in this channel. + """ + def __init__(self, c=Ice._struct_marker, children=None, users=None): + if c is Ice._struct_marker: + self.c = _M_MumbleServer.Channel() + else: + self.c = c + self.children = children + self.users = users + + def ice_id(self): + return '::MumbleServer::Tree' + + @staticmethod + def ice_staticId(): + return '::MumbleServer::Tree' + + def __str__(self): + return IcePy.stringify(self, _M_MumbleServer._t_Tree) + + __repr__ = __str__ + + _M_MumbleServer._t_Tree = IcePy.defineValue('::MumbleServer::Tree', Tree, -1, (), False, False, None, ( + ('c', (), _M_MumbleServer._t_Channel, False, 0), + ('children', (), _M_MumbleServer._t_TreeList, False, 0), + ('users', (), _M_MumbleServer._t_UserList, False, 0) + )) + Tree._ice_type = _M_MumbleServer._t_Tree + + _M_MumbleServer.Tree = Tree + del Tree + +if 'MurmurException' not in _M_MumbleServer.__dict__: + _M_MumbleServer.MurmurException = Ice.createTempClass() + class MurmurException(Ice.UserException): + def __init__(self): + pass + + def __str__(self): + return IcePy.stringifyException(self) + + __repr__ = __str__ + + _ice_id = '::MumbleServer::MurmurException' + + _M_MumbleServer._t_MurmurException = IcePy.defineException('::MumbleServer::MurmurException', MurmurException, (), False, None, ()) + MurmurException._ice_type = _M_MumbleServer._t_MurmurException + + _M_MumbleServer.MurmurException = MurmurException + del MurmurException + +if 'InvalidSessionException' not in _M_MumbleServer.__dict__: + _M_MumbleServer.InvalidSessionException = Ice.createTempClass() + class InvalidSessionException(_M_MumbleServer.MurmurException): + """ + This is thrown when you specify an invalid session. This may happen if the user has disconnected since your last call to Server.getUsers. See User.session + """ + def __init__(self): + _M_MumbleServer.MurmurException.__init__(self) + + def __str__(self): + return IcePy.stringifyException(self) + + __repr__ = __str__ + + _ice_id = '::MumbleServer::InvalidSessionException' + + _M_MumbleServer._t_InvalidSessionException = IcePy.defineException('::MumbleServer::InvalidSessionException', InvalidSessionException, (), False, _M_MumbleServer._t_MurmurException, ()) + InvalidSessionException._ice_type = _M_MumbleServer._t_InvalidSessionException + + _M_MumbleServer.InvalidSessionException = InvalidSessionException + del InvalidSessionException + +if 'InvalidChannelException' not in _M_MumbleServer.__dict__: + _M_MumbleServer.InvalidChannelException = Ice.createTempClass() + class InvalidChannelException(_M_MumbleServer.MurmurException): + """ + This is thrown when you specify an invalid channel id. This may happen if the channel was removed by another provess. It can also be thrown if you try to add an invalid channel. + """ + def __init__(self): + _M_MumbleServer.MurmurException.__init__(self) + + def __str__(self): + return IcePy.stringifyException(self) + + __repr__ = __str__ + + _ice_id = '::MumbleServer::InvalidChannelException' + + _M_MumbleServer._t_InvalidChannelException = IcePy.defineException('::MumbleServer::InvalidChannelException', InvalidChannelException, (), False, _M_MumbleServer._t_MurmurException, ()) + InvalidChannelException._ice_type = _M_MumbleServer._t_InvalidChannelException + + _M_MumbleServer.InvalidChannelException = InvalidChannelException + del InvalidChannelException + +if 'InvalidServerException' not in _M_MumbleServer.__dict__: + _M_MumbleServer.InvalidServerException = Ice.createTempClass() + class InvalidServerException(_M_MumbleServer.MurmurException): + """ + This is thrown when you try to do an operation on a server that does not exist. This may happen if someone has removed the server. + """ + def __init__(self): + _M_MumbleServer.MurmurException.__init__(self) + + def __str__(self): + return IcePy.stringifyException(self) + + __repr__ = __str__ + + _ice_id = '::MumbleServer::InvalidServerException' + + _M_MumbleServer._t_InvalidServerException = IcePy.defineException('::MumbleServer::InvalidServerException', InvalidServerException, (), False, _M_MumbleServer._t_MurmurException, ()) + InvalidServerException._ice_type = _M_MumbleServer._t_InvalidServerException + + _M_MumbleServer.InvalidServerException = InvalidServerException + del InvalidServerException + +if 'ServerBootedException' not in _M_MumbleServer.__dict__: + _M_MumbleServer.ServerBootedException = Ice.createTempClass() + class ServerBootedException(_M_MumbleServer.MurmurException): + """ + This happens if you try to fetch user or channel state on a stopped server, if you try to stop an already stopped server or start an already started server. + """ + def __init__(self): + _M_MumbleServer.MurmurException.__init__(self) + + def __str__(self): + return IcePy.stringifyException(self) + + __repr__ = __str__ + + _ice_id = '::MumbleServer::ServerBootedException' + + _M_MumbleServer._t_ServerBootedException = IcePy.defineException('::MumbleServer::ServerBootedException', ServerBootedException, (), False, _M_MumbleServer._t_MurmurException, ()) + ServerBootedException._ice_type = _M_MumbleServer._t_ServerBootedException + + _M_MumbleServer.ServerBootedException = ServerBootedException + del ServerBootedException + +if 'ServerFailureException' not in _M_MumbleServer.__dict__: + _M_MumbleServer.ServerFailureException = Ice.createTempClass() + class ServerFailureException(_M_MumbleServer.MurmurException): + """ + This is thrown if Server.start fails, and should generally be the cause for some concern. + """ + def __init__(self): + _M_MumbleServer.MurmurException.__init__(self) + + def __str__(self): + return IcePy.stringifyException(self) + + __repr__ = __str__ + + _ice_id = '::MumbleServer::ServerFailureException' + + _M_MumbleServer._t_ServerFailureException = IcePy.defineException('::MumbleServer::ServerFailureException', ServerFailureException, (), False, _M_MumbleServer._t_MurmurException, ()) + ServerFailureException._ice_type = _M_MumbleServer._t_ServerFailureException + + _M_MumbleServer.ServerFailureException = ServerFailureException + del ServerFailureException + +if 'InvalidUserException' not in _M_MumbleServer.__dict__: + _M_MumbleServer.InvalidUserException = Ice.createTempClass() + class InvalidUserException(_M_MumbleServer.MurmurException): + """ + This is thrown when you specify an invalid userid. + """ + def __init__(self): + _M_MumbleServer.MurmurException.__init__(self) + + def __str__(self): + return IcePy.stringifyException(self) + + __repr__ = __str__ + + _ice_id = '::MumbleServer::InvalidUserException' + + _M_MumbleServer._t_InvalidUserException = IcePy.defineException('::MumbleServer::InvalidUserException', InvalidUserException, (), False, _M_MumbleServer._t_MurmurException, ()) + InvalidUserException._ice_type = _M_MumbleServer._t_InvalidUserException + + _M_MumbleServer.InvalidUserException = InvalidUserException + del InvalidUserException + +if 'InvalidTextureException' not in _M_MumbleServer.__dict__: + _M_MumbleServer.InvalidTextureException = Ice.createTempClass() + class InvalidTextureException(_M_MumbleServer.MurmurException): + """ + This is thrown when you try to set an invalid texture. + """ + def __init__(self): + _M_MumbleServer.MurmurException.__init__(self) + + def __str__(self): + return IcePy.stringifyException(self) + + __repr__ = __str__ + + _ice_id = '::MumbleServer::InvalidTextureException' + + _M_MumbleServer._t_InvalidTextureException = IcePy.defineException('::MumbleServer::InvalidTextureException', InvalidTextureException, (), False, _M_MumbleServer._t_MurmurException, ()) + InvalidTextureException._ice_type = _M_MumbleServer._t_InvalidTextureException + + _M_MumbleServer.InvalidTextureException = InvalidTextureException + del InvalidTextureException + +if 'InvalidCallbackException' not in _M_MumbleServer.__dict__: + _M_MumbleServer.InvalidCallbackException = Ice.createTempClass() + class InvalidCallbackException(_M_MumbleServer.MurmurException): + """ + This is thrown when you supply an invalid callback. + """ + def __init__(self): + _M_MumbleServer.MurmurException.__init__(self) + + def __str__(self): + return IcePy.stringifyException(self) + + __repr__ = __str__ + + _ice_id = '::MumbleServer::InvalidCallbackException' + + _M_MumbleServer._t_InvalidCallbackException = IcePy.defineException('::MumbleServer::InvalidCallbackException', InvalidCallbackException, (), False, _M_MumbleServer._t_MurmurException, ()) + InvalidCallbackException._ice_type = _M_MumbleServer._t_InvalidCallbackException + + _M_MumbleServer.InvalidCallbackException = InvalidCallbackException + del InvalidCallbackException + +if 'InvalidSecretException' not in _M_MumbleServer.__dict__: + _M_MumbleServer.InvalidSecretException = Ice.createTempClass() + class InvalidSecretException(_M_MumbleServer.MurmurException): + """ + This is thrown when you supply the wrong secret in the calling context. + """ + def __init__(self): + _M_MumbleServer.MurmurException.__init__(self) + + def __str__(self): + return IcePy.stringifyException(self) + + __repr__ = __str__ + + _ice_id = '::MumbleServer::InvalidSecretException' + + _M_MumbleServer._t_InvalidSecretException = IcePy.defineException('::MumbleServer::InvalidSecretException', InvalidSecretException, (), False, _M_MumbleServer._t_MurmurException, ()) + InvalidSecretException._ice_type = _M_MumbleServer._t_InvalidSecretException + + _M_MumbleServer.InvalidSecretException = InvalidSecretException + del InvalidSecretException + +if 'NestingLimitException' not in _M_MumbleServer.__dict__: + _M_MumbleServer.NestingLimitException = Ice.createTempClass() + class NestingLimitException(_M_MumbleServer.MurmurException): + """ + This is thrown when the channel operation would exceed the channel nesting limit + """ + def __init__(self): + _M_MumbleServer.MurmurException.__init__(self) + + def __str__(self): + return IcePy.stringifyException(self) + + __repr__ = __str__ + + _ice_id = '::MumbleServer::NestingLimitException' + + _M_MumbleServer._t_NestingLimitException = IcePy.defineException('::MumbleServer::NestingLimitException', NestingLimitException, (), False, _M_MumbleServer._t_MurmurException, ()) + NestingLimitException._ice_type = _M_MumbleServer._t_NestingLimitException + + _M_MumbleServer.NestingLimitException = NestingLimitException + del NestingLimitException + +if 'WriteOnlyException' not in _M_MumbleServer.__dict__: + _M_MumbleServer.WriteOnlyException = Ice.createTempClass() + class WriteOnlyException(_M_MumbleServer.MurmurException): + """ + This is thrown when you ask the server to disclose something that should be secret. + """ + def __init__(self): + _M_MumbleServer.MurmurException.__init__(self) + + def __str__(self): + return IcePy.stringifyException(self) + + __repr__ = __str__ + + _ice_id = '::MumbleServer::WriteOnlyException' + + _M_MumbleServer._t_WriteOnlyException = IcePy.defineException('::MumbleServer::WriteOnlyException', WriteOnlyException, (), False, _M_MumbleServer._t_MurmurException, ()) + WriteOnlyException._ice_type = _M_MumbleServer._t_WriteOnlyException + + _M_MumbleServer.WriteOnlyException = WriteOnlyException + del WriteOnlyException + +if 'InvalidInputDataException' not in _M_MumbleServer.__dict__: + _M_MumbleServer.InvalidInputDataException = Ice.createTempClass() + class InvalidInputDataException(_M_MumbleServer.MurmurException): + """ + This is thrown when invalid input data was specified. + """ + def __init__(self): + _M_MumbleServer.MurmurException.__init__(self) + + def __str__(self): + return IcePy.stringifyException(self) + + __repr__ = __str__ + + _ice_id = '::MumbleServer::InvalidInputDataException' + + _M_MumbleServer._t_InvalidInputDataException = IcePy.defineException('::MumbleServer::InvalidInputDataException', InvalidInputDataException, (), False, _M_MumbleServer._t_MurmurException, ()) + InvalidInputDataException._ice_type = _M_MumbleServer._t_InvalidInputDataException + + _M_MumbleServer.InvalidInputDataException = InvalidInputDataException + del InvalidInputDataException + +_M_MumbleServer._t_ServerCallback = IcePy.defineValue('::MumbleServer::ServerCallback', Ice.Value, -1, (), False, True, None, ()) + +if 'ServerCallbackPrx' not in _M_MumbleServer.__dict__: + _M_MumbleServer.ServerCallbackPrx = Ice.createTempClass() + class ServerCallbackPrx(Ice.ObjectPrx): + + """ + Called when a user connects to the server. + Arguments: + state -- State of connected user. + context -- The request context for the invocation. + """ + def userConnected(self, state, context=None): + return _M_MumbleServer.ServerCallback._op_userConnected.invoke(self, ((state, ), context)) + + """ + Called when a user connects to the server. + Arguments: + state -- State of connected user. + context -- The request context for the invocation. + Returns: A future object for the invocation. + """ + def userConnectedAsync(self, state, context=None): + return _M_MumbleServer.ServerCallback._op_userConnected.invokeAsync(self, ((state, ), context)) + + """ + Called when a user connects to the server. + Arguments: + state -- State of connected user. + _response -- The asynchronous response callback. + _ex -- The asynchronous exception callback. + _sent -- The asynchronous sent callback. + context -- The request context for the invocation. + Returns: An asynchronous result object for the invocation. + """ + def begin_userConnected(self, state, _response=None, _ex=None, _sent=None, context=None): + return _M_MumbleServer.ServerCallback._op_userConnected.begin(self, ((state, ), _response, _ex, _sent, context)) + + """ + Called when a user connects to the server. + Arguments: + state -- State of connected user. + """ + def end_userConnected(self, _r): + return _M_MumbleServer.ServerCallback._op_userConnected.end(self, _r) + + """ + Called when a user disconnects from the server. The user has already been removed, so you can no longer use methods like Server.getState + to retrieve the user's state. + Arguments: + state -- State of disconnected user. + context -- The request context for the invocation. + """ + def userDisconnected(self, state, context=None): + return _M_MumbleServer.ServerCallback._op_userDisconnected.invoke(self, ((state, ), context)) + + """ + Called when a user disconnects from the server. The user has already been removed, so you can no longer use methods like Server.getState + to retrieve the user's state. + Arguments: + state -- State of disconnected user. + context -- The request context for the invocation. + Returns: A future object for the invocation. + """ + def userDisconnectedAsync(self, state, context=None): + return _M_MumbleServer.ServerCallback._op_userDisconnected.invokeAsync(self, ((state, ), context)) + + """ + Called when a user disconnects from the server. The user has already been removed, so you can no longer use methods like Server.getState + to retrieve the user's state. + Arguments: + state -- State of disconnected user. + _response -- The asynchronous response callback. + _ex -- The asynchronous exception callback. + _sent -- The asynchronous sent callback. + context -- The request context for the invocation. + Returns: An asynchronous result object for the invocation. + """ + def begin_userDisconnected(self, state, _response=None, _ex=None, _sent=None, context=None): + return _M_MumbleServer.ServerCallback._op_userDisconnected.begin(self, ((state, ), _response, _ex, _sent, context)) + + """ + Called when a user disconnects from the server. The user has already been removed, so you can no longer use methods like Server.getState + to retrieve the user's state. + Arguments: + state -- State of disconnected user. + """ + def end_userDisconnected(self, _r): + return _M_MumbleServer.ServerCallback._op_userDisconnected.end(self, _r) + + """ + Called when a user state changes. This is called if the user moves, is renamed, is muted, deafened etc. + Arguments: + state -- New state of user. + context -- The request context for the invocation. + """ + def userStateChanged(self, state, context=None): + return _M_MumbleServer.ServerCallback._op_userStateChanged.invoke(self, ((state, ), context)) + + """ + Called when a user state changes. This is called if the user moves, is renamed, is muted, deafened etc. + Arguments: + state -- New state of user. + context -- The request context for the invocation. + Returns: A future object for the invocation. + """ + def userStateChangedAsync(self, state, context=None): + return _M_MumbleServer.ServerCallback._op_userStateChanged.invokeAsync(self, ((state, ), context)) + + """ + Called when a user state changes. This is called if the user moves, is renamed, is muted, deafened etc. + Arguments: + state -- New state of user. + _response -- The asynchronous response callback. + _ex -- The asynchronous exception callback. + _sent -- The asynchronous sent callback. + context -- The request context for the invocation. + Returns: An asynchronous result object for the invocation. + """ + def begin_userStateChanged(self, state, _response=None, _ex=None, _sent=None, context=None): + return _M_MumbleServer.ServerCallback._op_userStateChanged.begin(self, ((state, ), _response, _ex, _sent, context)) + + """ + Called when a user state changes. This is called if the user moves, is renamed, is muted, deafened etc. + Arguments: + state -- New state of user. + """ + def end_userStateChanged(self, _r): + return _M_MumbleServer.ServerCallback._op_userStateChanged.end(self, _r) + + """ + Called when user writes a text message + Arguments: + state -- the User sending the message + message -- the TextMessage the user has sent + context -- The request context for the invocation. + """ + def userTextMessage(self, state, message, context=None): + return _M_MumbleServer.ServerCallback._op_userTextMessage.invoke(self, ((state, message), context)) + + """ + Called when user writes a text message + Arguments: + state -- the User sending the message + message -- the TextMessage the user has sent + context -- The request context for the invocation. + Returns: A future object for the invocation. + """ + def userTextMessageAsync(self, state, message, context=None): + return _M_MumbleServer.ServerCallback._op_userTextMessage.invokeAsync(self, ((state, message), context)) + + """ + Called when user writes a text message + Arguments: + state -- the User sending the message + message -- the TextMessage the user has sent + _response -- The asynchronous response callback. + _ex -- The asynchronous exception callback. + _sent -- The asynchronous sent callback. + context -- The request context for the invocation. + Returns: An asynchronous result object for the invocation. + """ + def begin_userTextMessage(self, state, message, _response=None, _ex=None, _sent=None, context=None): + return _M_MumbleServer.ServerCallback._op_userTextMessage.begin(self, ((state, message), _response, _ex, _sent, context)) + + """ + Called when user writes a text message + Arguments: + state -- the User sending the message + message -- the TextMessage the user has sent + """ + def end_userTextMessage(self, _r): + return _M_MumbleServer.ServerCallback._op_userTextMessage.end(self, _r) + + """ + Called when a new channel is created. + Arguments: + state -- State of new channel. + context -- The request context for the invocation. + """ + def channelCreated(self, state, context=None): + return _M_MumbleServer.ServerCallback._op_channelCreated.invoke(self, ((state, ), context)) + + """ + Called when a new channel is created. + Arguments: + state -- State of new channel. + context -- The request context for the invocation. + Returns: A future object for the invocation. + """ + def channelCreatedAsync(self, state, context=None): + return _M_MumbleServer.ServerCallback._op_channelCreated.invokeAsync(self, ((state, ), context)) + + """ + Called when a new channel is created. + Arguments: + state -- State of new channel. + _response -- The asynchronous response callback. + _ex -- The asynchronous exception callback. + _sent -- The asynchronous sent callback. + context -- The request context for the invocation. + Returns: An asynchronous result object for the invocation. + """ + def begin_channelCreated(self, state, _response=None, _ex=None, _sent=None, context=None): + return _M_MumbleServer.ServerCallback._op_channelCreated.begin(self, ((state, ), _response, _ex, _sent, context)) + + """ + Called when a new channel is created. + Arguments: + state -- State of new channel. + """ + def end_channelCreated(self, _r): + return _M_MumbleServer.ServerCallback._op_channelCreated.end(self, _r) + + """ + Called when a channel is removed. The channel has already been removed, you can no longer use methods like Server.getChannelState + Arguments: + state -- State of removed channel. + context -- The request context for the invocation. + """ + def channelRemoved(self, state, context=None): + return _M_MumbleServer.ServerCallback._op_channelRemoved.invoke(self, ((state, ), context)) + + """ + Called when a channel is removed. The channel has already been removed, you can no longer use methods like Server.getChannelState + Arguments: + state -- State of removed channel. + context -- The request context for the invocation. + Returns: A future object for the invocation. + """ + def channelRemovedAsync(self, state, context=None): + return _M_MumbleServer.ServerCallback._op_channelRemoved.invokeAsync(self, ((state, ), context)) + + """ + Called when a channel is removed. The channel has already been removed, you can no longer use methods like Server.getChannelState + Arguments: + state -- State of removed channel. + _response -- The asynchronous response callback. + _ex -- The asynchronous exception callback. + _sent -- The asynchronous sent callback. + context -- The request context for the invocation. + Returns: An asynchronous result object for the invocation. + """ + def begin_channelRemoved(self, state, _response=None, _ex=None, _sent=None, context=None): + return _M_MumbleServer.ServerCallback._op_channelRemoved.begin(self, ((state, ), _response, _ex, _sent, context)) + + """ + Called when a channel is removed. The channel has already been removed, you can no longer use methods like Server.getChannelState + Arguments: + state -- State of removed channel. + """ + def end_channelRemoved(self, _r): + return _M_MumbleServer.ServerCallback._op_channelRemoved.end(self, _r) + + """ + Called when a new channel state changes. This is called if the channel is moved, renamed or if new links are added. + Arguments: + state -- New state of channel. + context -- The request context for the invocation. + """ + def channelStateChanged(self, state, context=None): + return _M_MumbleServer.ServerCallback._op_channelStateChanged.invoke(self, ((state, ), context)) + + """ + Called when a new channel state changes. This is called if the channel is moved, renamed or if new links are added. + Arguments: + state -- New state of channel. + context -- The request context for the invocation. + Returns: A future object for the invocation. + """ + def channelStateChangedAsync(self, state, context=None): + return _M_MumbleServer.ServerCallback._op_channelStateChanged.invokeAsync(self, ((state, ), context)) + + """ + Called when a new channel state changes. This is called if the channel is moved, renamed or if new links are added. + Arguments: + state -- New state of channel. + _response -- The asynchronous response callback. + _ex -- The asynchronous exception callback. + _sent -- The asynchronous sent callback. + context -- The request context for the invocation. + Returns: An asynchronous result object for the invocation. + """ + def begin_channelStateChanged(self, state, _response=None, _ex=None, _sent=None, context=None): + return _M_MumbleServer.ServerCallback._op_channelStateChanged.begin(self, ((state, ), _response, _ex, _sent, context)) + + """ + Called when a new channel state changes. This is called if the channel is moved, renamed or if new links are added. + Arguments: + state -- New state of channel. + """ + def end_channelStateChanged(self, _r): + return _M_MumbleServer.ServerCallback._op_channelStateChanged.end(self, _r) + + @staticmethod + def checkedCast(proxy, facetOrContext=None, context=None): + return _M_MumbleServer.ServerCallbackPrx.ice_checkedCast(proxy, '::MumbleServer::ServerCallback', facetOrContext, context) + + @staticmethod + def uncheckedCast(proxy, facet=None): + return _M_MumbleServer.ServerCallbackPrx.ice_uncheckedCast(proxy, facet) + + @staticmethod + def ice_staticId(): + return '::MumbleServer::ServerCallback' + _M_MumbleServer._t_ServerCallbackPrx = IcePy.defineProxy('::MumbleServer::ServerCallback', ServerCallbackPrx) + + _M_MumbleServer.ServerCallbackPrx = ServerCallbackPrx + del ServerCallbackPrx + + _M_MumbleServer.ServerCallback = Ice.createTempClass() + class ServerCallback(Ice.Object): + + def ice_ids(self, current=None): + return ('::Ice::Object', '::MumbleServer::ServerCallback') + + def ice_id(self, current=None): + return '::MumbleServer::ServerCallback' + + @staticmethod + def ice_staticId(): + return '::MumbleServer::ServerCallback' + + def userConnected(self, state, current=None): + """ + Called when a user connects to the server. + Arguments: + state -- State of connected user. + current -- The Current object for the invocation. + Returns: A future object for the invocation. + """ + raise NotImplementedError("servant method 'userConnected' not implemented") + + def userDisconnected(self, state, current=None): + """ + Called when a user disconnects from the server. The user has already been removed, so you can no longer use methods like Server.getState + to retrieve the user's state. + Arguments: + state -- State of disconnected user. + current -- The Current object for the invocation. + Returns: A future object for the invocation. + """ + raise NotImplementedError("servant method 'userDisconnected' not implemented") + + def userStateChanged(self, state, current=None): + """ + Called when a user state changes. This is called if the user moves, is renamed, is muted, deafened etc. + Arguments: + state -- New state of user. + current -- The Current object for the invocation. + Returns: A future object for the invocation. + """ + raise NotImplementedError("servant method 'userStateChanged' not implemented") + + def userTextMessage(self, state, message, current=None): + """ + Called when user writes a text message + Arguments: + state -- the User sending the message + message -- the TextMessage the user has sent + current -- The Current object for the invocation. + Returns: A future object for the invocation. + """ + raise NotImplementedError("servant method 'userTextMessage' not implemented") + + def channelCreated(self, state, current=None): + """ + Called when a new channel is created. + Arguments: + state -- State of new channel. + current -- The Current object for the invocation. + Returns: A future object for the invocation. + """ + raise NotImplementedError("servant method 'channelCreated' not implemented") + + def channelRemoved(self, state, current=None): + """ + Called when a channel is removed. The channel has already been removed, you can no longer use methods like Server.getChannelState + Arguments: + state -- State of removed channel. + current -- The Current object for the invocation. + Returns: A future object for the invocation. + """ + raise NotImplementedError("servant method 'channelRemoved' not implemented") + + def channelStateChanged(self, state, current=None): + """ + Called when a new channel state changes. This is called if the channel is moved, renamed or if new links are added. + Arguments: + state -- New state of channel. + current -- The Current object for the invocation. + Returns: A future object for the invocation. + """ + raise NotImplementedError("servant method 'channelStateChanged' not implemented") + + def __str__(self): + return IcePy.stringify(self, _M_MumbleServer._t_ServerCallbackDisp) + + __repr__ = __str__ + + _M_MumbleServer._t_ServerCallbackDisp = IcePy.defineClass('::MumbleServer::ServerCallback', ServerCallback, (), None, ()) + ServerCallback._ice_type = _M_MumbleServer._t_ServerCallbackDisp + + ServerCallback._op_userConnected = IcePy.Operation('userConnected', Ice.OperationMode.Idempotent, Ice.OperationMode.Idempotent, False, None, (), (((), _M_MumbleServer._t_User, False, 0),), (), None, ()) + ServerCallback._op_userDisconnected = IcePy.Operation('userDisconnected', Ice.OperationMode.Idempotent, Ice.OperationMode.Idempotent, False, None, (), (((), _M_MumbleServer._t_User, False, 0),), (), None, ()) + ServerCallback._op_userStateChanged = IcePy.Operation('userStateChanged', Ice.OperationMode.Idempotent, Ice.OperationMode.Idempotent, False, None, (), (((), _M_MumbleServer._t_User, False, 0),), (), None, ()) + ServerCallback._op_userTextMessage = IcePy.Operation('userTextMessage', Ice.OperationMode.Idempotent, Ice.OperationMode.Idempotent, False, None, (), (((), _M_MumbleServer._t_User, False, 0), ((), _M_MumbleServer._t_TextMessage, False, 0)), (), None, ()) + ServerCallback._op_channelCreated = IcePy.Operation('channelCreated', Ice.OperationMode.Idempotent, Ice.OperationMode.Idempotent, False, None, (), (((), _M_MumbleServer._t_Channel, False, 0),), (), None, ()) + ServerCallback._op_channelRemoved = IcePy.Operation('channelRemoved', Ice.OperationMode.Idempotent, Ice.OperationMode.Idempotent, False, None, (), (((), _M_MumbleServer._t_Channel, False, 0),), (), None, ()) + ServerCallback._op_channelStateChanged = IcePy.Operation('channelStateChanged', Ice.OperationMode.Idempotent, Ice.OperationMode.Idempotent, False, None, (), (((), _M_MumbleServer._t_Channel, False, 0),), (), None, ()) + + _M_MumbleServer.ServerCallback = ServerCallback + del ServerCallback + +_M_MumbleServer.ContextServer = 1 + +_M_MumbleServer.ContextChannel = 2 + +_M_MumbleServer.ContextUser = 4 + +_M_MumbleServer._t_ServerContextCallback = IcePy.defineValue('::MumbleServer::ServerContextCallback', Ice.Value, -1, (), False, True, None, ()) + +if 'ServerContextCallbackPrx' not in _M_MumbleServer.__dict__: + _M_MumbleServer.ServerContextCallbackPrx = Ice.createTempClass() + class ServerContextCallbackPrx(Ice.ObjectPrx): + + """ + Called when a context action is performed. + Arguments: + action -- Action to be performed. + usr -- User which initiated the action. + session -- If nonzero, session of target user. + channelid -- If not -1, id of target channel. + context -- The request context for the invocation. + """ + def contextAction(self, action, usr, session, channelid, context=None): + return _M_MumbleServer.ServerContextCallback._op_contextAction.invoke(self, ((action, usr, session, channelid), context)) + + """ + Called when a context action is performed. + Arguments: + action -- Action to be performed. + usr -- User which initiated the action. + session -- If nonzero, session of target user. + channelid -- If not -1, id of target channel. + context -- The request context for the invocation. + Returns: A future object for the invocation. + """ + def contextActionAsync(self, action, usr, session, channelid, context=None): + return _M_MumbleServer.ServerContextCallback._op_contextAction.invokeAsync(self, ((action, usr, session, channelid), context)) + + """ + Called when a context action is performed. + Arguments: + action -- Action to be performed. + usr -- User which initiated the action. + session -- If nonzero, session of target user. + channelid -- If not -1, id of target channel. + _response -- The asynchronous response callback. + _ex -- The asynchronous exception callback. + _sent -- The asynchronous sent callback. + context -- The request context for the invocation. + Returns: An asynchronous result object for the invocation. + """ + def begin_contextAction(self, action, usr, session, channelid, _response=None, _ex=None, _sent=None, context=None): + return _M_MumbleServer.ServerContextCallback._op_contextAction.begin(self, ((action, usr, session, channelid), _response, _ex, _sent, context)) + + """ + Called when a context action is performed. + Arguments: + action -- Action to be performed. + usr -- User which initiated the action. + session -- If nonzero, session of target user. + channelid -- If not -1, id of target channel. + """ + def end_contextAction(self, _r): + return _M_MumbleServer.ServerContextCallback._op_contextAction.end(self, _r) + + @staticmethod + def checkedCast(proxy, facetOrContext=None, context=None): + return _M_MumbleServer.ServerContextCallbackPrx.ice_checkedCast(proxy, '::MumbleServer::ServerContextCallback', facetOrContext, context) + + @staticmethod + def uncheckedCast(proxy, facet=None): + return _M_MumbleServer.ServerContextCallbackPrx.ice_uncheckedCast(proxy, facet) + + @staticmethod + def ice_staticId(): + return '::MumbleServer::ServerContextCallback' + _M_MumbleServer._t_ServerContextCallbackPrx = IcePy.defineProxy('::MumbleServer::ServerContextCallback', ServerContextCallbackPrx) + + _M_MumbleServer.ServerContextCallbackPrx = ServerContextCallbackPrx + del ServerContextCallbackPrx + + _M_MumbleServer.ServerContextCallback = Ice.createTempClass() + class ServerContextCallback(Ice.Object): + + def ice_ids(self, current=None): + return ('::Ice::Object', '::MumbleServer::ServerContextCallback') + + def ice_id(self, current=None): + return '::MumbleServer::ServerContextCallback' + + @staticmethod + def ice_staticId(): + return '::MumbleServer::ServerContextCallback' + + def contextAction(self, action, usr, session, channelid, current=None): + """ + Called when a context action is performed. + Arguments: + action -- Action to be performed. + usr -- User which initiated the action. + session -- If nonzero, session of target user. + channelid -- If not -1, id of target channel. + current -- The Current object for the invocation. + Returns: A future object for the invocation. + """ + raise NotImplementedError("servant method 'contextAction' not implemented") + + def __str__(self): + return IcePy.stringify(self, _M_MumbleServer._t_ServerContextCallbackDisp) + + __repr__ = __str__ + + _M_MumbleServer._t_ServerContextCallbackDisp = IcePy.defineClass('::MumbleServer::ServerContextCallback', ServerContextCallback, (), None, ()) + ServerContextCallback._ice_type = _M_MumbleServer._t_ServerContextCallbackDisp + + ServerContextCallback._op_contextAction = IcePy.Operation('contextAction', Ice.OperationMode.Idempotent, Ice.OperationMode.Idempotent, False, None, (), (((), IcePy._t_string, False, 0), ((), _M_MumbleServer._t_User, False, 0), ((), IcePy._t_int, False, 0), ((), IcePy._t_int, False, 0)), (), None, ()) + + _M_MumbleServer.ServerContextCallback = ServerContextCallback + del ServerContextCallback + +_M_MumbleServer._t_ServerAuthenticator = IcePy.defineValue('::MumbleServer::ServerAuthenticator', Ice.Value, -1, (), False, True, None, ()) + +if 'ServerAuthenticatorPrx' not in _M_MumbleServer.__dict__: + _M_MumbleServer.ServerAuthenticatorPrx = Ice.createTempClass() + class ServerAuthenticatorPrx(Ice.ObjectPrx): + + """ + Called to authenticate a user. If you do not know the username in question, always return -2 from this + method to fall through to normal database authentication. + Note that if authentication succeeds, murmur will create a record of the user in it's database, reserving + the username and id so it cannot be used for normal database authentication. + The data in the certificate (name, email addresses etc), as well as the list of signing certificates, + should only be trusted if certstrong is true. + Internally, Murmur treats usernames as case-insensitive. It is recommended + that authenticators do the same. Murmur checks if a username is in use when + a user connects. If the connecting user is registered, the other username is + kicked. If the connecting user is not registered, the connecting user is not + allowed to join the server. + Arguments: + name -- Username to authenticate. + pw -- Password to authenticate with. + certificates -- List of der encoded certificates the user connected with. + certhash -- Hash of user certificate, as used by murmur internally when matching. + certstrong -- True if certificate was valid and signed by a trusted CA. + context -- The request context for the invocation. + Returns a tuple containing the following: + _retval -- UserID of authenticated user, -1 for authentication failures, -2 for unknown user (fallthrough), -3 for authentication failures where the data could (temporarily) not be verified. + newname -- Set this to change the username from the supplied one. + groups -- List of groups on the root channel that the user will be added to for the duration of the connection. + """ + def authenticate(self, name, pw, certificates, certhash, certstrong, context=None): + return _M_MumbleServer.ServerAuthenticator._op_authenticate.invoke(self, ((name, pw, certificates, certhash, certstrong), context)) + + """ + Called to authenticate a user. If you do not know the username in question, always return -2 from this + method to fall through to normal database authentication. + Note that if authentication succeeds, murmur will create a record of the user in it's database, reserving + the username and id so it cannot be used for normal database authentication. + The data in the certificate (name, email addresses etc), as well as the list of signing certificates, + should only be trusted if certstrong is true. + Internally, Murmur treats usernames as case-insensitive. It is recommended + that authenticators do the same. Murmur checks if a username is in use when + a user connects. If the connecting user is registered, the other username is + kicked. If the connecting user is not registered, the connecting user is not + allowed to join the server. + Arguments: + name -- Username to authenticate. + pw -- Password to authenticate with. + certificates -- List of der encoded certificates the user connected with. + certhash -- Hash of user certificate, as used by murmur internally when matching. + certstrong -- True if certificate was valid and signed by a trusted CA. + context -- The request context for the invocation. + Returns: A future object for the invocation. + """ + def authenticateAsync(self, name, pw, certificates, certhash, certstrong, context=None): + return _M_MumbleServer.ServerAuthenticator._op_authenticate.invokeAsync(self, ((name, pw, certificates, certhash, certstrong), context)) + + """ + Called to authenticate a user. If you do not know the username in question, always return -2 from this + method to fall through to normal database authentication. + Note that if authentication succeeds, murmur will create a record of the user in it's database, reserving + the username and id so it cannot be used for normal database authentication. + The data in the certificate (name, email addresses etc), as well as the list of signing certificates, + should only be trusted if certstrong is true. + Internally, Murmur treats usernames as case-insensitive. It is recommended + that authenticators do the same. Murmur checks if a username is in use when + a user connects. If the connecting user is registered, the other username is + kicked. If the connecting user is not registered, the connecting user is not + allowed to join the server. + Arguments: + name -- Username to authenticate. + pw -- Password to authenticate with. + certificates -- List of der encoded certificates the user connected with. + certhash -- Hash of user certificate, as used by murmur internally when matching. + certstrong -- True if certificate was valid and signed by a trusted CA. + _response -- The asynchronous response callback. + _ex -- The asynchronous exception callback. + _sent -- The asynchronous sent callback. + context -- The request context for the invocation. + Returns: An asynchronous result object for the invocation. + """ + def begin_authenticate(self, name, pw, certificates, certhash, certstrong, _response=None, _ex=None, _sent=None, context=None): + return _M_MumbleServer.ServerAuthenticator._op_authenticate.begin(self, ((name, pw, certificates, certhash, certstrong), _response, _ex, _sent, context)) + + """ + Called to authenticate a user. If you do not know the username in question, always return -2 from this + method to fall through to normal database authentication. + Note that if authentication succeeds, murmur will create a record of the user in it's database, reserving + the username and id so it cannot be used for normal database authentication. + The data in the certificate (name, email addresses etc), as well as the list of signing certificates, + should only be trusted if certstrong is true. + Internally, Murmur treats usernames as case-insensitive. It is recommended + that authenticators do the same. Murmur checks if a username is in use when + a user connects. If the connecting user is registered, the other username is + kicked. If the connecting user is not registered, the connecting user is not + allowed to join the server. + Arguments: + name -- Username to authenticate. + pw -- Password to authenticate with. + certificates -- List of der encoded certificates the user connected with. + certhash -- Hash of user certificate, as used by murmur internally when matching. + certstrong -- True if certificate was valid and signed by a trusted CA. + Returns a tuple containing the following: + _retval -- UserID of authenticated user, -1 for authentication failures, -2 for unknown user (fallthrough), -3 for authentication failures where the data could (temporarily) not be verified. + newname -- Set this to change the username from the supplied one. + groups -- List of groups on the root channel that the user will be added to for the duration of the connection. + """ + def end_authenticate(self, _r): + return _M_MumbleServer.ServerAuthenticator._op_authenticate.end(self, _r) + + """ + Fetch information about a user. This is used to retrieve information like email address, keyhash etc. If you + want murmur to take care of this information itself, simply return false to fall through. + Arguments: + id -- User id. + context -- The request context for the invocation. + Returns a tuple containing the following: + _retval -- true if information is present, false to fall through. + info -- Information about user. This needs to include at least "name". + """ + def getInfo(self, id, context=None): + return _M_MumbleServer.ServerAuthenticator._op_getInfo.invoke(self, ((id, ), context)) + + """ + Fetch information about a user. This is used to retrieve information like email address, keyhash etc. If you + want murmur to take care of this information itself, simply return false to fall through. + Arguments: + id -- User id. + context -- The request context for the invocation. + Returns: A future object for the invocation. + """ + def getInfoAsync(self, id, context=None): + return _M_MumbleServer.ServerAuthenticator._op_getInfo.invokeAsync(self, ((id, ), context)) + + """ + Fetch information about a user. This is used to retrieve information like email address, keyhash etc. If you + want murmur to take care of this information itself, simply return false to fall through. + Arguments: + id -- User id. + _response -- The asynchronous response callback. + _ex -- The asynchronous exception callback. + _sent -- The asynchronous sent callback. + context -- The request context for the invocation. + Returns: An asynchronous result object for the invocation. + """ + def begin_getInfo(self, id, _response=None, _ex=None, _sent=None, context=None): + return _M_MumbleServer.ServerAuthenticator._op_getInfo.begin(self, ((id, ), _response, _ex, _sent, context)) + + """ + Fetch information about a user. This is used to retrieve information like email address, keyhash etc. If you + want murmur to take care of this information itself, simply return false to fall through. + Arguments: + id -- User id. + Returns a tuple containing the following: + _retval -- true if information is present, false to fall through. + info -- Information about user. This needs to include at least "name". + """ + def end_getInfo(self, _r): + return _M_MumbleServer.ServerAuthenticator._op_getInfo.end(self, _r) + + """ + Map a name to a user id. + Arguments: + name -- Username to map. + context -- The request context for the invocation. + Returns: User id or -2 for unknown name. + """ + def nameToId(self, name, context=None): + return _M_MumbleServer.ServerAuthenticator._op_nameToId.invoke(self, ((name, ), context)) + + """ + Map a name to a user id. + Arguments: + name -- Username to map. + context -- The request context for the invocation. + Returns: A future object for the invocation. + """ + def nameToIdAsync(self, name, context=None): + return _M_MumbleServer.ServerAuthenticator._op_nameToId.invokeAsync(self, ((name, ), context)) + + """ + Map a name to a user id. + Arguments: + name -- Username to map. + _response -- The asynchronous response callback. + _ex -- The asynchronous exception callback. + _sent -- The asynchronous sent callback. + context -- The request context for the invocation. + Returns: An asynchronous result object for the invocation. + """ + def begin_nameToId(self, name, _response=None, _ex=None, _sent=None, context=None): + return _M_MumbleServer.ServerAuthenticator._op_nameToId.begin(self, ((name, ), _response, _ex, _sent, context)) + + """ + Map a name to a user id. + Arguments: + name -- Username to map. + Returns: User id or -2 for unknown name. + """ + def end_nameToId(self, _r): + return _M_MumbleServer.ServerAuthenticator._op_nameToId.end(self, _r) + + """ + Map a user id to a username. + Arguments: + id -- User id to map. + context -- The request context for the invocation. + Returns: Name of user or empty string for unknown id. + """ + def idToName(self, id, context=None): + return _M_MumbleServer.ServerAuthenticator._op_idToName.invoke(self, ((id, ), context)) + + """ + Map a user id to a username. + Arguments: + id -- User id to map. + context -- The request context for the invocation. + Returns: A future object for the invocation. + """ + def idToNameAsync(self, id, context=None): + return _M_MumbleServer.ServerAuthenticator._op_idToName.invokeAsync(self, ((id, ), context)) + + """ + Map a user id to a username. + Arguments: + id -- User id to map. + _response -- The asynchronous response callback. + _ex -- The asynchronous exception callback. + _sent -- The asynchronous sent callback. + context -- The request context for the invocation. + Returns: An asynchronous result object for the invocation. + """ + def begin_idToName(self, id, _response=None, _ex=None, _sent=None, context=None): + return _M_MumbleServer.ServerAuthenticator._op_idToName.begin(self, ((id, ), _response, _ex, _sent, context)) + + """ + Map a user id to a username. + Arguments: + id -- User id to map. + Returns: Name of user or empty string for unknown id. + """ + def end_idToName(self, _r): + return _M_MumbleServer.ServerAuthenticator._op_idToName.end(self, _r) + + """ + Map a user to a custom Texture. + Arguments: + id -- User id to map. + context -- The request context for the invocation. + Returns: User texture or an empty texture for unknown users or users without textures. + """ + def idToTexture(self, id, context=None): + return _M_MumbleServer.ServerAuthenticator._op_idToTexture.invoke(self, ((id, ), context)) + + """ + Map a user to a custom Texture. + Arguments: + id -- User id to map. + context -- The request context for the invocation. + Returns: A future object for the invocation. + """ + def idToTextureAsync(self, id, context=None): + return _M_MumbleServer.ServerAuthenticator._op_idToTexture.invokeAsync(self, ((id, ), context)) + + """ + Map a user to a custom Texture. + Arguments: + id -- User id to map. + _response -- The asynchronous response callback. + _ex -- The asynchronous exception callback. + _sent -- The asynchronous sent callback. + context -- The request context for the invocation. + Returns: An asynchronous result object for the invocation. + """ + def begin_idToTexture(self, id, _response=None, _ex=None, _sent=None, context=None): + return _M_MumbleServer.ServerAuthenticator._op_idToTexture.begin(self, ((id, ), _response, _ex, _sent, context)) + + """ + Map a user to a custom Texture. + Arguments: + id -- User id to map. + Returns: User texture or an empty texture for unknown users or users without textures. + """ + def end_idToTexture(self, _r): + return _M_MumbleServer.ServerAuthenticator._op_idToTexture.end(self, _r) + + @staticmethod + def checkedCast(proxy, facetOrContext=None, context=None): + return _M_MumbleServer.ServerAuthenticatorPrx.ice_checkedCast(proxy, '::MumbleServer::ServerAuthenticator', facetOrContext, context) + + @staticmethod + def uncheckedCast(proxy, facet=None): + return _M_MumbleServer.ServerAuthenticatorPrx.ice_uncheckedCast(proxy, facet) + + @staticmethod + def ice_staticId(): + return '::MumbleServer::ServerAuthenticator' + _M_MumbleServer._t_ServerAuthenticatorPrx = IcePy.defineProxy('::MumbleServer::ServerAuthenticator', ServerAuthenticatorPrx) + + _M_MumbleServer.ServerAuthenticatorPrx = ServerAuthenticatorPrx + del ServerAuthenticatorPrx + + _M_MumbleServer.ServerAuthenticator = Ice.createTempClass() + class ServerAuthenticator(Ice.Object): + + def ice_ids(self, current=None): + return ('::Ice::Object', '::MumbleServer::ServerAuthenticator') + + def ice_id(self, current=None): + return '::MumbleServer::ServerAuthenticator' + + @staticmethod + def ice_staticId(): + return '::MumbleServer::ServerAuthenticator' + + def authenticate(self, name, pw, certificates, certhash, certstrong, current=None): + """ + Called to authenticate a user. If you do not know the username in question, always return -2 from this + method to fall through to normal database authentication. + Note that if authentication succeeds, murmur will create a record of the user in it's database, reserving + the username and id so it cannot be used for normal database authentication. + The data in the certificate (name, email addresses etc), as well as the list of signing certificates, + should only be trusted if certstrong is true. + Internally, Murmur treats usernames as case-insensitive. It is recommended + that authenticators do the same. Murmur checks if a username is in use when + a user connects. If the connecting user is registered, the other username is + kicked. If the connecting user is not registered, the connecting user is not + allowed to join the server. + Arguments: + name -- Username to authenticate. + pw -- Password to authenticate with. + certificates -- List of der encoded certificates the user connected with. + certhash -- Hash of user certificate, as used by murmur internally when matching. + certstrong -- True if certificate was valid and signed by a trusted CA. + current -- The Current object for the invocation. + Returns: A future object for the invocation. + """ + raise NotImplementedError("servant method 'authenticate' not implemented") + + def getInfo(self, id, current=None): + """ + Fetch information about a user. This is used to retrieve information like email address, keyhash etc. If you + want murmur to take care of this information itself, simply return false to fall through. + Arguments: + id -- User id. + current -- The Current object for the invocation. + Returns: A future object for the invocation. + """ + raise NotImplementedError("servant method 'getInfo' not implemented") + + def nameToId(self, name, current=None): + """ + Map a name to a user id. + Arguments: + name -- Username to map. + current -- The Current object for the invocation. + Returns: A future object for the invocation. + """ + raise NotImplementedError("servant method 'nameToId' not implemented") + + def idToName(self, id, current=None): + """ + Map a user id to a username. + Arguments: + id -- User id to map. + current -- The Current object for the invocation. + Returns: A future object for the invocation. + """ + raise NotImplementedError("servant method 'idToName' not implemented") + + def idToTexture(self, id, current=None): + """ + Map a user to a custom Texture. + Arguments: + id -- User id to map. + current -- The Current object for the invocation. + Returns: A future object for the invocation. + """ + raise NotImplementedError("servant method 'idToTexture' not implemented") + + def __str__(self): + return IcePy.stringify(self, _M_MumbleServer._t_ServerAuthenticatorDisp) + + __repr__ = __str__ + + _M_MumbleServer._t_ServerAuthenticatorDisp = IcePy.defineClass('::MumbleServer::ServerAuthenticator', ServerAuthenticator, (), None, ()) + ServerAuthenticator._ice_type = _M_MumbleServer._t_ServerAuthenticatorDisp + + ServerAuthenticator._op_authenticate = IcePy.Operation('authenticate', Ice.OperationMode.Idempotent, Ice.OperationMode.Idempotent, False, None, (), (((), IcePy._t_string, False, 0), ((), IcePy._t_string, False, 0), ((), _M_MumbleServer._t_CertificateList, False, 0), ((), IcePy._t_string, False, 0), ((), IcePy._t_bool, False, 0)), (((), IcePy._t_string, False, 0), ((), _M_MumbleServer._t_GroupNameList, False, 0)), ((), IcePy._t_int, False, 0), ()) + ServerAuthenticator._op_getInfo = IcePy.Operation('getInfo', Ice.OperationMode.Idempotent, Ice.OperationMode.Idempotent, False, None, (), (((), IcePy._t_int, False, 0),), (((), _M_MumbleServer._t_UserInfoMap, False, 0),), ((), IcePy._t_bool, False, 0), ()) + ServerAuthenticator._op_nameToId = IcePy.Operation('nameToId', Ice.OperationMode.Idempotent, Ice.OperationMode.Idempotent, False, None, (), (((), IcePy._t_string, False, 0),), (), ((), IcePy._t_int, False, 0), ()) + ServerAuthenticator._op_idToName = IcePy.Operation('idToName', Ice.OperationMode.Idempotent, Ice.OperationMode.Idempotent, False, None, (), (((), IcePy._t_int, False, 0),), (), ((), IcePy._t_string, False, 0), ()) + ServerAuthenticator._op_idToTexture = IcePy.Operation('idToTexture', Ice.OperationMode.Idempotent, Ice.OperationMode.Idempotent, False, None, (), (((), IcePy._t_int, False, 0),), (), ((), _M_MumbleServer._t_Texture, False, 0), ()) + + _M_MumbleServer.ServerAuthenticator = ServerAuthenticator + del ServerAuthenticator + +_M_MumbleServer._t_ServerUpdatingAuthenticator = IcePy.defineValue('::MumbleServer::ServerUpdatingAuthenticator', Ice.Value, -1, (), False, True, None, ()) + +if 'ServerUpdatingAuthenticatorPrx' not in _M_MumbleServer.__dict__: + _M_MumbleServer.ServerUpdatingAuthenticatorPrx = Ice.createTempClass() + class ServerUpdatingAuthenticatorPrx(_M_MumbleServer.ServerAuthenticatorPrx): + + """ + Register a new user. + Arguments: + info -- Information about user to register. + context -- The request context for the invocation. + Returns: User id of new user, -1 for registration failure, or -2 to fall through. + """ + def registerUser(self, info, context=None): + return _M_MumbleServer.ServerUpdatingAuthenticator._op_registerUser.invoke(self, ((info, ), context)) + + """ + Register a new user. + Arguments: + info -- Information about user to register. + context -- The request context for the invocation. + Returns: A future object for the invocation. + """ + def registerUserAsync(self, info, context=None): + return _M_MumbleServer.ServerUpdatingAuthenticator._op_registerUser.invokeAsync(self, ((info, ), context)) + + """ + Register a new user. + Arguments: + info -- Information about user to register. + _response -- The asynchronous response callback. + _ex -- The asynchronous exception callback. + _sent -- The asynchronous sent callback. + context -- The request context for the invocation. + Returns: An asynchronous result object for the invocation. + """ + def begin_registerUser(self, info, _response=None, _ex=None, _sent=None, context=None): + return _M_MumbleServer.ServerUpdatingAuthenticator._op_registerUser.begin(self, ((info, ), _response, _ex, _sent, context)) + + """ + Register a new user. + Arguments: + info -- Information about user to register. + Returns: User id of new user, -1 for registration failure, or -2 to fall through. + """ + def end_registerUser(self, _r): + return _M_MumbleServer.ServerUpdatingAuthenticator._op_registerUser.end(self, _r) + + """ + Unregister a user. + Arguments: + id -- Userid to unregister. + context -- The request context for the invocation. + Returns: 1 for successful unregistration, 0 for unsuccessful unregistration, -1 to fall through. + """ + def unregisterUser(self, id, context=None): + return _M_MumbleServer.ServerUpdatingAuthenticator._op_unregisterUser.invoke(self, ((id, ), context)) + + """ + Unregister a user. + Arguments: + id -- Userid to unregister. + context -- The request context for the invocation. + Returns: A future object for the invocation. + """ + def unregisterUserAsync(self, id, context=None): + return _M_MumbleServer.ServerUpdatingAuthenticator._op_unregisterUser.invokeAsync(self, ((id, ), context)) + + """ + Unregister a user. + Arguments: + id -- Userid to unregister. + _response -- The asynchronous response callback. + _ex -- The asynchronous exception callback. + _sent -- The asynchronous sent callback. + context -- The request context for the invocation. + Returns: An asynchronous result object for the invocation. + """ + def begin_unregisterUser(self, id, _response=None, _ex=None, _sent=None, context=None): + return _M_MumbleServer.ServerUpdatingAuthenticator._op_unregisterUser.begin(self, ((id, ), _response, _ex, _sent, context)) + + """ + Unregister a user. + Arguments: + id -- Userid to unregister. + Returns: 1 for successful unregistration, 0 for unsuccessful unregistration, -1 to fall through. + """ + def end_unregisterUser(self, _r): + return _M_MumbleServer.ServerUpdatingAuthenticator._op_unregisterUser.end(self, _r) + + """ + Get a list of registered users matching filter. + Arguments: + filter -- Substring usernames must contain. If empty, return all registered users. + context -- The request context for the invocation. + Returns: List of matching registered users. + """ + def getRegisteredUsers(self, filter, context=None): + return _M_MumbleServer.ServerUpdatingAuthenticator._op_getRegisteredUsers.invoke(self, ((filter, ), context)) + + """ + Get a list of registered users matching filter. + Arguments: + filter -- Substring usernames must contain. If empty, return all registered users. + context -- The request context for the invocation. + Returns: A future object for the invocation. + """ + def getRegisteredUsersAsync(self, filter, context=None): + return _M_MumbleServer.ServerUpdatingAuthenticator._op_getRegisteredUsers.invokeAsync(self, ((filter, ), context)) + + """ + Get a list of registered users matching filter. + Arguments: + filter -- Substring usernames must contain. If empty, return all registered users. + _response -- The asynchronous response callback. + _ex -- The asynchronous exception callback. + _sent -- The asynchronous sent callback. + context -- The request context for the invocation. + Returns: An asynchronous result object for the invocation. + """ + def begin_getRegisteredUsers(self, filter, _response=None, _ex=None, _sent=None, context=None): + return _M_MumbleServer.ServerUpdatingAuthenticator._op_getRegisteredUsers.begin(self, ((filter, ), _response, _ex, _sent, context)) + + """ + Get a list of registered users matching filter. + Arguments: + filter -- Substring usernames must contain. If empty, return all registered users. + Returns: List of matching registered users. + """ + def end_getRegisteredUsers(self, _r): + return _M_MumbleServer.ServerUpdatingAuthenticator._op_getRegisteredUsers.end(self, _r) + + """ + Set additional information for user registration. + Arguments: + id -- Userid of registered user. + info -- Information to set about user. This should be merged with existing information. + context -- The request context for the invocation. + Returns: 1 for successful update, 0 for unsuccessful update, -1 to fall through. + """ + def setInfo(self, id, info, context=None): + return _M_MumbleServer.ServerUpdatingAuthenticator._op_setInfo.invoke(self, ((id, info), context)) + + """ + Set additional information for user registration. + Arguments: + id -- Userid of registered user. + info -- Information to set about user. This should be merged with existing information. + context -- The request context for the invocation. + Returns: A future object for the invocation. + """ + def setInfoAsync(self, id, info, context=None): + return _M_MumbleServer.ServerUpdatingAuthenticator._op_setInfo.invokeAsync(self, ((id, info), context)) + + """ + Set additional information for user registration. + Arguments: + id -- Userid of registered user. + info -- Information to set about user. This should be merged with existing information. + _response -- The asynchronous response callback. + _ex -- The asynchronous exception callback. + _sent -- The asynchronous sent callback. + context -- The request context for the invocation. + Returns: An asynchronous result object for the invocation. + """ + def begin_setInfo(self, id, info, _response=None, _ex=None, _sent=None, context=None): + return _M_MumbleServer.ServerUpdatingAuthenticator._op_setInfo.begin(self, ((id, info), _response, _ex, _sent, context)) + + """ + Set additional information for user registration. + Arguments: + id -- Userid of registered user. + info -- Information to set about user. This should be merged with existing information. + Returns: 1 for successful update, 0 for unsuccessful update, -1 to fall through. + """ + def end_setInfo(self, _r): + return _M_MumbleServer.ServerUpdatingAuthenticator._op_setInfo.end(self, _r) + + """ + Set texture (now called avatar) of user registration. + Arguments: + id -- registrationId of registered user. + tex -- New texture. + context -- The request context for the invocation. + Returns: 1 for successful update, 0 for unsuccessful update, -1 to fall through. + """ + def setTexture(self, id, tex, context=None): + return _M_MumbleServer.ServerUpdatingAuthenticator._op_setTexture.invoke(self, ((id, tex), context)) + + """ + Set texture (now called avatar) of user registration. + Arguments: + id -- registrationId of registered user. + tex -- New texture. + context -- The request context for the invocation. + Returns: A future object for the invocation. + """ + def setTextureAsync(self, id, tex, context=None): + return _M_MumbleServer.ServerUpdatingAuthenticator._op_setTexture.invokeAsync(self, ((id, tex), context)) + + """ + Set texture (now called avatar) of user registration. + Arguments: + id -- registrationId of registered user. + tex -- New texture. + _response -- The asynchronous response callback. + _ex -- The asynchronous exception callback. + _sent -- The asynchronous sent callback. + context -- The request context for the invocation. + Returns: An asynchronous result object for the invocation. + """ + def begin_setTexture(self, id, tex, _response=None, _ex=None, _sent=None, context=None): + return _M_MumbleServer.ServerUpdatingAuthenticator._op_setTexture.begin(self, ((id, tex), _response, _ex, _sent, context)) + + """ + Set texture (now called avatar) of user registration. + Arguments: + id -- registrationId of registered user. + tex -- New texture. + Returns: 1 for successful update, 0 for unsuccessful update, -1 to fall through. + """ + def end_setTexture(self, _r): + return _M_MumbleServer.ServerUpdatingAuthenticator._op_setTexture.end(self, _r) + + @staticmethod + def checkedCast(proxy, facetOrContext=None, context=None): + return _M_MumbleServer.ServerUpdatingAuthenticatorPrx.ice_checkedCast(proxy, '::MumbleServer::ServerUpdatingAuthenticator', facetOrContext, context) + + @staticmethod + def uncheckedCast(proxy, facet=None): + return _M_MumbleServer.ServerUpdatingAuthenticatorPrx.ice_uncheckedCast(proxy, facet) + + @staticmethod + def ice_staticId(): + return '::MumbleServer::ServerUpdatingAuthenticator' + _M_MumbleServer._t_ServerUpdatingAuthenticatorPrx = IcePy.defineProxy('::MumbleServer::ServerUpdatingAuthenticator', ServerUpdatingAuthenticatorPrx) + + _M_MumbleServer.ServerUpdatingAuthenticatorPrx = ServerUpdatingAuthenticatorPrx + del ServerUpdatingAuthenticatorPrx + + _M_MumbleServer.ServerUpdatingAuthenticator = Ice.createTempClass() + class ServerUpdatingAuthenticator(_M_MumbleServer.ServerAuthenticator): + + def ice_ids(self, current=None): + return ('::Ice::Object', '::MumbleServer::ServerAuthenticator', '::MumbleServer::ServerUpdatingAuthenticator') + + def ice_id(self, current=None): + return '::MumbleServer::ServerUpdatingAuthenticator' + + @staticmethod + def ice_staticId(): + return '::MumbleServer::ServerUpdatingAuthenticator' + + def registerUser(self, info, current=None): + """ + Register a new user. + Arguments: + info -- Information about user to register. + current -- The Current object for the invocation. + Returns: A future object for the invocation. + """ + raise NotImplementedError("servant method 'registerUser' not implemented") + + def unregisterUser(self, id, current=None): + """ + Unregister a user. + Arguments: + id -- Userid to unregister. + current -- The Current object for the invocation. + Returns: A future object for the invocation. + """ + raise NotImplementedError("servant method 'unregisterUser' not implemented") + + def getRegisteredUsers(self, filter, current=None): + """ + Get a list of registered users matching filter. + Arguments: + filter -- Substring usernames must contain. If empty, return all registered users. + current -- The Current object for the invocation. + Returns: A future object for the invocation. + """ + raise NotImplementedError("servant method 'getRegisteredUsers' not implemented") + + def setInfo(self, id, info, current=None): + """ + Set additional information for user registration. + Arguments: + id -- Userid of registered user. + info -- Information to set about user. This should be merged with existing information. + current -- The Current object for the invocation. + Returns: A future object for the invocation. + """ + raise NotImplementedError("servant method 'setInfo' not implemented") + + def setTexture(self, id, tex, current=None): + """ + Set texture (now called avatar) of user registration. + Arguments: + id -- registrationId of registered user. + tex -- New texture. + current -- The Current object for the invocation. + Returns: A future object for the invocation. + """ + raise NotImplementedError("servant method 'setTexture' not implemented") + + def __str__(self): + return IcePy.stringify(self, _M_MumbleServer._t_ServerUpdatingAuthenticatorDisp) + + __repr__ = __str__ + + _M_MumbleServer._t_ServerUpdatingAuthenticatorDisp = IcePy.defineClass('::MumbleServer::ServerUpdatingAuthenticator', ServerUpdatingAuthenticator, (), None, (_M_MumbleServer._t_ServerAuthenticatorDisp,)) + ServerUpdatingAuthenticator._ice_type = _M_MumbleServer._t_ServerUpdatingAuthenticatorDisp + + ServerUpdatingAuthenticator._op_registerUser = IcePy.Operation('registerUser', Ice.OperationMode.Normal, Ice.OperationMode.Normal, False, None, (), (((), _M_MumbleServer._t_UserInfoMap, False, 0),), (), ((), IcePy._t_int, False, 0), ()) + ServerUpdatingAuthenticator._op_unregisterUser = IcePy.Operation('unregisterUser', Ice.OperationMode.Normal, Ice.OperationMode.Normal, False, None, (), (((), IcePy._t_int, False, 0),), (), ((), IcePy._t_int, False, 0), ()) + ServerUpdatingAuthenticator._op_getRegisteredUsers = IcePy.Operation('getRegisteredUsers', Ice.OperationMode.Idempotent, Ice.OperationMode.Idempotent, False, None, (), (((), IcePy._t_string, False, 0),), (), ((), _M_MumbleServer._t_NameMap, False, 0), ()) + ServerUpdatingAuthenticator._op_setInfo = IcePy.Operation('setInfo', Ice.OperationMode.Idempotent, Ice.OperationMode.Idempotent, False, None, (), (((), IcePy._t_int, False, 0), ((), _M_MumbleServer._t_UserInfoMap, False, 0)), (), ((), IcePy._t_int, False, 0), ()) + ServerUpdatingAuthenticator._op_setTexture = IcePy.Operation('setTexture', Ice.OperationMode.Idempotent, Ice.OperationMode.Idempotent, False, None, (), (((), IcePy._t_int, False, 0), ((), _M_MumbleServer._t_Texture, False, 0)), (), ((), IcePy._t_int, False, 0), ()) + + _M_MumbleServer.ServerUpdatingAuthenticator = ServerUpdatingAuthenticator + del ServerUpdatingAuthenticator + +_M_MumbleServer._t_Server = IcePy.defineValue('::MumbleServer::Server', Ice.Value, -1, (), False, True, None, ()) + +if 'ServerPrx' not in _M_MumbleServer.__dict__: + _M_MumbleServer.ServerPrx = Ice.createTempClass() + class ServerPrx(Ice.ObjectPrx): + + """ + Shows if the server currently running (accepting users). + Arguments: + context -- The request context for the invocation. + Returns: Run-state of server. + """ + def isRunning(self, context=None): + return _M_MumbleServer.Server._op_isRunning.invoke(self, ((), context)) + + """ + Shows if the server currently running (accepting users). + Arguments: + context -- The request context for the invocation. + Returns: A future object for the invocation. + """ + def isRunningAsync(self, context=None): + return _M_MumbleServer.Server._op_isRunning.invokeAsync(self, ((), context)) + + """ + Shows if the server currently running (accepting users). + Arguments: + _response -- The asynchronous response callback. + _ex -- The asynchronous exception callback. + _sent -- The asynchronous sent callback. + context -- The request context for the invocation. + Returns: An asynchronous result object for the invocation. + """ + def begin_isRunning(self, _response=None, _ex=None, _sent=None, context=None): + return _M_MumbleServer.Server._op_isRunning.begin(self, ((), _response, _ex, _sent, context)) + + """ + Shows if the server currently running (accepting users). + Arguments: + Returns: Run-state of server. + """ + def end_isRunning(self, _r): + return _M_MumbleServer.Server._op_isRunning.end(self, _r) + + """ + Start server. + Arguments: + context -- The request context for the invocation. + """ + def start(self, context=None): + return _M_MumbleServer.Server._op_start.invoke(self, ((), context)) + + """ + Start server. + Arguments: + context -- The request context for the invocation. + Returns: A future object for the invocation. + """ + def startAsync(self, context=None): + return _M_MumbleServer.Server._op_start.invokeAsync(self, ((), context)) + + """ + Start server. + Arguments: + _response -- The asynchronous response callback. + _ex -- The asynchronous exception callback. + _sent -- The asynchronous sent callback. + context -- The request context for the invocation. + Returns: An asynchronous result object for the invocation. + """ + def begin_start(self, _response=None, _ex=None, _sent=None, context=None): + return _M_MumbleServer.Server._op_start.begin(self, ((), _response, _ex, _sent, context)) + + """ + Start server. + Arguments: + """ + def end_start(self, _r): + return _M_MumbleServer.Server._op_start.end(self, _r) + + """ + Stop server. + Note: Server will be restarted on Murmur restart unless explicitly disabled + with setConf("boot", false) + Arguments: + context -- The request context for the invocation. + """ + def stop(self, context=None): + return _M_MumbleServer.Server._op_stop.invoke(self, ((), context)) + + """ + Stop server. + Note: Server will be restarted on Murmur restart unless explicitly disabled + with setConf("boot", false) + Arguments: + context -- The request context for the invocation. + Returns: A future object for the invocation. + """ + def stopAsync(self, context=None): + return _M_MumbleServer.Server._op_stop.invokeAsync(self, ((), context)) + + """ + Stop server. + Note: Server will be restarted on Murmur restart unless explicitly disabled + with setConf("boot", false) + Arguments: + _response -- The asynchronous response callback. + _ex -- The asynchronous exception callback. + _sent -- The asynchronous sent callback. + context -- The request context for the invocation. + Returns: An asynchronous result object for the invocation. + """ + def begin_stop(self, _response=None, _ex=None, _sent=None, context=None): + return _M_MumbleServer.Server._op_stop.begin(self, ((), _response, _ex, _sent, context)) + + """ + Stop server. + Note: Server will be restarted on Murmur restart unless explicitly disabled + with setConf("boot", false) + Arguments: + """ + def end_stop(self, _r): + return _M_MumbleServer.Server._op_stop.end(self, _r) + + """ + Delete server and all it's configuration. + Arguments: + context -- The request context for the invocation. + """ + def delete(self, context=None): + return _M_MumbleServer.Server._op_delete.invoke(self, ((), context)) + + """ + Delete server and all it's configuration. + Arguments: + context -- The request context for the invocation. + Returns: A future object for the invocation. + """ + def deleteAsync(self, context=None): + return _M_MumbleServer.Server._op_delete.invokeAsync(self, ((), context)) + + """ + Delete server and all it's configuration. + Arguments: + _response -- The asynchronous response callback. + _ex -- The asynchronous exception callback. + _sent -- The asynchronous sent callback. + context -- The request context for the invocation. + Returns: An asynchronous result object for the invocation. + """ + def begin_delete(self, _response=None, _ex=None, _sent=None, context=None): + return _M_MumbleServer.Server._op_delete.begin(self, ((), _response, _ex, _sent, context)) + + """ + Delete server and all it's configuration. + Arguments: + """ + def end_delete(self, _r): + return _M_MumbleServer.Server._op_delete.end(self, _r) + + """ + Fetch the server id. + Arguments: + context -- The request context for the invocation. + Returns: Unique server id. + """ + def id(self, context=None): + return _M_MumbleServer.Server._op_id.invoke(self, ((), context)) + + """ + Fetch the server id. + Arguments: + context -- The request context for the invocation. + Returns: A future object for the invocation. + """ + def idAsync(self, context=None): + return _M_MumbleServer.Server._op_id.invokeAsync(self, ((), context)) + + """ + Fetch the server id. + Arguments: + _response -- The asynchronous response callback. + _ex -- The asynchronous exception callback. + _sent -- The asynchronous sent callback. + context -- The request context for the invocation. + Returns: An asynchronous result object for the invocation. + """ + def begin_id(self, _response=None, _ex=None, _sent=None, context=None): + return _M_MumbleServer.Server._op_id.begin(self, ((), _response, _ex, _sent, context)) + + """ + Fetch the server id. + Arguments: + Returns: Unique server id. + """ + def end_id(self, _r): + return _M_MumbleServer.Server._op_id.end(self, _r) + + """ + Add a callback. The callback will receive notifications about changes to users and channels. + Arguments: + cb -- Callback interface which will receive notifications. + context -- The request context for the invocation. + """ + def addCallback(self, cb, context=None): + return _M_MumbleServer.Server._op_addCallback.invoke(self, ((cb, ), context)) + + """ + Add a callback. The callback will receive notifications about changes to users and channels. + Arguments: + cb -- Callback interface which will receive notifications. + context -- The request context for the invocation. + Returns: A future object for the invocation. + """ + def addCallbackAsync(self, cb, context=None): + return _M_MumbleServer.Server._op_addCallback.invokeAsync(self, ((cb, ), context)) + + """ + Add a callback. The callback will receive notifications about changes to users and channels. + Arguments: + cb -- Callback interface which will receive notifications. + _response -- The asynchronous response callback. + _ex -- The asynchronous exception callback. + _sent -- The asynchronous sent callback. + context -- The request context for the invocation. + Returns: An asynchronous result object for the invocation. + """ + def begin_addCallback(self, cb, _response=None, _ex=None, _sent=None, context=None): + return _M_MumbleServer.Server._op_addCallback.begin(self, ((cb, ), _response, _ex, _sent, context)) + + """ + Add a callback. The callback will receive notifications about changes to users and channels. + Arguments: + cb -- Callback interface which will receive notifications. + """ + def end_addCallback(self, _r): + return _M_MumbleServer.Server._op_addCallback.end(self, _r) + + """ + Remove a callback. + Arguments: + cb -- Callback interface to be removed. + context -- The request context for the invocation. + """ + def removeCallback(self, cb, context=None): + return _M_MumbleServer.Server._op_removeCallback.invoke(self, ((cb, ), context)) + + """ + Remove a callback. + Arguments: + cb -- Callback interface to be removed. + context -- The request context for the invocation. + Returns: A future object for the invocation. + """ + def removeCallbackAsync(self, cb, context=None): + return _M_MumbleServer.Server._op_removeCallback.invokeAsync(self, ((cb, ), context)) + + """ + Remove a callback. + Arguments: + cb -- Callback interface to be removed. + _response -- The asynchronous response callback. + _ex -- The asynchronous exception callback. + _sent -- The asynchronous sent callback. + context -- The request context for the invocation. + Returns: An asynchronous result object for the invocation. + """ + def begin_removeCallback(self, cb, _response=None, _ex=None, _sent=None, context=None): + return _M_MumbleServer.Server._op_removeCallback.begin(self, ((cb, ), _response, _ex, _sent, context)) + + """ + Remove a callback. + Arguments: + cb -- Callback interface to be removed. + """ + def end_removeCallback(self, _r): + return _M_MumbleServer.Server._op_removeCallback.end(self, _r) + + """ + Set external authenticator. If set, all authentications from clients are forwarded to this + proxy. + Arguments: + auth -- Authenticator object to perform subsequent authentications. + context -- The request context for the invocation. + """ + def setAuthenticator(self, auth, context=None): + return _M_MumbleServer.Server._op_setAuthenticator.invoke(self, ((auth, ), context)) + + """ + Set external authenticator. If set, all authentications from clients are forwarded to this + proxy. + Arguments: + auth -- Authenticator object to perform subsequent authentications. + context -- The request context for the invocation. + Returns: A future object for the invocation. + """ + def setAuthenticatorAsync(self, auth, context=None): + return _M_MumbleServer.Server._op_setAuthenticator.invokeAsync(self, ((auth, ), context)) + + """ + Set external authenticator. If set, all authentications from clients are forwarded to this + proxy. + Arguments: + auth -- Authenticator object to perform subsequent authentications. + _response -- The asynchronous response callback. + _ex -- The asynchronous exception callback. + _sent -- The asynchronous sent callback. + context -- The request context for the invocation. + Returns: An asynchronous result object for the invocation. + """ + def begin_setAuthenticator(self, auth, _response=None, _ex=None, _sent=None, context=None): + return _M_MumbleServer.Server._op_setAuthenticator.begin(self, ((auth, ), _response, _ex, _sent, context)) + + """ + Set external authenticator. If set, all authentications from clients are forwarded to this + proxy. + Arguments: + auth -- Authenticator object to perform subsequent authentications. + """ + def end_setAuthenticator(self, _r): + return _M_MumbleServer.Server._op_setAuthenticator.end(self, _r) + + """ + Retrieve configuration item. + Arguments: + key -- Configuration key. + context -- The request context for the invocation. + Returns: Configuration value. If this is empty, see Meta.getDefaultConf + """ + def getConf(self, key, context=None): + return _M_MumbleServer.Server._op_getConf.invoke(self, ((key, ), context)) + + """ + Retrieve configuration item. + Arguments: + key -- Configuration key. + context -- The request context for the invocation. + Returns: A future object for the invocation. + """ + def getConfAsync(self, key, context=None): + return _M_MumbleServer.Server._op_getConf.invokeAsync(self, ((key, ), context)) + + """ + Retrieve configuration item. + Arguments: + key -- Configuration key. + _response -- The asynchronous response callback. + _ex -- The asynchronous exception callback. + _sent -- The asynchronous sent callback. + context -- The request context for the invocation. + Returns: An asynchronous result object for the invocation. + """ + def begin_getConf(self, key, _response=None, _ex=None, _sent=None, context=None): + return _M_MumbleServer.Server._op_getConf.begin(self, ((key, ), _response, _ex, _sent, context)) + + """ + Retrieve configuration item. + Arguments: + key -- Configuration key. + Returns: Configuration value. If this is empty, see Meta.getDefaultConf + """ + def end_getConf(self, _r): + return _M_MumbleServer.Server._op_getConf.end(self, _r) + + """ + Retrieve all configuration items. + Arguments: + context -- The request context for the invocation. + Returns: All configured values. If a value isn't set here, the value from Meta.getDefaultConf is used. + """ + def getAllConf(self, context=None): + return _M_MumbleServer.Server._op_getAllConf.invoke(self, ((), context)) + + """ + Retrieve all configuration items. + Arguments: + context -- The request context for the invocation. + Returns: A future object for the invocation. + """ + def getAllConfAsync(self, context=None): + return _M_MumbleServer.Server._op_getAllConf.invokeAsync(self, ((), context)) + + """ + Retrieve all configuration items. + Arguments: + _response -- The asynchronous response callback. + _ex -- The asynchronous exception callback. + _sent -- The asynchronous sent callback. + context -- The request context for the invocation. + Returns: An asynchronous result object for the invocation. + """ + def begin_getAllConf(self, _response=None, _ex=None, _sent=None, context=None): + return _M_MumbleServer.Server._op_getAllConf.begin(self, ((), _response, _ex, _sent, context)) + + """ + Retrieve all configuration items. + Arguments: + Returns: All configured values. If a value isn't set here, the value from Meta.getDefaultConf is used. + """ + def end_getAllConf(self, _r): + return _M_MumbleServer.Server._op_getAllConf.end(self, _r) + + """ + Set a configuration item. + Arguments: + key -- Configuration key. + value -- Configuration value. + context -- The request context for the invocation. + """ + def setConf(self, key, value, context=None): + return _M_MumbleServer.Server._op_setConf.invoke(self, ((key, value), context)) + + """ + Set a configuration item. + Arguments: + key -- Configuration key. + value -- Configuration value. + context -- The request context for the invocation. + Returns: A future object for the invocation. + """ + def setConfAsync(self, key, value, context=None): + return _M_MumbleServer.Server._op_setConf.invokeAsync(self, ((key, value), context)) + + """ + Set a configuration item. + Arguments: + key -- Configuration key. + value -- Configuration value. + _response -- The asynchronous response callback. + _ex -- The asynchronous exception callback. + _sent -- The asynchronous sent callback. + context -- The request context for the invocation. + Returns: An asynchronous result object for the invocation. + """ + def begin_setConf(self, key, value, _response=None, _ex=None, _sent=None, context=None): + return _M_MumbleServer.Server._op_setConf.begin(self, ((key, value), _response, _ex, _sent, context)) + + """ + Set a configuration item. + Arguments: + key -- Configuration key. + value -- Configuration value. + """ + def end_setConf(self, _r): + return _M_MumbleServer.Server._op_setConf.end(self, _r) + + """ + Set superuser password. This is just a convenience for using updateRegistration on user id 0. + Arguments: + pw -- Password. + context -- The request context for the invocation. + """ + def setSuperuserPassword(self, pw, context=None): + return _M_MumbleServer.Server._op_setSuperuserPassword.invoke(self, ((pw, ), context)) + + """ + Set superuser password. This is just a convenience for using updateRegistration on user id 0. + Arguments: + pw -- Password. + context -- The request context for the invocation. + Returns: A future object for the invocation. + """ + def setSuperuserPasswordAsync(self, pw, context=None): + return _M_MumbleServer.Server._op_setSuperuserPassword.invokeAsync(self, ((pw, ), context)) + + """ + Set superuser password. This is just a convenience for using updateRegistration on user id 0. + Arguments: + pw -- Password. + _response -- The asynchronous response callback. + _ex -- The asynchronous exception callback. + _sent -- The asynchronous sent callback. + context -- The request context for the invocation. + Returns: An asynchronous result object for the invocation. + """ + def begin_setSuperuserPassword(self, pw, _response=None, _ex=None, _sent=None, context=None): + return _M_MumbleServer.Server._op_setSuperuserPassword.begin(self, ((pw, ), _response, _ex, _sent, context)) + + """ + Set superuser password. This is just a convenience for using updateRegistration on user id 0. + Arguments: + pw -- Password. + """ + def end_setSuperuserPassword(self, _r): + return _M_MumbleServer.Server._op_setSuperuserPassword.end(self, _r) + + """ + Fetch log entries. + Arguments: + first -- Lowest numbered entry to fetch. 0 is the most recent item. + last -- Last entry to fetch. + context -- The request context for the invocation. + Returns: List of log entries. + """ + def getLog(self, first, last, context=None): + return _M_MumbleServer.Server._op_getLog.invoke(self, ((first, last), context)) + + """ + Fetch log entries. + Arguments: + first -- Lowest numbered entry to fetch. 0 is the most recent item. + last -- Last entry to fetch. + context -- The request context for the invocation. + Returns: A future object for the invocation. + """ + def getLogAsync(self, first, last, context=None): + return _M_MumbleServer.Server._op_getLog.invokeAsync(self, ((first, last), context)) + + """ + Fetch log entries. + Arguments: + first -- Lowest numbered entry to fetch. 0 is the most recent item. + last -- Last entry to fetch. + _response -- The asynchronous response callback. + _ex -- The asynchronous exception callback. + _sent -- The asynchronous sent callback. + context -- The request context for the invocation. + Returns: An asynchronous result object for the invocation. + """ + def begin_getLog(self, first, last, _response=None, _ex=None, _sent=None, context=None): + return _M_MumbleServer.Server._op_getLog.begin(self, ((first, last), _response, _ex, _sent, context)) + + """ + Fetch log entries. + Arguments: + first -- Lowest numbered entry to fetch. 0 is the most recent item. + last -- Last entry to fetch. + Returns: List of log entries. + """ + def end_getLog(self, _r): + return _M_MumbleServer.Server._op_getLog.end(self, _r) + + """ + Fetch length of log + Arguments: + context -- The request context for the invocation. + Returns: Number of entries in log + """ + def getLogLen(self, context=None): + return _M_MumbleServer.Server._op_getLogLen.invoke(self, ((), context)) + + """ + Fetch length of log + Arguments: + context -- The request context for the invocation. + Returns: A future object for the invocation. + """ + def getLogLenAsync(self, context=None): + return _M_MumbleServer.Server._op_getLogLen.invokeAsync(self, ((), context)) + + """ + Fetch length of log + Arguments: + _response -- The asynchronous response callback. + _ex -- The asynchronous exception callback. + _sent -- The asynchronous sent callback. + context -- The request context for the invocation. + Returns: An asynchronous result object for the invocation. + """ + def begin_getLogLen(self, _response=None, _ex=None, _sent=None, context=None): + return _M_MumbleServer.Server._op_getLogLen.begin(self, ((), _response, _ex, _sent, context)) + + """ + Fetch length of log + Arguments: + Returns: Number of entries in log + """ + def end_getLogLen(self, _r): + return _M_MumbleServer.Server._op_getLogLen.end(self, _r) + + """ + Fetch all users. This returns all currently connected users on the server. + Arguments: + context -- The request context for the invocation. + Returns: List of connected users. + """ + def getUsers(self, context=None): + return _M_MumbleServer.Server._op_getUsers.invoke(self, ((), context)) + + """ + Fetch all users. This returns all currently connected users on the server. + Arguments: + context -- The request context for the invocation. + Returns: A future object for the invocation. + """ + def getUsersAsync(self, context=None): + return _M_MumbleServer.Server._op_getUsers.invokeAsync(self, ((), context)) + + """ + Fetch all users. This returns all currently connected users on the server. + Arguments: + _response -- The asynchronous response callback. + _ex -- The asynchronous exception callback. + _sent -- The asynchronous sent callback. + context -- The request context for the invocation. + Returns: An asynchronous result object for the invocation. + """ + def begin_getUsers(self, _response=None, _ex=None, _sent=None, context=None): + return _M_MumbleServer.Server._op_getUsers.begin(self, ((), _response, _ex, _sent, context)) + + """ + Fetch all users. This returns all currently connected users on the server. + Arguments: + Returns: List of connected users. + """ + def end_getUsers(self, _r): + return _M_MumbleServer.Server._op_getUsers.end(self, _r) + + """ + Fetch all channels. This returns all defined channels on the server. The root channel is always channel 0. + Arguments: + context -- The request context for the invocation. + Returns: List of defined channels. + """ + def getChannels(self, context=None): + return _M_MumbleServer.Server._op_getChannels.invoke(self, ((), context)) + + """ + Fetch all channels. This returns all defined channels on the server. The root channel is always channel 0. + Arguments: + context -- The request context for the invocation. + Returns: A future object for the invocation. + """ + def getChannelsAsync(self, context=None): + return _M_MumbleServer.Server._op_getChannels.invokeAsync(self, ((), context)) + + """ + Fetch all channels. This returns all defined channels on the server. The root channel is always channel 0. + Arguments: + _response -- The asynchronous response callback. + _ex -- The asynchronous exception callback. + _sent -- The asynchronous sent callback. + context -- The request context for the invocation. + Returns: An asynchronous result object for the invocation. + """ + def begin_getChannels(self, _response=None, _ex=None, _sent=None, context=None): + return _M_MumbleServer.Server._op_getChannels.begin(self, ((), _response, _ex, _sent, context)) + + """ + Fetch all channels. This returns all defined channels on the server. The root channel is always channel 0. + Arguments: + Returns: List of defined channels. + """ + def end_getChannels(self, _r): + return _M_MumbleServer.Server._op_getChannels.end(self, _r) + + """ + Fetch certificate of user. This returns the complete certificate chain of a user. + Arguments: + session -- Connection ID of user. See User.session. + context -- The request context for the invocation. + Returns: Certificate list of user. + """ + def getCertificateList(self, session, context=None): + return _M_MumbleServer.Server._op_getCertificateList.invoke(self, ((session, ), context)) + + """ + Fetch certificate of user. This returns the complete certificate chain of a user. + Arguments: + session -- Connection ID of user. See User.session. + context -- The request context for the invocation. + Returns: A future object for the invocation. + """ + def getCertificateListAsync(self, session, context=None): + return _M_MumbleServer.Server._op_getCertificateList.invokeAsync(self, ((session, ), context)) + + """ + Fetch certificate of user. This returns the complete certificate chain of a user. + Arguments: + session -- Connection ID of user. See User.session. + _response -- The asynchronous response callback. + _ex -- The asynchronous exception callback. + _sent -- The asynchronous sent callback. + context -- The request context for the invocation. + Returns: An asynchronous result object for the invocation. + """ + def begin_getCertificateList(self, session, _response=None, _ex=None, _sent=None, context=None): + return _M_MumbleServer.Server._op_getCertificateList.begin(self, ((session, ), _response, _ex, _sent, context)) + + """ + Fetch certificate of user. This returns the complete certificate chain of a user. + Arguments: + session -- Connection ID of user. See User.session. + Returns: Certificate list of user. + """ + def end_getCertificateList(self, _r): + return _M_MumbleServer.Server._op_getCertificateList.end(self, _r) + + """ + Fetch all channels and connected users as a tree. This retrieves an easy-to-use representation of the server + as a tree. This is primarily used for viewing the state of the server on a webpage. + Arguments: + context -- The request context for the invocation. + Returns: Recursive tree of all channels and connected users. + """ + def getTree(self, context=None): + return _M_MumbleServer.Server._op_getTree.invoke(self, ((), context)) + + """ + Fetch all channels and connected users as a tree. This retrieves an easy-to-use representation of the server + as a tree. This is primarily used for viewing the state of the server on a webpage. + Arguments: + context -- The request context for the invocation. + Returns: A future object for the invocation. + """ + def getTreeAsync(self, context=None): + return _M_MumbleServer.Server._op_getTree.invokeAsync(self, ((), context)) + + """ + Fetch all channels and connected users as a tree. This retrieves an easy-to-use representation of the server + as a tree. This is primarily used for viewing the state of the server on a webpage. + Arguments: + _response -- The asynchronous response callback. + _ex -- The asynchronous exception callback. + _sent -- The asynchronous sent callback. + context -- The request context for the invocation. + Returns: An asynchronous result object for the invocation. + """ + def begin_getTree(self, _response=None, _ex=None, _sent=None, context=None): + return _M_MumbleServer.Server._op_getTree.begin(self, ((), _response, _ex, _sent, context)) + + """ + Fetch all channels and connected users as a tree. This retrieves an easy-to-use representation of the server + as a tree. This is primarily used for viewing the state of the server on a webpage. + Arguments: + Returns: Recursive tree of all channels and connected users. + """ + def end_getTree(self, _r): + return _M_MumbleServer.Server._op_getTree.end(self, _r) + + """ + Fetch all current IP bans on the server. + Arguments: + context -- The request context for the invocation. + Returns: List of bans. + """ + def getBans(self, context=None): + return _M_MumbleServer.Server._op_getBans.invoke(self, ((), context)) + + """ + Fetch all current IP bans on the server. + Arguments: + context -- The request context for the invocation. + Returns: A future object for the invocation. + """ + def getBansAsync(self, context=None): + return _M_MumbleServer.Server._op_getBans.invokeAsync(self, ((), context)) + + """ + Fetch all current IP bans on the server. + Arguments: + _response -- The asynchronous response callback. + _ex -- The asynchronous exception callback. + _sent -- The asynchronous sent callback. + context -- The request context for the invocation. + Returns: An asynchronous result object for the invocation. + """ + def begin_getBans(self, _response=None, _ex=None, _sent=None, context=None): + return _M_MumbleServer.Server._op_getBans.begin(self, ((), _response, _ex, _sent, context)) + + """ + Fetch all current IP bans on the server. + Arguments: + Returns: List of bans. + """ + def end_getBans(self, _r): + return _M_MumbleServer.Server._op_getBans.end(self, _r) + + """ + Set all current IP bans on the server. This will replace any bans already present, so if you want to add a ban, be sure to call getBans and then + append to the returned list before calling this method. + Arguments: + bans -- List of bans. + context -- The request context for the invocation. + """ + def setBans(self, bans, context=None): + return _M_MumbleServer.Server._op_setBans.invoke(self, ((bans, ), context)) + + """ + Set all current IP bans on the server. This will replace any bans already present, so if you want to add a ban, be sure to call getBans and then + append to the returned list before calling this method. + Arguments: + bans -- List of bans. + context -- The request context for the invocation. + Returns: A future object for the invocation. + """ + def setBansAsync(self, bans, context=None): + return _M_MumbleServer.Server._op_setBans.invokeAsync(self, ((bans, ), context)) + + """ + Set all current IP bans on the server. This will replace any bans already present, so if you want to add a ban, be sure to call getBans and then + append to the returned list before calling this method. + Arguments: + bans -- List of bans. + _response -- The asynchronous response callback. + _ex -- The asynchronous exception callback. + _sent -- The asynchronous sent callback. + context -- The request context for the invocation. + Returns: An asynchronous result object for the invocation. + """ + def begin_setBans(self, bans, _response=None, _ex=None, _sent=None, context=None): + return _M_MumbleServer.Server._op_setBans.begin(self, ((bans, ), _response, _ex, _sent, context)) + + """ + Set all current IP bans on the server. This will replace any bans already present, so if you want to add a ban, be sure to call getBans and then + append to the returned list before calling this method. + Arguments: + bans -- List of bans. + """ + def end_setBans(self, _r): + return _M_MumbleServer.Server._op_setBans.end(self, _r) + + """ + Kick a user. The user is not banned, and is free to rejoin the server. + Arguments: + session -- Connection ID of user. See User.session. + reason -- Text message to show when user is kicked. + context -- The request context for the invocation. + """ + def kickUser(self, session, reason, context=None): + return _M_MumbleServer.Server._op_kickUser.invoke(self, ((session, reason), context)) + + """ + Kick a user. The user is not banned, and is free to rejoin the server. + Arguments: + session -- Connection ID of user. See User.session. + reason -- Text message to show when user is kicked. + context -- The request context for the invocation. + Returns: A future object for the invocation. + """ + def kickUserAsync(self, session, reason, context=None): + return _M_MumbleServer.Server._op_kickUser.invokeAsync(self, ((session, reason), context)) + + """ + Kick a user. The user is not banned, and is free to rejoin the server. + Arguments: + session -- Connection ID of user. See User.session. + reason -- Text message to show when user is kicked. + _response -- The asynchronous response callback. + _ex -- The asynchronous exception callback. + _sent -- The asynchronous sent callback. + context -- The request context for the invocation. + Returns: An asynchronous result object for the invocation. + """ + def begin_kickUser(self, session, reason, _response=None, _ex=None, _sent=None, context=None): + return _M_MumbleServer.Server._op_kickUser.begin(self, ((session, reason), _response, _ex, _sent, context)) + + """ + Kick a user. The user is not banned, and is free to rejoin the server. + Arguments: + session -- Connection ID of user. See User.session. + reason -- Text message to show when user is kicked. + """ + def end_kickUser(self, _r): + return _M_MumbleServer.Server._op_kickUser.end(self, _r) + + """ + Get state of a single connected user. + Arguments: + session -- Connection ID of user. See User.session. + context -- The request context for the invocation. + Returns: State of connected user. + """ + def getState(self, session, context=None): + return _M_MumbleServer.Server._op_getState.invoke(self, ((session, ), context)) + + """ + Get state of a single connected user. + Arguments: + session -- Connection ID of user. See User.session. + context -- The request context for the invocation. + Returns: A future object for the invocation. + """ + def getStateAsync(self, session, context=None): + return _M_MumbleServer.Server._op_getState.invokeAsync(self, ((session, ), context)) + + """ + Get state of a single connected user. + Arguments: + session -- Connection ID of user. See User.session. + _response -- The asynchronous response callback. + _ex -- The asynchronous exception callback. + _sent -- The asynchronous sent callback. + context -- The request context for the invocation. + Returns: An asynchronous result object for the invocation. + """ + def begin_getState(self, session, _response=None, _ex=None, _sent=None, context=None): + return _M_MumbleServer.Server._op_getState.begin(self, ((session, ), _response, _ex, _sent, context)) + + """ + Get state of a single connected user. + Arguments: + session -- Connection ID of user. See User.session. + Returns: State of connected user. + """ + def end_getState(self, _r): + return _M_MumbleServer.Server._op_getState.end(self, _r) + + """ + Set user state. You can use this to move, mute and deafen users. + Arguments: + state -- User state to set. + context -- The request context for the invocation. + """ + def setState(self, state, context=None): + return _M_MumbleServer.Server._op_setState.invoke(self, ((state, ), context)) + + """ + Set user state. You can use this to move, mute and deafen users. + Arguments: + state -- User state to set. + context -- The request context for the invocation. + Returns: A future object for the invocation. + """ + def setStateAsync(self, state, context=None): + return _M_MumbleServer.Server._op_setState.invokeAsync(self, ((state, ), context)) + + """ + Set user state. You can use this to move, mute and deafen users. + Arguments: + state -- User state to set. + _response -- The asynchronous response callback. + _ex -- The asynchronous exception callback. + _sent -- The asynchronous sent callback. + context -- The request context for the invocation. + Returns: An asynchronous result object for the invocation. + """ + def begin_setState(self, state, _response=None, _ex=None, _sent=None, context=None): + return _M_MumbleServer.Server._op_setState.begin(self, ((state, ), _response, _ex, _sent, context)) + + """ + Set user state. You can use this to move, mute and deafen users. + Arguments: + state -- User state to set. + """ + def end_setState(self, _r): + return _M_MumbleServer.Server._op_setState.end(self, _r) + + """ + Send text message to a single user. + Arguments: + session -- Connection ID of user. See User.session. + text -- Message to send. + context -- The request context for the invocation. + """ + def sendMessage(self, session, text, context=None): + return _M_MumbleServer.Server._op_sendMessage.invoke(self, ((session, text), context)) + + """ + Send text message to a single user. + Arguments: + session -- Connection ID of user. See User.session. + text -- Message to send. + context -- The request context for the invocation. + Returns: A future object for the invocation. + """ + def sendMessageAsync(self, session, text, context=None): + return _M_MumbleServer.Server._op_sendMessage.invokeAsync(self, ((session, text), context)) + + """ + Send text message to a single user. + Arguments: + session -- Connection ID of user. See User.session. + text -- Message to send. + _response -- The asynchronous response callback. + _ex -- The asynchronous exception callback. + _sent -- The asynchronous sent callback. + context -- The request context for the invocation. + Returns: An asynchronous result object for the invocation. + """ + def begin_sendMessage(self, session, text, _response=None, _ex=None, _sent=None, context=None): + return _M_MumbleServer.Server._op_sendMessage.begin(self, ((session, text), _response, _ex, _sent, context)) + + """ + Send text message to a single user. + Arguments: + session -- Connection ID of user. See User.session. + text -- Message to send. + """ + def end_sendMessage(self, _r): + return _M_MumbleServer.Server._op_sendMessage.end(self, _r) + + """ + Check if user is permitted to perform action. + Arguments: + session -- Connection ID of user. See User.session. + channelid -- ID of Channel. See Channel.id. + perm -- Permission bits to check. + context -- The request context for the invocation. + Returns: true if any of the permissions in perm were set for the user. + """ + def hasPermission(self, session, channelid, perm, context=None): + return _M_MumbleServer.Server._op_hasPermission.invoke(self, ((session, channelid, perm), context)) + + """ + Check if user is permitted to perform action. + Arguments: + session -- Connection ID of user. See User.session. + channelid -- ID of Channel. See Channel.id. + perm -- Permission bits to check. + context -- The request context for the invocation. + Returns: A future object for the invocation. + """ + def hasPermissionAsync(self, session, channelid, perm, context=None): + return _M_MumbleServer.Server._op_hasPermission.invokeAsync(self, ((session, channelid, perm), context)) + + """ + Check if user is permitted to perform action. + Arguments: + session -- Connection ID of user. See User.session. + channelid -- ID of Channel. See Channel.id. + perm -- Permission bits to check. + _response -- The asynchronous response callback. + _ex -- The asynchronous exception callback. + _sent -- The asynchronous sent callback. + context -- The request context for the invocation. + Returns: An asynchronous result object for the invocation. + """ + def begin_hasPermission(self, session, channelid, perm, _response=None, _ex=None, _sent=None, context=None): + return _M_MumbleServer.Server._op_hasPermission.begin(self, ((session, channelid, perm), _response, _ex, _sent, context)) + + """ + Check if user is permitted to perform action. + Arguments: + session -- Connection ID of user. See User.session. + channelid -- ID of Channel. See Channel.id. + perm -- Permission bits to check. + Returns: true if any of the permissions in perm were set for the user. + """ + def end_hasPermission(self, _r): + return _M_MumbleServer.Server._op_hasPermission.end(self, _r) + + """ + Return users effective permissions + Arguments: + session -- Connection ID of user. See User.session. + channelid -- ID of Channel. See Channel.id. + context -- The request context for the invocation. + Returns: bitfield of allowed actions + """ + def effectivePermissions(self, session, channelid, context=None): + return _M_MumbleServer.Server._op_effectivePermissions.invoke(self, ((session, channelid), context)) + + """ + Return users effective permissions + Arguments: + session -- Connection ID of user. See User.session. + channelid -- ID of Channel. See Channel.id. + context -- The request context for the invocation. + Returns: A future object for the invocation. + """ + def effectivePermissionsAsync(self, session, channelid, context=None): + return _M_MumbleServer.Server._op_effectivePermissions.invokeAsync(self, ((session, channelid), context)) + + """ + Return users effective permissions + Arguments: + session -- Connection ID of user. See User.session. + channelid -- ID of Channel. See Channel.id. + _response -- The asynchronous response callback. + _ex -- The asynchronous exception callback. + _sent -- The asynchronous sent callback. + context -- The request context for the invocation. + Returns: An asynchronous result object for the invocation. + """ + def begin_effectivePermissions(self, session, channelid, _response=None, _ex=None, _sent=None, context=None): + return _M_MumbleServer.Server._op_effectivePermissions.begin(self, ((session, channelid), _response, _ex, _sent, context)) + + """ + Return users effective permissions + Arguments: + session -- Connection ID of user. See User.session. + channelid -- ID of Channel. See Channel.id. + Returns: bitfield of allowed actions + """ + def end_effectivePermissions(self, _r): + return _M_MumbleServer.Server._op_effectivePermissions.end(self, _r) + + """ + Add a context callback. This is done per user, and will add a context menu action for the user. + Arguments: + session -- Session of user which should receive context entry. + action -- Action string, a unique name to associate with the action. + text -- Name of action shown to user. + cb -- Callback interface which will receive notifications. + ctx -- Context this should be used in. Needs to be one or a combination of ContextServer, ContextChannel and ContextUser. + context -- The request context for the invocation. + """ + def addContextCallback(self, session, action, text, cb, ctx, context=None): + return _M_MumbleServer.Server._op_addContextCallback.invoke(self, ((session, action, text, cb, ctx), context)) + + """ + Add a context callback. This is done per user, and will add a context menu action for the user. + Arguments: + session -- Session of user which should receive context entry. + action -- Action string, a unique name to associate with the action. + text -- Name of action shown to user. + cb -- Callback interface which will receive notifications. + ctx -- Context this should be used in. Needs to be one or a combination of ContextServer, ContextChannel and ContextUser. + context -- The request context for the invocation. + Returns: A future object for the invocation. + """ + def addContextCallbackAsync(self, session, action, text, cb, ctx, context=None): + return _M_MumbleServer.Server._op_addContextCallback.invokeAsync(self, ((session, action, text, cb, ctx), context)) + + """ + Add a context callback. This is done per user, and will add a context menu action for the user. + Arguments: + session -- Session of user which should receive context entry. + action -- Action string, a unique name to associate with the action. + text -- Name of action shown to user. + cb -- Callback interface which will receive notifications. + ctx -- Context this should be used in. Needs to be one or a combination of ContextServer, ContextChannel and ContextUser. + _response -- The asynchronous response callback. + _ex -- The asynchronous exception callback. + _sent -- The asynchronous sent callback. + context -- The request context for the invocation. + Returns: An asynchronous result object for the invocation. + """ + def begin_addContextCallback(self, session, action, text, cb, ctx, _response=None, _ex=None, _sent=None, context=None): + return _M_MumbleServer.Server._op_addContextCallback.begin(self, ((session, action, text, cb, ctx), _response, _ex, _sent, context)) + + """ + Add a context callback. This is done per user, and will add a context menu action for the user. + Arguments: + session -- Session of user which should receive context entry. + action -- Action string, a unique name to associate with the action. + text -- Name of action shown to user. + cb -- Callback interface which will receive notifications. + ctx -- Context this should be used in. Needs to be one or a combination of ContextServer, ContextChannel and ContextUser. + """ + def end_addContextCallback(self, _r): + return _M_MumbleServer.Server._op_addContextCallback.end(self, _r) + + """ + Remove a callback. + Arguments: + cb -- Callback interface to be removed. This callback will be removed from all from all users. + context -- The request context for the invocation. + """ + def removeContextCallback(self, cb, context=None): + return _M_MumbleServer.Server._op_removeContextCallback.invoke(self, ((cb, ), context)) + + """ + Remove a callback. + Arguments: + cb -- Callback interface to be removed. This callback will be removed from all from all users. + context -- The request context for the invocation. + Returns: A future object for the invocation. + """ + def removeContextCallbackAsync(self, cb, context=None): + return _M_MumbleServer.Server._op_removeContextCallback.invokeAsync(self, ((cb, ), context)) + + """ + Remove a callback. + Arguments: + cb -- Callback interface to be removed. This callback will be removed from all from all users. + _response -- The asynchronous response callback. + _ex -- The asynchronous exception callback. + _sent -- The asynchronous sent callback. + context -- The request context for the invocation. + Returns: An asynchronous result object for the invocation. + """ + def begin_removeContextCallback(self, cb, _response=None, _ex=None, _sent=None, context=None): + return _M_MumbleServer.Server._op_removeContextCallback.begin(self, ((cb, ), _response, _ex, _sent, context)) + + """ + Remove a callback. + Arguments: + cb -- Callback interface to be removed. This callback will be removed from all from all users. + """ + def end_removeContextCallback(self, _r): + return _M_MumbleServer.Server._op_removeContextCallback.end(self, _r) + + """ + Get state of single channel. + Arguments: + channelid -- ID of Channel. See Channel.id. + context -- The request context for the invocation. + Returns: State of channel. + """ + def getChannelState(self, channelid, context=None): + return _M_MumbleServer.Server._op_getChannelState.invoke(self, ((channelid, ), context)) + + """ + Get state of single channel. + Arguments: + channelid -- ID of Channel. See Channel.id. + context -- The request context for the invocation. + Returns: A future object for the invocation. + """ + def getChannelStateAsync(self, channelid, context=None): + return _M_MumbleServer.Server._op_getChannelState.invokeAsync(self, ((channelid, ), context)) + + """ + Get state of single channel. + Arguments: + channelid -- ID of Channel. See Channel.id. + _response -- The asynchronous response callback. + _ex -- The asynchronous exception callback. + _sent -- The asynchronous sent callback. + context -- The request context for the invocation. + Returns: An asynchronous result object for the invocation. + """ + def begin_getChannelState(self, channelid, _response=None, _ex=None, _sent=None, context=None): + return _M_MumbleServer.Server._op_getChannelState.begin(self, ((channelid, ), _response, _ex, _sent, context)) + + """ + Get state of single channel. + Arguments: + channelid -- ID of Channel. See Channel.id. + Returns: State of channel. + """ + def end_getChannelState(self, _r): + return _M_MumbleServer.Server._op_getChannelState.end(self, _r) + + """ + Set state of a single channel. You can use this to move or relink channels. + Arguments: + state -- Channel state to set. + context -- The request context for the invocation. + """ + def setChannelState(self, state, context=None): + return _M_MumbleServer.Server._op_setChannelState.invoke(self, ((state, ), context)) + + """ + Set state of a single channel. You can use this to move or relink channels. + Arguments: + state -- Channel state to set. + context -- The request context for the invocation. + Returns: A future object for the invocation. + """ + def setChannelStateAsync(self, state, context=None): + return _M_MumbleServer.Server._op_setChannelState.invokeAsync(self, ((state, ), context)) + + """ + Set state of a single channel. You can use this to move or relink channels. + Arguments: + state -- Channel state to set. + _response -- The asynchronous response callback. + _ex -- The asynchronous exception callback. + _sent -- The asynchronous sent callback. + context -- The request context for the invocation. + Returns: An asynchronous result object for the invocation. + """ + def begin_setChannelState(self, state, _response=None, _ex=None, _sent=None, context=None): + return _M_MumbleServer.Server._op_setChannelState.begin(self, ((state, ), _response, _ex, _sent, context)) + + """ + Set state of a single channel. You can use this to move or relink channels. + Arguments: + state -- Channel state to set. + """ + def end_setChannelState(self, _r): + return _M_MumbleServer.Server._op_setChannelState.end(self, _r) + + """ + Remove a channel and all its subchannels. + Arguments: + channelid -- ID of Channel. See Channel.id. + context -- The request context for the invocation. + """ + def removeChannel(self, channelid, context=None): + return _M_MumbleServer.Server._op_removeChannel.invoke(self, ((channelid, ), context)) + + """ + Remove a channel and all its subchannels. + Arguments: + channelid -- ID of Channel. See Channel.id. + context -- The request context for the invocation. + Returns: A future object for the invocation. + """ + def removeChannelAsync(self, channelid, context=None): + return _M_MumbleServer.Server._op_removeChannel.invokeAsync(self, ((channelid, ), context)) + + """ + Remove a channel and all its subchannels. + Arguments: + channelid -- ID of Channel. See Channel.id. + _response -- The asynchronous response callback. + _ex -- The asynchronous exception callback. + _sent -- The asynchronous sent callback. + context -- The request context for the invocation. + Returns: An asynchronous result object for the invocation. + """ + def begin_removeChannel(self, channelid, _response=None, _ex=None, _sent=None, context=None): + return _M_MumbleServer.Server._op_removeChannel.begin(self, ((channelid, ), _response, _ex, _sent, context)) + + """ + Remove a channel and all its subchannels. + Arguments: + channelid -- ID of Channel. See Channel.id. + """ + def end_removeChannel(self, _r): + return _M_MumbleServer.Server._op_removeChannel.end(self, _r) + + """ + Add a new channel. + Arguments: + name -- Name of new channel. + parent -- Channel ID of parent channel. See Channel.id. + context -- The request context for the invocation. + Returns: ID of newly created channel. + """ + def addChannel(self, name, parent, context=None): + return _M_MumbleServer.Server._op_addChannel.invoke(self, ((name, parent), context)) + + """ + Add a new channel. + Arguments: + name -- Name of new channel. + parent -- Channel ID of parent channel. See Channel.id. + context -- The request context for the invocation. + Returns: A future object for the invocation. + """ + def addChannelAsync(self, name, parent, context=None): + return _M_MumbleServer.Server._op_addChannel.invokeAsync(self, ((name, parent), context)) + + """ + Add a new channel. + Arguments: + name -- Name of new channel. + parent -- Channel ID of parent channel. See Channel.id. + _response -- The asynchronous response callback. + _ex -- The asynchronous exception callback. + _sent -- The asynchronous sent callback. + context -- The request context for the invocation. + Returns: An asynchronous result object for the invocation. + """ + def begin_addChannel(self, name, parent, _response=None, _ex=None, _sent=None, context=None): + return _M_MumbleServer.Server._op_addChannel.begin(self, ((name, parent), _response, _ex, _sent, context)) + + """ + Add a new channel. + Arguments: + name -- Name of new channel. + parent -- Channel ID of parent channel. See Channel.id. + Returns: ID of newly created channel. + """ + def end_addChannel(self, _r): + return _M_MumbleServer.Server._op_addChannel.end(self, _r) + + """ + Send text message to channel or a tree of channels. + Arguments: + channelid -- Channel ID of channel to send to. See Channel.id. + tree -- If true, the message will be sent to the channel and all its subchannels. + text -- Message to send. + context -- The request context for the invocation. + """ + def sendMessageChannel(self, channelid, tree, text, context=None): + return _M_MumbleServer.Server._op_sendMessageChannel.invoke(self, ((channelid, tree, text), context)) + + """ + Send text message to channel or a tree of channels. + Arguments: + channelid -- Channel ID of channel to send to. See Channel.id. + tree -- If true, the message will be sent to the channel and all its subchannels. + text -- Message to send. + context -- The request context for the invocation. + Returns: A future object for the invocation. + """ + def sendMessageChannelAsync(self, channelid, tree, text, context=None): + return _M_MumbleServer.Server._op_sendMessageChannel.invokeAsync(self, ((channelid, tree, text), context)) + + """ + Send text message to channel or a tree of channels. + Arguments: + channelid -- Channel ID of channel to send to. See Channel.id. + tree -- If true, the message will be sent to the channel and all its subchannels. + text -- Message to send. + _response -- The asynchronous response callback. + _ex -- The asynchronous exception callback. + _sent -- The asynchronous sent callback. + context -- The request context for the invocation. + Returns: An asynchronous result object for the invocation. + """ + def begin_sendMessageChannel(self, channelid, tree, text, _response=None, _ex=None, _sent=None, context=None): + return _M_MumbleServer.Server._op_sendMessageChannel.begin(self, ((channelid, tree, text), _response, _ex, _sent, context)) + + """ + Send text message to channel or a tree of channels. + Arguments: + channelid -- Channel ID of channel to send to. See Channel.id. + tree -- If true, the message will be sent to the channel and all its subchannels. + text -- Message to send. + """ + def end_sendMessageChannel(self, _r): + return _M_MumbleServer.Server._op_sendMessageChannel.end(self, _r) + + """ + Retrieve ACLs and Groups on a channel. + Arguments: + channelid -- Channel ID of channel to fetch from. See Channel.id. + context -- The request context for the invocation. + Returns a tuple containing the following: + acls -- List of ACLs on the channel. This will include inherited ACLs. + groups -- List of groups on the channel. This will include inherited groups. + inherit -- Does this channel inherit ACLs from the parent channel? + """ + def getACL(self, channelid, context=None): + return _M_MumbleServer.Server._op_getACL.invoke(self, ((channelid, ), context)) + + """ + Retrieve ACLs and Groups on a channel. + Arguments: + channelid -- Channel ID of channel to fetch from. See Channel.id. + context -- The request context for the invocation. + Returns: A future object for the invocation. + """ + def getACLAsync(self, channelid, context=None): + return _M_MumbleServer.Server._op_getACL.invokeAsync(self, ((channelid, ), context)) + + """ + Retrieve ACLs and Groups on a channel. + Arguments: + channelid -- Channel ID of channel to fetch from. See Channel.id. + _response -- The asynchronous response callback. + _ex -- The asynchronous exception callback. + _sent -- The asynchronous sent callback. + context -- The request context for the invocation. + Returns: An asynchronous result object for the invocation. + """ + def begin_getACL(self, channelid, _response=None, _ex=None, _sent=None, context=None): + return _M_MumbleServer.Server._op_getACL.begin(self, ((channelid, ), _response, _ex, _sent, context)) + + """ + Retrieve ACLs and Groups on a channel. + Arguments: + channelid -- Channel ID of channel to fetch from. See Channel.id. + Returns a tuple containing the following: + acls -- List of ACLs on the channel. This will include inherited ACLs. + groups -- List of groups on the channel. This will include inherited groups. + inherit -- Does this channel inherit ACLs from the parent channel? + """ + def end_getACL(self, _r): + return _M_MumbleServer.Server._op_getACL.end(self, _r) + + """ + Set ACLs and Groups on a channel. Note that this will replace all existing ACLs and groups on the channel. + Arguments: + channelid -- Channel ID of channel to fetch from. See Channel.id. + acls -- List of ACLs on the channel. + groups -- List of groups on the channel. + inherit -- Should this channel inherit ACLs from the parent channel? + context -- The request context for the invocation. + """ + def setACL(self, channelid, acls, groups, inherit, context=None): + return _M_MumbleServer.Server._op_setACL.invoke(self, ((channelid, acls, groups, inherit), context)) + + """ + Set ACLs and Groups on a channel. Note that this will replace all existing ACLs and groups on the channel. + Arguments: + channelid -- Channel ID of channel to fetch from. See Channel.id. + acls -- List of ACLs on the channel. + groups -- List of groups on the channel. + inherit -- Should this channel inherit ACLs from the parent channel? + context -- The request context for the invocation. + Returns: A future object for the invocation. + """ + def setACLAsync(self, channelid, acls, groups, inherit, context=None): + return _M_MumbleServer.Server._op_setACL.invokeAsync(self, ((channelid, acls, groups, inherit), context)) + + """ + Set ACLs and Groups on a channel. Note that this will replace all existing ACLs and groups on the channel. + Arguments: + channelid -- Channel ID of channel to fetch from. See Channel.id. + acls -- List of ACLs on the channel. + groups -- List of groups on the channel. + inherit -- Should this channel inherit ACLs from the parent channel? + _response -- The asynchronous response callback. + _ex -- The asynchronous exception callback. + _sent -- The asynchronous sent callback. + context -- The request context for the invocation. + Returns: An asynchronous result object for the invocation. + """ + def begin_setACL(self, channelid, acls, groups, inherit, _response=None, _ex=None, _sent=None, context=None): + return _M_MumbleServer.Server._op_setACL.begin(self, ((channelid, acls, groups, inherit), _response, _ex, _sent, context)) + + """ + Set ACLs and Groups on a channel. Note that this will replace all existing ACLs and groups on the channel. + Arguments: + channelid -- Channel ID of channel to fetch from. See Channel.id. + acls -- List of ACLs on the channel. + groups -- List of groups on the channel. + inherit -- Should this channel inherit ACLs from the parent channel? + """ + def end_setACL(self, _r): + return _M_MumbleServer.Server._op_setACL.end(self, _r) + + """ + Temporarily add a user to a group on a channel. This state is not saved, and is intended for temporary memberships. + Arguments: + channelid -- Channel ID of channel to add to. See Channel.id. + session -- Connection ID of user. See User.session. + group -- Group name to add to. + context -- The request context for the invocation. + """ + def addUserToGroup(self, channelid, session, group, context=None): + return _M_MumbleServer.Server._op_addUserToGroup.invoke(self, ((channelid, session, group), context)) + + """ + Temporarily add a user to a group on a channel. This state is not saved, and is intended for temporary memberships. + Arguments: + channelid -- Channel ID of channel to add to. See Channel.id. + session -- Connection ID of user. See User.session. + group -- Group name to add to. + context -- The request context for the invocation. + Returns: A future object for the invocation. + """ + def addUserToGroupAsync(self, channelid, session, group, context=None): + return _M_MumbleServer.Server._op_addUserToGroup.invokeAsync(self, ((channelid, session, group), context)) + + """ + Temporarily add a user to a group on a channel. This state is not saved, and is intended for temporary memberships. + Arguments: + channelid -- Channel ID of channel to add to. See Channel.id. + session -- Connection ID of user. See User.session. + group -- Group name to add to. + _response -- The asynchronous response callback. + _ex -- The asynchronous exception callback. + _sent -- The asynchronous sent callback. + context -- The request context for the invocation. + Returns: An asynchronous result object for the invocation. + """ + def begin_addUserToGroup(self, channelid, session, group, _response=None, _ex=None, _sent=None, context=None): + return _M_MumbleServer.Server._op_addUserToGroup.begin(self, ((channelid, session, group), _response, _ex, _sent, context)) + + """ + Temporarily add a user to a group on a channel. This state is not saved, and is intended for temporary memberships. + Arguments: + channelid -- Channel ID of channel to add to. See Channel.id. + session -- Connection ID of user. See User.session. + group -- Group name to add to. + """ + def end_addUserToGroup(self, _r): + return _M_MumbleServer.Server._op_addUserToGroup.end(self, _r) + + """ + Remove a user from a temporary group membership on a channel. This state is not saved, and is intended for temporary memberships. + Arguments: + channelid -- Channel ID of channel to add to. See Channel.id. + session -- Connection ID of user. See User.session. + group -- Group name to remove from. + context -- The request context for the invocation. + """ + def removeUserFromGroup(self, channelid, session, group, context=None): + return _M_MumbleServer.Server._op_removeUserFromGroup.invoke(self, ((channelid, session, group), context)) + + """ + Remove a user from a temporary group membership on a channel. This state is not saved, and is intended for temporary memberships. + Arguments: + channelid -- Channel ID of channel to add to. See Channel.id. + session -- Connection ID of user. See User.session. + group -- Group name to remove from. + context -- The request context for the invocation. + Returns: A future object for the invocation. + """ + def removeUserFromGroupAsync(self, channelid, session, group, context=None): + return _M_MumbleServer.Server._op_removeUserFromGroup.invokeAsync(self, ((channelid, session, group), context)) + + """ + Remove a user from a temporary group membership on a channel. This state is not saved, and is intended for temporary memberships. + Arguments: + channelid -- Channel ID of channel to add to. See Channel.id. + session -- Connection ID of user. See User.session. + group -- Group name to remove from. + _response -- The asynchronous response callback. + _ex -- The asynchronous exception callback. + _sent -- The asynchronous sent callback. + context -- The request context for the invocation. + Returns: An asynchronous result object for the invocation. + """ + def begin_removeUserFromGroup(self, channelid, session, group, _response=None, _ex=None, _sent=None, context=None): + return _M_MumbleServer.Server._op_removeUserFromGroup.begin(self, ((channelid, session, group), _response, _ex, _sent, context)) + + """ + Remove a user from a temporary group membership on a channel. This state is not saved, and is intended for temporary memberships. + Arguments: + channelid -- Channel ID of channel to add to. See Channel.id. + session -- Connection ID of user. See User.session. + group -- Group name to remove from. + """ + def end_removeUserFromGroup(self, _r): + return _M_MumbleServer.Server._op_removeUserFromGroup.end(self, _r) + + """ + Redirect whisper targets for user. If set, whenever a user tries to whisper to group "source", the whisper will be redirected to group "target". + To remove a redirect pass an empty target string. This is intended for context groups. + Arguments: + session -- Connection ID of user. See User.session. + source -- Group name to redirect from. + target -- Group name to redirect to. + context -- The request context for the invocation. + """ + def redirectWhisperGroup(self, session, source, target, context=None): + return _M_MumbleServer.Server._op_redirectWhisperGroup.invoke(self, ((session, source, target), context)) + + """ + Redirect whisper targets for user. If set, whenever a user tries to whisper to group "source", the whisper will be redirected to group "target". + To remove a redirect pass an empty target string. This is intended for context groups. + Arguments: + session -- Connection ID of user. See User.session. + source -- Group name to redirect from. + target -- Group name to redirect to. + context -- The request context for the invocation. + Returns: A future object for the invocation. + """ + def redirectWhisperGroupAsync(self, session, source, target, context=None): + return _M_MumbleServer.Server._op_redirectWhisperGroup.invokeAsync(self, ((session, source, target), context)) + + """ + Redirect whisper targets for user. If set, whenever a user tries to whisper to group "source", the whisper will be redirected to group "target". + To remove a redirect pass an empty target string. This is intended for context groups. + Arguments: + session -- Connection ID of user. See User.session. + source -- Group name to redirect from. + target -- Group name to redirect to. + _response -- The asynchronous response callback. + _ex -- The asynchronous exception callback. + _sent -- The asynchronous sent callback. + context -- The request context for the invocation. + Returns: An asynchronous result object for the invocation. + """ + def begin_redirectWhisperGroup(self, session, source, target, _response=None, _ex=None, _sent=None, context=None): + return _M_MumbleServer.Server._op_redirectWhisperGroup.begin(self, ((session, source, target), _response, _ex, _sent, context)) + + """ + Redirect whisper targets for user. If set, whenever a user tries to whisper to group "source", the whisper will be redirected to group "target". + To remove a redirect pass an empty target string. This is intended for context groups. + Arguments: + session -- Connection ID of user. See User.session. + source -- Group name to redirect from. + target -- Group name to redirect to. + """ + def end_redirectWhisperGroup(self, _r): + return _M_MumbleServer.Server._op_redirectWhisperGroup.end(self, _r) + + """ + Map a list of User.userid to a matching name. + Arguments: + ids -- + context -- The request context for the invocation. + Returns: Matching list of names, with an empty string representing invalid or unknown ids. + """ + def getUserNames(self, ids, context=None): + return _M_MumbleServer.Server._op_getUserNames.invoke(self, ((ids, ), context)) + + """ + Map a list of User.userid to a matching name. + Arguments: + ids -- + context -- The request context for the invocation. + Returns: A future object for the invocation. + """ + def getUserNamesAsync(self, ids, context=None): + return _M_MumbleServer.Server._op_getUserNames.invokeAsync(self, ((ids, ), context)) + + """ + Map a list of User.userid to a matching name. + Arguments: + ids -- + _response -- The asynchronous response callback. + _ex -- The asynchronous exception callback. + _sent -- The asynchronous sent callback. + context -- The request context for the invocation. + Returns: An asynchronous result object for the invocation. + """ + def begin_getUserNames(self, ids, _response=None, _ex=None, _sent=None, context=None): + return _M_MumbleServer.Server._op_getUserNames.begin(self, ((ids, ), _response, _ex, _sent, context)) + + """ + Map a list of User.userid to a matching name. + Arguments: + ids -- + Returns: Matching list of names, with an empty string representing invalid or unknown ids. + """ + def end_getUserNames(self, _r): + return _M_MumbleServer.Server._op_getUserNames.end(self, _r) + + """ + Map a list of user names to a matching id. + @reuturn List of matching ids, with -1 representing invalid or unknown user names. + Arguments: + names -- + context -- The request context for the invocation. + """ + def getUserIds(self, names, context=None): + return _M_MumbleServer.Server._op_getUserIds.invoke(self, ((names, ), context)) + + """ + Map a list of user names to a matching id. + @reuturn List of matching ids, with -1 representing invalid or unknown user names. + Arguments: + names -- + context -- The request context for the invocation. + Returns: A future object for the invocation. + """ + def getUserIdsAsync(self, names, context=None): + return _M_MumbleServer.Server._op_getUserIds.invokeAsync(self, ((names, ), context)) + + """ + Map a list of user names to a matching id. + @reuturn List of matching ids, with -1 representing invalid or unknown user names. + Arguments: + names -- + _response -- The asynchronous response callback. + _ex -- The asynchronous exception callback. + _sent -- The asynchronous sent callback. + context -- The request context for the invocation. + Returns: An asynchronous result object for the invocation. + """ + def begin_getUserIds(self, names, _response=None, _ex=None, _sent=None, context=None): + return _M_MumbleServer.Server._op_getUserIds.begin(self, ((names, ), _response, _ex, _sent, context)) + + """ + Map a list of user names to a matching id. + @reuturn List of matching ids, with -1 representing invalid or unknown user names. + Arguments: + names -- + """ + def end_getUserIds(self, _r): + return _M_MumbleServer.Server._op_getUserIds.end(self, _r) + + """ + Register a new user. + Arguments: + info -- Information about new user. Must include at least "name". + context -- The request context for the invocation. + Returns: The ID of the user. See RegisteredUser.userid. + """ + def registerUser(self, info, context=None): + return _M_MumbleServer.Server._op_registerUser.invoke(self, ((info, ), context)) + + """ + Register a new user. + Arguments: + info -- Information about new user. Must include at least "name". + context -- The request context for the invocation. + Returns: A future object for the invocation. + """ + def registerUserAsync(self, info, context=None): + return _M_MumbleServer.Server._op_registerUser.invokeAsync(self, ((info, ), context)) + + """ + Register a new user. + Arguments: + info -- Information about new user. Must include at least "name". + _response -- The asynchronous response callback. + _ex -- The asynchronous exception callback. + _sent -- The asynchronous sent callback. + context -- The request context for the invocation. + Returns: An asynchronous result object for the invocation. + """ + def begin_registerUser(self, info, _response=None, _ex=None, _sent=None, context=None): + return _M_MumbleServer.Server._op_registerUser.begin(self, ((info, ), _response, _ex, _sent, context)) + + """ + Register a new user. + Arguments: + info -- Information about new user. Must include at least "name". + Returns: The ID of the user. See RegisteredUser.userid. + """ + def end_registerUser(self, _r): + return _M_MumbleServer.Server._op_registerUser.end(self, _r) + + """ + Remove a user registration. + Arguments: + userid -- ID of registered user. See RegisteredUser.userid. + context -- The request context for the invocation. + """ + def unregisterUser(self, userid, context=None): + return _M_MumbleServer.Server._op_unregisterUser.invoke(self, ((userid, ), context)) + + """ + Remove a user registration. + Arguments: + userid -- ID of registered user. See RegisteredUser.userid. + context -- The request context for the invocation. + Returns: A future object for the invocation. + """ + def unregisterUserAsync(self, userid, context=None): + return _M_MumbleServer.Server._op_unregisterUser.invokeAsync(self, ((userid, ), context)) + + """ + Remove a user registration. + Arguments: + userid -- ID of registered user. See RegisteredUser.userid. + _response -- The asynchronous response callback. + _ex -- The asynchronous exception callback. + _sent -- The asynchronous sent callback. + context -- The request context for the invocation. + Returns: An asynchronous result object for the invocation. + """ + def begin_unregisterUser(self, userid, _response=None, _ex=None, _sent=None, context=None): + return _M_MumbleServer.Server._op_unregisterUser.begin(self, ((userid, ), _response, _ex, _sent, context)) + + """ + Remove a user registration. + Arguments: + userid -- ID of registered user. See RegisteredUser.userid. + """ + def end_unregisterUser(self, _r): + return _M_MumbleServer.Server._op_unregisterUser.end(self, _r) + + """ + Update the registration for a user. You can use this to set the email or password of a user, + and can also use it to change the user's name. + Arguments: + userid -- + info -- + context -- The request context for the invocation. + """ + def updateRegistration(self, userid, info, context=None): + return _M_MumbleServer.Server._op_updateRegistration.invoke(self, ((userid, info), context)) + + """ + Update the registration for a user. You can use this to set the email or password of a user, + and can also use it to change the user's name. + Arguments: + userid -- + info -- + context -- The request context for the invocation. + Returns: A future object for the invocation. + """ + def updateRegistrationAsync(self, userid, info, context=None): + return _M_MumbleServer.Server._op_updateRegistration.invokeAsync(self, ((userid, info), context)) + + """ + Update the registration for a user. You can use this to set the email or password of a user, + and can also use it to change the user's name. + Arguments: + userid -- + info -- + _response -- The asynchronous response callback. + _ex -- The asynchronous exception callback. + _sent -- The asynchronous sent callback. + context -- The request context for the invocation. + Returns: An asynchronous result object for the invocation. + """ + def begin_updateRegistration(self, userid, info, _response=None, _ex=None, _sent=None, context=None): + return _M_MumbleServer.Server._op_updateRegistration.begin(self, ((userid, info), _response, _ex, _sent, context)) + + """ + Update the registration for a user. You can use this to set the email or password of a user, + and can also use it to change the user's name. + Arguments: + userid -- + info -- + """ + def end_updateRegistration(self, _r): + return _M_MumbleServer.Server._op_updateRegistration.end(self, _r) + + """ + Fetch registration for a single user. + Arguments: + userid -- ID of registered user. See RegisteredUser.userid. + context -- The request context for the invocation. + Returns: Registration record. + """ + def getRegistration(self, userid, context=None): + return _M_MumbleServer.Server._op_getRegistration.invoke(self, ((userid, ), context)) + + """ + Fetch registration for a single user. + Arguments: + userid -- ID of registered user. See RegisteredUser.userid. + context -- The request context for the invocation. + Returns: A future object for the invocation. + """ + def getRegistrationAsync(self, userid, context=None): + return _M_MumbleServer.Server._op_getRegistration.invokeAsync(self, ((userid, ), context)) + + """ + Fetch registration for a single user. + Arguments: + userid -- ID of registered user. See RegisteredUser.userid. + _response -- The asynchronous response callback. + _ex -- The asynchronous exception callback. + _sent -- The asynchronous sent callback. + context -- The request context for the invocation. + Returns: An asynchronous result object for the invocation. + """ + def begin_getRegistration(self, userid, _response=None, _ex=None, _sent=None, context=None): + return _M_MumbleServer.Server._op_getRegistration.begin(self, ((userid, ), _response, _ex, _sent, context)) + + """ + Fetch registration for a single user. + Arguments: + userid -- ID of registered user. See RegisteredUser.userid. + Returns: Registration record. + """ + def end_getRegistration(self, _r): + return _M_MumbleServer.Server._op_getRegistration.end(self, _r) + + """ + Fetch a group of registered users. + Arguments: + filter -- Substring of user name. If blank, will retrieve all registered users. + context -- The request context for the invocation. + Returns: List of registration records. + """ + def getRegisteredUsers(self, filter, context=None): + return _M_MumbleServer.Server._op_getRegisteredUsers.invoke(self, ((filter, ), context)) + + """ + Fetch a group of registered users. + Arguments: + filter -- Substring of user name. If blank, will retrieve all registered users. + context -- The request context for the invocation. + Returns: A future object for the invocation. + """ + def getRegisteredUsersAsync(self, filter, context=None): + return _M_MumbleServer.Server._op_getRegisteredUsers.invokeAsync(self, ((filter, ), context)) + + """ + Fetch a group of registered users. + Arguments: + filter -- Substring of user name. If blank, will retrieve all registered users. + _response -- The asynchronous response callback. + _ex -- The asynchronous exception callback. + _sent -- The asynchronous sent callback. + context -- The request context for the invocation. + Returns: An asynchronous result object for the invocation. + """ + def begin_getRegisteredUsers(self, filter, _response=None, _ex=None, _sent=None, context=None): + return _M_MumbleServer.Server._op_getRegisteredUsers.begin(self, ((filter, ), _response, _ex, _sent, context)) + + """ + Fetch a group of registered users. + Arguments: + filter -- Substring of user name. If blank, will retrieve all registered users. + Returns: List of registration records. + """ + def end_getRegisteredUsers(self, _r): + return _M_MumbleServer.Server._op_getRegisteredUsers.end(self, _r) + + """ + Verify the password of a user. You can use this to verify a user's credentials. + Arguments: + name -- User name. See RegisteredUser.name. + pw -- User password. + context -- The request context for the invocation. + Returns: User ID of registered user (See RegisteredUser.userid), -1 for failed authentication or -2 for unknown usernames. + """ + def verifyPassword(self, name, pw, context=None): + return _M_MumbleServer.Server._op_verifyPassword.invoke(self, ((name, pw), context)) + + """ + Verify the password of a user. You can use this to verify a user's credentials. + Arguments: + name -- User name. See RegisteredUser.name. + pw -- User password. + context -- The request context for the invocation. + Returns: A future object for the invocation. + """ + def verifyPasswordAsync(self, name, pw, context=None): + return _M_MumbleServer.Server._op_verifyPassword.invokeAsync(self, ((name, pw), context)) + + """ + Verify the password of a user. You can use this to verify a user's credentials. + Arguments: + name -- User name. See RegisteredUser.name. + pw -- User password. + _response -- The asynchronous response callback. + _ex -- The asynchronous exception callback. + _sent -- The asynchronous sent callback. + context -- The request context for the invocation. + Returns: An asynchronous result object for the invocation. + """ + def begin_verifyPassword(self, name, pw, _response=None, _ex=None, _sent=None, context=None): + return _M_MumbleServer.Server._op_verifyPassword.begin(self, ((name, pw), _response, _ex, _sent, context)) + + """ + Verify the password of a user. You can use this to verify a user's credentials. + Arguments: + name -- User name. See RegisteredUser.name. + pw -- User password. + Returns: User ID of registered user (See RegisteredUser.userid), -1 for failed authentication or -2 for unknown usernames. + """ + def end_verifyPassword(self, _r): + return _M_MumbleServer.Server._op_verifyPassword.end(self, _r) + + """ + Fetch user texture. Textures are stored as zlib compress()ed 600x60 32-bit BGRA data. + Arguments: + userid -- ID of registered user. See RegisteredUser.userid. + context -- The request context for the invocation. + Returns: Custom texture associated with user or an empty texture. + """ + def getTexture(self, userid, context=None): + return _M_MumbleServer.Server._op_getTexture.invoke(self, ((userid, ), context)) + + """ + Fetch user texture. Textures are stored as zlib compress()ed 600x60 32-bit BGRA data. + Arguments: + userid -- ID of registered user. See RegisteredUser.userid. + context -- The request context for the invocation. + Returns: A future object for the invocation. + """ + def getTextureAsync(self, userid, context=None): + return _M_MumbleServer.Server._op_getTexture.invokeAsync(self, ((userid, ), context)) + + """ + Fetch user texture. Textures are stored as zlib compress()ed 600x60 32-bit BGRA data. + Arguments: + userid -- ID of registered user. See RegisteredUser.userid. + _response -- The asynchronous response callback. + _ex -- The asynchronous exception callback. + _sent -- The asynchronous sent callback. + context -- The request context for the invocation. + Returns: An asynchronous result object for the invocation. + """ + def begin_getTexture(self, userid, _response=None, _ex=None, _sent=None, context=None): + return _M_MumbleServer.Server._op_getTexture.begin(self, ((userid, ), _response, _ex, _sent, context)) + + """ + Fetch user texture. Textures are stored as zlib compress()ed 600x60 32-bit BGRA data. + Arguments: + userid -- ID of registered user. See RegisteredUser.userid. + Returns: Custom texture associated with user or an empty texture. + """ + def end_getTexture(self, _r): + return _M_MumbleServer.Server._op_getTexture.end(self, _r) + + """ + Set a user texture (now called avatar). + Arguments: + userid -- ID of registered user. See RegisteredUser.userid. + tex -- Texture (as a Byte-Array) to set for the user, or an empty texture to remove the existing texture. + context -- The request context for the invocation. + """ + def setTexture(self, userid, tex, context=None): + return _M_MumbleServer.Server._op_setTexture.invoke(self, ((userid, tex), context)) + + """ + Set a user texture (now called avatar). + Arguments: + userid -- ID of registered user. See RegisteredUser.userid. + tex -- Texture (as a Byte-Array) to set for the user, or an empty texture to remove the existing texture. + context -- The request context for the invocation. + Returns: A future object for the invocation. + """ + def setTextureAsync(self, userid, tex, context=None): + return _M_MumbleServer.Server._op_setTexture.invokeAsync(self, ((userid, tex), context)) + + """ + Set a user texture (now called avatar). + Arguments: + userid -- ID of registered user. See RegisteredUser.userid. + tex -- Texture (as a Byte-Array) to set for the user, or an empty texture to remove the existing texture. + _response -- The asynchronous response callback. + _ex -- The asynchronous exception callback. + _sent -- The asynchronous sent callback. + context -- The request context for the invocation. + Returns: An asynchronous result object for the invocation. + """ + def begin_setTexture(self, userid, tex, _response=None, _ex=None, _sent=None, context=None): + return _M_MumbleServer.Server._op_setTexture.begin(self, ((userid, tex), _response, _ex, _sent, context)) + + """ + Set a user texture (now called avatar). + Arguments: + userid -- ID of registered user. See RegisteredUser.userid. + tex -- Texture (as a Byte-Array) to set for the user, or an empty texture to remove the existing texture. + """ + def end_setTexture(self, _r): + return _M_MumbleServer.Server._op_setTexture.end(self, _r) + + """ + Get virtual server uptime. + Arguments: + context -- The request context for the invocation. + Returns: Uptime of the virtual server in seconds + """ + def getUptime(self, context=None): + return _M_MumbleServer.Server._op_getUptime.invoke(self, ((), context)) + + """ + Get virtual server uptime. + Arguments: + context -- The request context for the invocation. + Returns: A future object for the invocation. + """ + def getUptimeAsync(self, context=None): + return _M_MumbleServer.Server._op_getUptime.invokeAsync(self, ((), context)) + + """ + Get virtual server uptime. + Arguments: + _response -- The asynchronous response callback. + _ex -- The asynchronous exception callback. + _sent -- The asynchronous sent callback. + context -- The request context for the invocation. + Returns: An asynchronous result object for the invocation. + """ + def begin_getUptime(self, _response=None, _ex=None, _sent=None, context=None): + return _M_MumbleServer.Server._op_getUptime.begin(self, ((), _response, _ex, _sent, context)) + + """ + Get virtual server uptime. + Arguments: + Returns: Uptime of the virtual server in seconds + """ + def end_getUptime(self, _r): + return _M_MumbleServer.Server._op_getUptime.end(self, _r) + + """ + Update the server's certificate information. + Reconfigure the running server's TLS socket with the given + certificate and private key. + The certificate and and private key must be PEM formatted. + New clients will see the new certificate. + Existing clients will continue to see the certificate the server + was using when they connected to it. + This method throws InvalidInputDataException if any of the + following errors happen: + - Unable to decode the PEM certificate and/or private key. + - Unable to decrypt the private key with the given passphrase. + - The certificate and/or private key do not contain RSA keys. + - The certificate is not usable with the given private key. + Arguments: + certificate -- + privateKey -- + passphrase -- + context -- The request context for the invocation. + """ + def updateCertificate(self, certificate, privateKey, passphrase, context=None): + return _M_MumbleServer.Server._op_updateCertificate.invoke(self, ((certificate, privateKey, passphrase), context)) + + """ + Update the server's certificate information. + Reconfigure the running server's TLS socket with the given + certificate and private key. + The certificate and and private key must be PEM formatted. + New clients will see the new certificate. + Existing clients will continue to see the certificate the server + was using when they connected to it. + This method throws InvalidInputDataException if any of the + following errors happen: + - Unable to decode the PEM certificate and/or private key. + - Unable to decrypt the private key with the given passphrase. + - The certificate and/or private key do not contain RSA keys. + - The certificate is not usable with the given private key. + Arguments: + certificate -- + privateKey -- + passphrase -- + context -- The request context for the invocation. + Returns: A future object for the invocation. + """ + def updateCertificateAsync(self, certificate, privateKey, passphrase, context=None): + return _M_MumbleServer.Server._op_updateCertificate.invokeAsync(self, ((certificate, privateKey, passphrase), context)) + + """ + Update the server's certificate information. + Reconfigure the running server's TLS socket with the given + certificate and private key. + The certificate and and private key must be PEM formatted. + New clients will see the new certificate. + Existing clients will continue to see the certificate the server + was using when they connected to it. + This method throws InvalidInputDataException if any of the + following errors happen: + - Unable to decode the PEM certificate and/or private key. + - Unable to decrypt the private key with the given passphrase. + - The certificate and/or private key do not contain RSA keys. + - The certificate is not usable with the given private key. + Arguments: + certificate -- + privateKey -- + passphrase -- + _response -- The asynchronous response callback. + _ex -- The asynchronous exception callback. + _sent -- The asynchronous sent callback. + context -- The request context for the invocation. + Returns: An asynchronous result object for the invocation. + """ + def begin_updateCertificate(self, certificate, privateKey, passphrase, _response=None, _ex=None, _sent=None, context=None): + return _M_MumbleServer.Server._op_updateCertificate.begin(self, ((certificate, privateKey, passphrase), _response, _ex, _sent, context)) + + """ + Update the server's certificate information. + Reconfigure the running server's TLS socket with the given + certificate and private key. + The certificate and and private key must be PEM formatted. + New clients will see the new certificate. + Existing clients will continue to see the certificate the server + was using when they connected to it. + This method throws InvalidInputDataException if any of the + following errors happen: + - Unable to decode the PEM certificate and/or private key. + - Unable to decrypt the private key with the given passphrase. + - The certificate and/or private key do not contain RSA keys. + - The certificate is not usable with the given private key. + Arguments: + certificate -- + privateKey -- + passphrase -- + """ + def end_updateCertificate(self, _r): + return _M_MumbleServer.Server._op_updateCertificate.end(self, _r) + + """ + Makes the given user start listening to the given channel. + Arguments: + userid -- The ID of the user + channelid -- The ID of the channel + context -- The request context for the invocation. + """ + def startListening(self, userid, channelid, context=None): + return _M_MumbleServer.Server._op_startListening.invoke(self, ((userid, channelid), context)) + + """ + Makes the given user start listening to the given channel. + Arguments: + userid -- The ID of the user + channelid -- The ID of the channel + context -- The request context for the invocation. + Returns: A future object for the invocation. + """ + def startListeningAsync(self, userid, channelid, context=None): + return _M_MumbleServer.Server._op_startListening.invokeAsync(self, ((userid, channelid), context)) + + """ + Makes the given user start listening to the given channel. + Arguments: + userid -- The ID of the user + channelid -- The ID of the channel + _response -- The asynchronous response callback. + _ex -- The asynchronous exception callback. + _sent -- The asynchronous sent callback. + context -- The request context for the invocation. + Returns: An asynchronous result object for the invocation. + """ + def begin_startListening(self, userid, channelid, _response=None, _ex=None, _sent=None, context=None): + return _M_MumbleServer.Server._op_startListening.begin(self, ((userid, channelid), _response, _ex, _sent, context)) + + """ + Makes the given user start listening to the given channel. + Arguments: + userid -- The ID of the user + channelid -- The ID of the channel + """ + def end_startListening(self, _r): + return _M_MumbleServer.Server._op_startListening.end(self, _r) + + """ + Makes the given user stop listening to the given channel. + Arguments: + userid -- The ID of the user + channelid -- The ID of the channel + context -- The request context for the invocation. + """ + def stopListening(self, userid, channelid, context=None): + return _M_MumbleServer.Server._op_stopListening.invoke(self, ((userid, channelid), context)) + + """ + Makes the given user stop listening to the given channel. + Arguments: + userid -- The ID of the user + channelid -- The ID of the channel + context -- The request context for the invocation. + Returns: A future object for the invocation. + """ + def stopListeningAsync(self, userid, channelid, context=None): + return _M_MumbleServer.Server._op_stopListening.invokeAsync(self, ((userid, channelid), context)) + + """ + Makes the given user stop listening to the given channel. + Arguments: + userid -- The ID of the user + channelid -- The ID of the channel + _response -- The asynchronous response callback. + _ex -- The asynchronous exception callback. + _sent -- The asynchronous sent callback. + context -- The request context for the invocation. + Returns: An asynchronous result object for the invocation. + """ + def begin_stopListening(self, userid, channelid, _response=None, _ex=None, _sent=None, context=None): + return _M_MumbleServer.Server._op_stopListening.begin(self, ((userid, channelid), _response, _ex, _sent, context)) + + """ + Makes the given user stop listening to the given channel. + Arguments: + userid -- The ID of the user + channelid -- The ID of the channel + """ + def end_stopListening(self, _r): + return _M_MumbleServer.Server._op_stopListening.end(self, _r) + + """ + Arguments: + userid -- The ID of the user + channelid -- The ID of the channel + context -- The request context for the invocation. + Returns: Whether the given user is currently listening to the given channel + """ + def isListening(self, userid, channelid, context=None): + return _M_MumbleServer.Server._op_isListening.invoke(self, ((userid, channelid), context)) + + """ + Arguments: + userid -- The ID of the user + channelid -- The ID of the channel + context -- The request context for the invocation. + Returns: A future object for the invocation. + """ + def isListeningAsync(self, userid, channelid, context=None): + return _M_MumbleServer.Server._op_isListening.invokeAsync(self, ((userid, channelid), context)) + + """ + Arguments: + userid -- The ID of the user + channelid -- The ID of the channel + _response -- The asynchronous response callback. + _ex -- The asynchronous exception callback. + _sent -- The asynchronous sent callback. + context -- The request context for the invocation. + Returns: An asynchronous result object for the invocation. + """ + def begin_isListening(self, userid, channelid, _response=None, _ex=None, _sent=None, context=None): + return _M_MumbleServer.Server._op_isListening.begin(self, ((userid, channelid), _response, _ex, _sent, context)) + + """ + Arguments: + userid -- The ID of the user + channelid -- The ID of the channel + Returns: Whether the given user is currently listening to the given channel + """ + def end_isListening(self, _r): + return _M_MumbleServer.Server._op_isListening.end(self, _r) + + """ + Arguments: + userid -- The ID of the user + context -- The request context for the invocation. + Returns: An ID-list of channels the given user is listening to + """ + def getListeningChannels(self, userid, context=None): + return _M_MumbleServer.Server._op_getListeningChannels.invoke(self, ((userid, ), context)) + + """ + Arguments: + userid -- The ID of the user + context -- The request context for the invocation. + Returns: A future object for the invocation. + """ + def getListeningChannelsAsync(self, userid, context=None): + return _M_MumbleServer.Server._op_getListeningChannels.invokeAsync(self, ((userid, ), context)) + + """ + Arguments: + userid -- The ID of the user + _response -- The asynchronous response callback. + _ex -- The asynchronous exception callback. + _sent -- The asynchronous sent callback. + context -- The request context for the invocation. + Returns: An asynchronous result object for the invocation. + """ + def begin_getListeningChannels(self, userid, _response=None, _ex=None, _sent=None, context=None): + return _M_MumbleServer.Server._op_getListeningChannels.begin(self, ((userid, ), _response, _ex, _sent, context)) + + """ + Arguments: + userid -- The ID of the user + Returns: An ID-list of channels the given user is listening to + """ + def end_getListeningChannels(self, _r): + return _M_MumbleServer.Server._op_getListeningChannels.end(self, _r) + + """ + Arguments: + channelid -- The ID of the channel + context -- The request context for the invocation. + Returns: An ID-list of users listening to the given channel + """ + def getListeningUsers(self, channelid, context=None): + return _M_MumbleServer.Server._op_getListeningUsers.invoke(self, ((channelid, ), context)) + + """ + Arguments: + channelid -- The ID of the channel + context -- The request context for the invocation. + Returns: A future object for the invocation. + """ + def getListeningUsersAsync(self, channelid, context=None): + return _M_MumbleServer.Server._op_getListeningUsers.invokeAsync(self, ((channelid, ), context)) + + """ + Arguments: + channelid -- The ID of the channel + _response -- The asynchronous response callback. + _ex -- The asynchronous exception callback. + _sent -- The asynchronous sent callback. + context -- The request context for the invocation. + Returns: An asynchronous result object for the invocation. + """ + def begin_getListeningUsers(self, channelid, _response=None, _ex=None, _sent=None, context=None): + return _M_MumbleServer.Server._op_getListeningUsers.begin(self, ((channelid, ), _response, _ex, _sent, context)) + + """ + Arguments: + channelid -- The ID of the channel + Returns: An ID-list of users listening to the given channel + """ + def end_getListeningUsers(self, _r): + return _M_MumbleServer.Server._op_getListeningUsers.end(self, _r) + + """ + Arguments: + channelid -- The ID of the channel + userid -- The ID of the user + context -- The request context for the invocation. + Returns: The volume adjustment set for a listener of the given user in the given channel + """ + def getListenerVolumeAdjustment(self, channelid, userid, context=None): + return _M_MumbleServer.Server._op_getListenerVolumeAdjustment.invoke(self, ((channelid, userid), context)) + + """ + Arguments: + channelid -- The ID of the channel + userid -- The ID of the user + context -- The request context for the invocation. + Returns: A future object for the invocation. + """ + def getListenerVolumeAdjustmentAsync(self, channelid, userid, context=None): + return _M_MumbleServer.Server._op_getListenerVolumeAdjustment.invokeAsync(self, ((channelid, userid), context)) + + """ + Arguments: + channelid -- The ID of the channel + userid -- The ID of the user + _response -- The asynchronous response callback. + _ex -- The asynchronous exception callback. + _sent -- The asynchronous sent callback. + context -- The request context for the invocation. + Returns: An asynchronous result object for the invocation. + """ + def begin_getListenerVolumeAdjustment(self, channelid, userid, _response=None, _ex=None, _sent=None, context=None): + return _M_MumbleServer.Server._op_getListenerVolumeAdjustment.begin(self, ((channelid, userid), _response, _ex, _sent, context)) + + """ + Arguments: + channelid -- The ID of the channel + userid -- The ID of the user + Returns: The volume adjustment set for a listener of the given user in the given channel + """ + def end_getListenerVolumeAdjustment(self, _r): + return _M_MumbleServer.Server._op_getListenerVolumeAdjustment.end(self, _r) + + """ + Sets the volume adjustment set for a listener of the given user in the given channel + Arguments: + channelid -- The ID of the channel + userid -- The ID of the user + volumeAdjustment -- + context -- The request context for the invocation. + """ + def setListenerVolumeAdjustment(self, channelid, userid, volumeAdjustment, context=None): + return _M_MumbleServer.Server._op_setListenerVolumeAdjustment.invoke(self, ((channelid, userid, volumeAdjustment), context)) + + """ + Sets the volume adjustment set for a listener of the given user in the given channel + Arguments: + channelid -- The ID of the channel + userid -- The ID of the user + volumeAdjustment -- + context -- The request context for the invocation. + Returns: A future object for the invocation. + """ + def setListenerVolumeAdjustmentAsync(self, channelid, userid, volumeAdjustment, context=None): + return _M_MumbleServer.Server._op_setListenerVolumeAdjustment.invokeAsync(self, ((channelid, userid, volumeAdjustment), context)) + + """ + Sets the volume adjustment set for a listener of the given user in the given channel + Arguments: + channelid -- The ID of the channel + userid -- The ID of the user + volumeAdjustment -- + _response -- The asynchronous response callback. + _ex -- The asynchronous exception callback. + _sent -- The asynchronous sent callback. + context -- The request context for the invocation. + Returns: An asynchronous result object for the invocation. + """ + def begin_setListenerVolumeAdjustment(self, channelid, userid, volumeAdjustment, _response=None, _ex=None, _sent=None, context=None): + return _M_MumbleServer.Server._op_setListenerVolumeAdjustment.begin(self, ((channelid, userid, volumeAdjustment), _response, _ex, _sent, context)) + + """ + Sets the volume adjustment set for a listener of the given user in the given channel + Arguments: + channelid -- The ID of the channel + userid -- The ID of the user + volumeAdjustment -- + """ + def end_setListenerVolumeAdjustment(self, _r): + return _M_MumbleServer.Server._op_setListenerVolumeAdjustment.end(self, _r) + + """ + Arguments: + receiverUserIDs -- list of IDs of the users the message shall be sent to + context -- The request context for the invocation. + """ + def sendWelcomeMessage(self, receiverUserIDs, context=None): + return _M_MumbleServer.Server._op_sendWelcomeMessage.invoke(self, ((receiverUserIDs, ), context)) + + """ + Arguments: + receiverUserIDs -- list of IDs of the users the message shall be sent to + context -- The request context for the invocation. + Returns: A future object for the invocation. + """ + def sendWelcomeMessageAsync(self, receiverUserIDs, context=None): + return _M_MumbleServer.Server._op_sendWelcomeMessage.invokeAsync(self, ((receiverUserIDs, ), context)) + + """ + Arguments: + receiverUserIDs -- list of IDs of the users the message shall be sent to + _response -- The asynchronous response callback. + _ex -- The asynchronous exception callback. + _sent -- The asynchronous sent callback. + context -- The request context for the invocation. + Returns: An asynchronous result object for the invocation. + """ + def begin_sendWelcomeMessage(self, receiverUserIDs, _response=None, _ex=None, _sent=None, context=None): + return _M_MumbleServer.Server._op_sendWelcomeMessage.begin(self, ((receiverUserIDs, ), _response, _ex, _sent, context)) + + def end_sendWelcomeMessage(self, _r): + return _M_MumbleServer.Server._op_sendWelcomeMessage.end(self, _r) + + @staticmethod + def checkedCast(proxy, facetOrContext=None, context=None): + return _M_MumbleServer.ServerPrx.ice_checkedCast(proxy, '::MumbleServer::Server', facetOrContext, context) + + @staticmethod + def uncheckedCast(proxy, facet=None): + return _M_MumbleServer.ServerPrx.ice_uncheckedCast(proxy, facet) + + @staticmethod + def ice_staticId(): + return '::MumbleServer::Server' + _M_MumbleServer._t_ServerPrx = IcePy.defineProxy('::MumbleServer::Server', ServerPrx) + + _M_MumbleServer.ServerPrx = ServerPrx + del ServerPrx + + _M_MumbleServer.Server = Ice.createTempClass() + class Server(Ice.Object): + + def ice_ids(self, current=None): + return ('::Ice::Object', '::MumbleServer::Server') + + def ice_id(self, current=None): + return '::MumbleServer::Server' + + @staticmethod + def ice_staticId(): + return '::MumbleServer::Server' + + def isRunning(self, current=None): + """ + Shows if the server currently running (accepting users). + Arguments: + current -- The Current object for the invocation. + Returns: A future object for the invocation. + """ + raise NotImplementedError("servant method 'isRunning' not implemented") + + def start(self, current=None): + """ + Start server. + Arguments: + current -- The Current object for the invocation. + Returns: A future object for the invocation. + """ + raise NotImplementedError("servant method 'start' not implemented") + + def stop(self, current=None): + """ + Stop server. + Note: Server will be restarted on Murmur restart unless explicitly disabled + with setConf("boot", false) + Arguments: + current -- The Current object for the invocation. + Returns: A future object for the invocation. + """ + raise NotImplementedError("servant method 'stop' not implemented") + + def delete(self, current=None): + """ + Delete server and all it's configuration. + Arguments: + current -- The Current object for the invocation. + Returns: A future object for the invocation. + """ + raise NotImplementedError("servant method 'delete' not implemented") + + def id(self, current=None): + """ + Fetch the server id. + Arguments: + current -- The Current object for the invocation. + Returns: A future object for the invocation. + """ + raise NotImplementedError("servant method 'id' not implemented") + + def addCallback(self, cb, current=None): + """ + Add a callback. The callback will receive notifications about changes to users and channels. + Arguments: + cb -- Callback interface which will receive notifications. + current -- The Current object for the invocation. + Returns: A future object for the invocation. + """ + raise NotImplementedError("servant method 'addCallback' not implemented") + + def removeCallback(self, cb, current=None): + """ + Remove a callback. + Arguments: + cb -- Callback interface to be removed. + current -- The Current object for the invocation. + Returns: A future object for the invocation. + """ + raise NotImplementedError("servant method 'removeCallback' not implemented") + + def setAuthenticator(self, auth, current=None): + """ + Set external authenticator. If set, all authentications from clients are forwarded to this + proxy. + Arguments: + auth -- Authenticator object to perform subsequent authentications. + current -- The Current object for the invocation. + Returns: A future object for the invocation. + """ + raise NotImplementedError("servant method 'setAuthenticator' not implemented") + + def getConf(self, key, current=None): + """ + Retrieve configuration item. + Arguments: + key -- Configuration key. + current -- The Current object for the invocation. + Returns: A future object for the invocation. + """ + raise NotImplementedError("servant method 'getConf' not implemented") + + def getAllConf(self, current=None): + """ + Retrieve all configuration items. + Arguments: + current -- The Current object for the invocation. + Returns: A future object for the invocation. + """ + raise NotImplementedError("servant method 'getAllConf' not implemented") + + def setConf(self, key, value, current=None): + """ + Set a configuration item. + Arguments: + key -- Configuration key. + value -- Configuration value. + current -- The Current object for the invocation. + Returns: A future object for the invocation. + """ + raise NotImplementedError("servant method 'setConf' not implemented") + + def setSuperuserPassword(self, pw, current=None): + """ + Set superuser password. This is just a convenience for using updateRegistration on user id 0. + Arguments: + pw -- Password. + current -- The Current object for the invocation. + Returns: A future object for the invocation. + """ + raise NotImplementedError("servant method 'setSuperuserPassword' not implemented") + + def getLog(self, first, last, current=None): + """ + Fetch log entries. + Arguments: + first -- Lowest numbered entry to fetch. 0 is the most recent item. + last -- Last entry to fetch. + current -- The Current object for the invocation. + Returns: A future object for the invocation. + """ + raise NotImplementedError("servant method 'getLog' not implemented") + + def getLogLen(self, current=None): + """ + Fetch length of log + Arguments: + current -- The Current object for the invocation. + Returns: A future object for the invocation. + """ + raise NotImplementedError("servant method 'getLogLen' not implemented") + + def getUsers(self, current=None): + """ + Fetch all users. This returns all currently connected users on the server. + Arguments: + current -- The Current object for the invocation. + Returns: A future object for the invocation. + """ + raise NotImplementedError("servant method 'getUsers' not implemented") + + def getChannels(self, current=None): + """ + Fetch all channels. This returns all defined channels on the server. The root channel is always channel 0. + Arguments: + current -- The Current object for the invocation. + Returns: A future object for the invocation. + """ + raise NotImplementedError("servant method 'getChannels' not implemented") + + def getCertificateList(self, session, current=None): + """ + Fetch certificate of user. This returns the complete certificate chain of a user. + Arguments: + session -- Connection ID of user. See User.session. + current -- The Current object for the invocation. + Returns: A future object for the invocation. + """ + raise NotImplementedError("servant method 'getCertificateList' not implemented") + + def getTree(self, current=None): + """ + Fetch all channels and connected users as a tree. This retrieves an easy-to-use representation of the server + as a tree. This is primarily used for viewing the state of the server on a webpage. + Arguments: + current -- The Current object for the invocation. + Returns: A future object for the invocation. + """ + raise NotImplementedError("servant method 'getTree' not implemented") + + def getBans(self, current=None): + """ + Fetch all current IP bans on the server. + Arguments: + current -- The Current object for the invocation. + Returns: A future object for the invocation. + """ + raise NotImplementedError("servant method 'getBans' not implemented") + + def setBans(self, bans, current=None): + """ + Set all current IP bans on the server. This will replace any bans already present, so if you want to add a ban, be sure to call getBans and then + append to the returned list before calling this method. + Arguments: + bans -- List of bans. + current -- The Current object for the invocation. + Returns: A future object for the invocation. + """ + raise NotImplementedError("servant method 'setBans' not implemented") + + def kickUser(self, session, reason, current=None): + """ + Kick a user. The user is not banned, and is free to rejoin the server. + Arguments: + session -- Connection ID of user. See User.session. + reason -- Text message to show when user is kicked. + current -- The Current object for the invocation. + Returns: A future object for the invocation. + """ + raise NotImplementedError("servant method 'kickUser' not implemented") + + def getState(self, session, current=None): + """ + Get state of a single connected user. + Arguments: + session -- Connection ID of user. See User.session. + current -- The Current object for the invocation. + Returns: A future object for the invocation. + """ + raise NotImplementedError("servant method 'getState' not implemented") + + def setState(self, state, current=None): + """ + Set user state. You can use this to move, mute and deafen users. + Arguments: + state -- User state to set. + current -- The Current object for the invocation. + Returns: A future object for the invocation. + """ + raise NotImplementedError("servant method 'setState' not implemented") + + def sendMessage(self, session, text, current=None): + """ + Send text message to a single user. + Arguments: + session -- Connection ID of user. See User.session. + text -- Message to send. + current -- The Current object for the invocation. + Returns: A future object for the invocation. + """ + raise NotImplementedError("servant method 'sendMessage' not implemented") + + def hasPermission(self, session, channelid, perm, current=None): + """ + Check if user is permitted to perform action. + Arguments: + session -- Connection ID of user. See User.session. + channelid -- ID of Channel. See Channel.id. + perm -- Permission bits to check. + current -- The Current object for the invocation. + Returns: A future object for the invocation. + """ + raise NotImplementedError("servant method 'hasPermission' not implemented") + + def effectivePermissions(self, session, channelid, current=None): + """ + Return users effective permissions + Arguments: + session -- Connection ID of user. See User.session. + channelid -- ID of Channel. See Channel.id. + current -- The Current object for the invocation. + Returns: A future object for the invocation. + """ + raise NotImplementedError("servant method 'effectivePermissions' not implemented") + + def addContextCallback(self, session, action, text, cb, ctx, current=None): + """ + Add a context callback. This is done per user, and will add a context menu action for the user. + Arguments: + session -- Session of user which should receive context entry. + action -- Action string, a unique name to associate with the action. + text -- Name of action shown to user. + cb -- Callback interface which will receive notifications. + ctx -- Context this should be used in. Needs to be one or a combination of ContextServer, ContextChannel and ContextUser. + current -- The Current object for the invocation. + Returns: A future object for the invocation. + """ + raise NotImplementedError("servant method 'addContextCallback' not implemented") + + def removeContextCallback(self, cb, current=None): + """ + Remove a callback. + Arguments: + cb -- Callback interface to be removed. This callback will be removed from all from all users. + current -- The Current object for the invocation. + Returns: A future object for the invocation. + """ + raise NotImplementedError("servant method 'removeContextCallback' not implemented") + + def getChannelState(self, channelid, current=None): + """ + Get state of single channel. + Arguments: + channelid -- ID of Channel. See Channel.id. + current -- The Current object for the invocation. + Returns: A future object for the invocation. + """ + raise NotImplementedError("servant method 'getChannelState' not implemented") + + def setChannelState(self, state, current=None): + """ + Set state of a single channel. You can use this to move or relink channels. + Arguments: + state -- Channel state to set. + current -- The Current object for the invocation. + Returns: A future object for the invocation. + """ + raise NotImplementedError("servant method 'setChannelState' not implemented") + + def removeChannel(self, channelid, current=None): + """ + Remove a channel and all its subchannels. + Arguments: + channelid -- ID of Channel. See Channel.id. + current -- The Current object for the invocation. + Returns: A future object for the invocation. + """ + raise NotImplementedError("servant method 'removeChannel' not implemented") + + def addChannel(self, name, parent, current=None): + """ + Add a new channel. + Arguments: + name -- Name of new channel. + parent -- Channel ID of parent channel. See Channel.id. + current -- The Current object for the invocation. + Returns: A future object for the invocation. + """ + raise NotImplementedError("servant method 'addChannel' not implemented") + + def sendMessageChannel(self, channelid, tree, text, current=None): + """ + Send text message to channel or a tree of channels. + Arguments: + channelid -- Channel ID of channel to send to. See Channel.id. + tree -- If true, the message will be sent to the channel and all its subchannels. + text -- Message to send. + current -- The Current object for the invocation. + Returns: A future object for the invocation. + """ + raise NotImplementedError("servant method 'sendMessageChannel' not implemented") + + def getACL(self, channelid, current=None): + """ + Retrieve ACLs and Groups on a channel. + Arguments: + channelid -- Channel ID of channel to fetch from. See Channel.id. + current -- The Current object for the invocation. + Returns: A future object for the invocation. + """ + raise NotImplementedError("servant method 'getACL' not implemented") + + def setACL(self, channelid, acls, groups, inherit, current=None): + """ + Set ACLs and Groups on a channel. Note that this will replace all existing ACLs and groups on the channel. + Arguments: + channelid -- Channel ID of channel to fetch from. See Channel.id. + acls -- List of ACLs on the channel. + groups -- List of groups on the channel. + inherit -- Should this channel inherit ACLs from the parent channel? + current -- The Current object for the invocation. + Returns: A future object for the invocation. + """ + raise NotImplementedError("servant method 'setACL' not implemented") + + def addUserToGroup(self, channelid, session, group, current=None): + """ + Temporarily add a user to a group on a channel. This state is not saved, and is intended for temporary memberships. + Arguments: + channelid -- Channel ID of channel to add to. See Channel.id. + session -- Connection ID of user. See User.session. + group -- Group name to add to. + current -- The Current object for the invocation. + Returns: A future object for the invocation. + """ + raise NotImplementedError("servant method 'addUserToGroup' not implemented") + + def removeUserFromGroup(self, channelid, session, group, current=None): + """ + Remove a user from a temporary group membership on a channel. This state is not saved, and is intended for temporary memberships. + Arguments: + channelid -- Channel ID of channel to add to. See Channel.id. + session -- Connection ID of user. See User.session. + group -- Group name to remove from. + current -- The Current object for the invocation. + Returns: A future object for the invocation. + """ + raise NotImplementedError("servant method 'removeUserFromGroup' not implemented") + + def redirectWhisperGroup(self, session, source, target, current=None): + """ + Redirect whisper targets for user. If set, whenever a user tries to whisper to group "source", the whisper will be redirected to group "target". + To remove a redirect pass an empty target string. This is intended for context groups. + Arguments: + session -- Connection ID of user. See User.session. + source -- Group name to redirect from. + target -- Group name to redirect to. + current -- The Current object for the invocation. + Returns: A future object for the invocation. + """ + raise NotImplementedError("servant method 'redirectWhisperGroup' not implemented") + + def getUserNames(self, ids, current=None): + """ + Map a list of User.userid to a matching name. + Arguments: + ids -- + current -- The Current object for the invocation. + Returns: A future object for the invocation. + """ + raise NotImplementedError("servant method 'getUserNames' not implemented") + + def getUserIds(self, names, current=None): + """ + Map a list of user names to a matching id. + @reuturn List of matching ids, with -1 representing invalid or unknown user names. + Arguments: + names -- + current -- The Current object for the invocation. + Returns: A future object for the invocation. + """ + raise NotImplementedError("servant method 'getUserIds' not implemented") + + def registerUser(self, info, current=None): + """ + Register a new user. + Arguments: + info -- Information about new user. Must include at least "name". + current -- The Current object for the invocation. + Returns: A future object for the invocation. + """ + raise NotImplementedError("servant method 'registerUser' not implemented") + + def unregisterUser(self, userid, current=None): + """ + Remove a user registration. + Arguments: + userid -- ID of registered user. See RegisteredUser.userid. + current -- The Current object for the invocation. + Returns: A future object for the invocation. + """ + raise NotImplementedError("servant method 'unregisterUser' not implemented") + + def updateRegistration(self, userid, info, current=None): + """ + Update the registration for a user. You can use this to set the email or password of a user, + and can also use it to change the user's name. + Arguments: + userid -- + info -- + current -- The Current object for the invocation. + Returns: A future object for the invocation. + """ + raise NotImplementedError("servant method 'updateRegistration' not implemented") + + def getRegistration(self, userid, current=None): + """ + Fetch registration for a single user. + Arguments: + userid -- ID of registered user. See RegisteredUser.userid. + current -- The Current object for the invocation. + Returns: A future object for the invocation. + """ + raise NotImplementedError("servant method 'getRegistration' not implemented") + + def getRegisteredUsers(self, filter, current=None): + """ + Fetch a group of registered users. + Arguments: + filter -- Substring of user name. If blank, will retrieve all registered users. + current -- The Current object for the invocation. + Returns: A future object for the invocation. + """ + raise NotImplementedError("servant method 'getRegisteredUsers' not implemented") + + def verifyPassword(self, name, pw, current=None): + """ + Verify the password of a user. You can use this to verify a user's credentials. + Arguments: + name -- User name. See RegisteredUser.name. + pw -- User password. + current -- The Current object for the invocation. + Returns: A future object for the invocation. + """ + raise NotImplementedError("servant method 'verifyPassword' not implemented") + + def getTexture(self, userid, current=None): + """ + Fetch user texture. Textures are stored as zlib compress()ed 600x60 32-bit BGRA data. + Arguments: + userid -- ID of registered user. See RegisteredUser.userid. + current -- The Current object for the invocation. + Returns: A future object for the invocation. + """ + raise NotImplementedError("servant method 'getTexture' not implemented") + + def setTexture(self, userid, tex, current=None): + """ + Set a user texture (now called avatar). + Arguments: + userid -- ID of registered user. See RegisteredUser.userid. + tex -- Texture (as a Byte-Array) to set for the user, or an empty texture to remove the existing texture. + current -- The Current object for the invocation. + Returns: A future object for the invocation. + """ + raise NotImplementedError("servant method 'setTexture' not implemented") + + def getUptime(self, current=None): + """ + Get virtual server uptime. + Arguments: + current -- The Current object for the invocation. + Returns: A future object for the invocation. + """ + raise NotImplementedError("servant method 'getUptime' not implemented") + + def updateCertificate(self, certificate, privateKey, passphrase, current=None): + """ + Update the server's certificate information. + Reconfigure the running server's TLS socket with the given + certificate and private key. + The certificate and and private key must be PEM formatted. + New clients will see the new certificate. + Existing clients will continue to see the certificate the server + was using when they connected to it. + This method throws InvalidInputDataException if any of the + following errors happen: + - Unable to decode the PEM certificate and/or private key. + - Unable to decrypt the private key with the given passphrase. + - The certificate and/or private key do not contain RSA keys. + - The certificate is not usable with the given private key. + Arguments: + certificate -- + privateKey -- + passphrase -- + current -- The Current object for the invocation. + Returns: A future object for the invocation. + """ + raise NotImplementedError("servant method 'updateCertificate' not implemented") + + def startListening(self, userid, channelid, current=None): + """ + Makes the given user start listening to the given channel. + Arguments: + userid -- The ID of the user + channelid -- The ID of the channel + current -- The Current object for the invocation. + Returns: A future object for the invocation. + """ + raise NotImplementedError("servant method 'startListening' not implemented") + + def stopListening(self, userid, channelid, current=None): + """ + Makes the given user stop listening to the given channel. + Arguments: + userid -- The ID of the user + channelid -- The ID of the channel + current -- The Current object for the invocation. + Returns: A future object for the invocation. + """ + raise NotImplementedError("servant method 'stopListening' not implemented") + + def isListening(self, userid, channelid, current=None): + """ + Arguments: + userid -- The ID of the user + channelid -- The ID of the channel + current -- The Current object for the invocation. + Returns: A future object for the invocation. + """ + raise NotImplementedError("servant method 'isListening' not implemented") + + def getListeningChannels(self, userid, current=None): + """ + Arguments: + userid -- The ID of the user + current -- The Current object for the invocation. + Returns: A future object for the invocation. + """ + raise NotImplementedError("servant method 'getListeningChannels' not implemented") + + def getListeningUsers(self, channelid, current=None): + """ + Arguments: + channelid -- The ID of the channel + current -- The Current object for the invocation. + Returns: A future object for the invocation. + """ + raise NotImplementedError("servant method 'getListeningUsers' not implemented") + + def getListenerVolumeAdjustment(self, channelid, userid, current=None): + """ + Arguments: + channelid -- The ID of the channel + userid -- The ID of the user + current -- The Current object for the invocation. + Returns: A future object for the invocation. + """ + raise NotImplementedError("servant method 'getListenerVolumeAdjustment' not implemented") + + def setListenerVolumeAdjustment(self, channelid, userid, volumeAdjustment, current=None): + """ + Sets the volume adjustment set for a listener of the given user in the given channel + Arguments: + channelid -- The ID of the channel + userid -- The ID of the user + volumeAdjustment -- + current -- The Current object for the invocation. + Returns: A future object for the invocation. + """ + raise NotImplementedError("servant method 'setListenerVolumeAdjustment' not implemented") + + def sendWelcomeMessage(self, receiverUserIDs, current=None): + """ + Arguments: + receiverUserIDs -- list of IDs of the users the message shall be sent to + current -- The Current object for the invocation. + Returns: A future object for the invocation. + """ + raise NotImplementedError("servant method 'sendWelcomeMessage' not implemented") + + def __str__(self): + return IcePy.stringify(self, _M_MumbleServer._t_ServerDisp) + + __repr__ = __str__ + + _M_MumbleServer._t_ServerDisp = IcePy.defineClass('::MumbleServer::Server', Server, (), None, ()) + Server._ice_type = _M_MumbleServer._t_ServerDisp + + Server._op_isRunning = IcePy.Operation('isRunning', Ice.OperationMode.Idempotent, Ice.OperationMode.Idempotent, True, None, (), (), (), ((), IcePy._t_bool, False, 0), (_M_MumbleServer._t_InvalidSecretException,)) + Server._op_start = IcePy.Operation('start', Ice.OperationMode.Normal, Ice.OperationMode.Normal, True, None, (), (), (), None, (_M_MumbleServer._t_ServerBootedException, _M_MumbleServer._t_ServerFailureException, _M_MumbleServer._t_InvalidSecretException)) + Server._op_stop = IcePy.Operation('stop', Ice.OperationMode.Normal, Ice.OperationMode.Normal, True, None, (), (), (), None, (_M_MumbleServer._t_ServerBootedException, _M_MumbleServer._t_InvalidSecretException)) + Server._op_delete = IcePy.Operation('delete', Ice.OperationMode.Normal, Ice.OperationMode.Normal, True, None, (), (), (), None, (_M_MumbleServer._t_ServerBootedException, _M_MumbleServer._t_InvalidSecretException)) + Server._op_id = IcePy.Operation('id', Ice.OperationMode.Idempotent, Ice.OperationMode.Idempotent, True, None, (), (), (), ((), IcePy._t_int, False, 0), (_M_MumbleServer._t_InvalidSecretException,)) + Server._op_addCallback = IcePy.Operation('addCallback', Ice.OperationMode.Normal, Ice.OperationMode.Normal, True, None, (), (((), _M_MumbleServer._t_ServerCallbackPrx, False, 0),), (), None, (_M_MumbleServer._t_ServerBootedException, _M_MumbleServer._t_InvalidCallbackException, _M_MumbleServer._t_InvalidSecretException)) + Server._op_removeCallback = IcePy.Operation('removeCallback', Ice.OperationMode.Normal, Ice.OperationMode.Normal, True, None, (), (((), _M_MumbleServer._t_ServerCallbackPrx, False, 0),), (), None, (_M_MumbleServer._t_ServerBootedException, _M_MumbleServer._t_InvalidCallbackException, _M_MumbleServer._t_InvalidSecretException)) + Server._op_setAuthenticator = IcePy.Operation('setAuthenticator', Ice.OperationMode.Normal, Ice.OperationMode.Normal, True, None, (), (((), _M_MumbleServer._t_ServerAuthenticatorPrx, False, 0),), (), None, (_M_MumbleServer._t_ServerBootedException, _M_MumbleServer._t_InvalidCallbackException, _M_MumbleServer._t_InvalidSecretException)) + Server._op_getConf = IcePy.Operation('getConf', Ice.OperationMode.Idempotent, Ice.OperationMode.Idempotent, True, None, (), (((), IcePy._t_string, False, 0),), (), ((), IcePy._t_string, False, 0), (_M_MumbleServer._t_InvalidSecretException, _M_MumbleServer._t_WriteOnlyException)) + Server._op_getAllConf = IcePy.Operation('getAllConf', Ice.OperationMode.Idempotent, Ice.OperationMode.Idempotent, True, None, (), (), (), ((), _M_MumbleServer._t_ConfigMap, False, 0), (_M_MumbleServer._t_InvalidSecretException,)) + Server._op_setConf = IcePy.Operation('setConf', Ice.OperationMode.Idempotent, Ice.OperationMode.Idempotent, True, None, (), (((), IcePy._t_string, False, 0), ((), IcePy._t_string, False, 0)), (), None, (_M_MumbleServer._t_InvalidSecretException,)) + Server._op_setSuperuserPassword = IcePy.Operation('setSuperuserPassword', Ice.OperationMode.Idempotent, Ice.OperationMode.Idempotent, True, None, (), (((), IcePy._t_string, False, 0),), (), None, (_M_MumbleServer._t_InvalidSecretException,)) + Server._op_getLog = IcePy.Operation('getLog', Ice.OperationMode.Idempotent, Ice.OperationMode.Idempotent, True, None, (), (((), IcePy._t_int, False, 0), ((), IcePy._t_int, False, 0)), (), ((), _M_MumbleServer._t_LogList, False, 0), (_M_MumbleServer._t_InvalidSecretException,)) + Server._op_getLogLen = IcePy.Operation('getLogLen', Ice.OperationMode.Idempotent, Ice.OperationMode.Idempotent, True, None, (), (), (), ((), IcePy._t_int, False, 0), (_M_MumbleServer._t_InvalidSecretException,)) + Server._op_getUsers = IcePy.Operation('getUsers', Ice.OperationMode.Idempotent, Ice.OperationMode.Idempotent, True, None, (), (), (), ((), _M_MumbleServer._t_UserMap, False, 0), (_M_MumbleServer._t_ServerBootedException, _M_MumbleServer._t_InvalidSecretException)) + Server._op_getChannels = IcePy.Operation('getChannels', Ice.OperationMode.Idempotent, Ice.OperationMode.Idempotent, True, None, (), (), (), ((), _M_MumbleServer._t_ChannelMap, False, 0), (_M_MumbleServer._t_ServerBootedException, _M_MumbleServer._t_InvalidSecretException)) + Server._op_getCertificateList = IcePy.Operation('getCertificateList', Ice.OperationMode.Idempotent, Ice.OperationMode.Idempotent, True, None, (), (((), IcePy._t_int, False, 0),), (), ((), _M_MumbleServer._t_CertificateList, False, 0), (_M_MumbleServer._t_ServerBootedException, _M_MumbleServer._t_InvalidSessionException, _M_MumbleServer._t_InvalidSecretException)) + Server._op_getTree = IcePy.Operation('getTree', Ice.OperationMode.Idempotent, Ice.OperationMode.Idempotent, True, None, (), (), (), ((), _M_MumbleServer._t_Tree, False, 0), (_M_MumbleServer._t_ServerBootedException, _M_MumbleServer._t_InvalidSecretException)) + Server._op_getBans = IcePy.Operation('getBans', Ice.OperationMode.Idempotent, Ice.OperationMode.Idempotent, True, None, (), (), (), ((), _M_MumbleServer._t_BanList, False, 0), (_M_MumbleServer._t_ServerBootedException, _M_MumbleServer._t_InvalidSecretException)) + Server._op_setBans = IcePy.Operation('setBans', Ice.OperationMode.Idempotent, Ice.OperationMode.Idempotent, True, None, (), (((), _M_MumbleServer._t_BanList, False, 0),), (), None, (_M_MumbleServer._t_ServerBootedException, _M_MumbleServer._t_InvalidSecretException)) + Server._op_kickUser = IcePy.Operation('kickUser', Ice.OperationMode.Normal, Ice.OperationMode.Normal, True, None, (), (((), IcePy._t_int, False, 0), ((), IcePy._t_string, False, 0)), (), None, (_M_MumbleServer._t_ServerBootedException, _M_MumbleServer._t_InvalidSessionException, _M_MumbleServer._t_InvalidSecretException)) + Server._op_getState = IcePy.Operation('getState', Ice.OperationMode.Idempotent, Ice.OperationMode.Idempotent, True, None, (), (((), IcePy._t_int, False, 0),), (), ((), _M_MumbleServer._t_User, False, 0), (_M_MumbleServer._t_ServerBootedException, _M_MumbleServer._t_InvalidSessionException, _M_MumbleServer._t_InvalidSecretException)) + Server._op_setState = IcePy.Operation('setState', Ice.OperationMode.Idempotent, Ice.OperationMode.Idempotent, True, None, (), (((), _M_MumbleServer._t_User, False, 0),), (), None, (_M_MumbleServer._t_ServerBootedException, _M_MumbleServer._t_InvalidSessionException, _M_MumbleServer._t_InvalidChannelException, _M_MumbleServer._t_InvalidSecretException)) + Server._op_sendMessage = IcePy.Operation('sendMessage', Ice.OperationMode.Normal, Ice.OperationMode.Normal, True, None, (), (((), IcePy._t_int, False, 0), ((), IcePy._t_string, False, 0)), (), None, (_M_MumbleServer._t_ServerBootedException, _M_MumbleServer._t_InvalidSessionException, _M_MumbleServer._t_InvalidSecretException)) + Server._op_hasPermission = IcePy.Operation('hasPermission', Ice.OperationMode.Normal, Ice.OperationMode.Normal, True, None, (), (((), IcePy._t_int, False, 0), ((), IcePy._t_int, False, 0), ((), IcePy._t_int, False, 0)), (), ((), IcePy._t_bool, False, 0), (_M_MumbleServer._t_ServerBootedException, _M_MumbleServer._t_InvalidSessionException, _M_MumbleServer._t_InvalidChannelException, _M_MumbleServer._t_InvalidSecretException)) + Server._op_effectivePermissions = IcePy.Operation('effectivePermissions', Ice.OperationMode.Idempotent, Ice.OperationMode.Idempotent, True, None, (), (((), IcePy._t_int, False, 0), ((), IcePy._t_int, False, 0)), (), ((), IcePy._t_int, False, 0), (_M_MumbleServer._t_ServerBootedException, _M_MumbleServer._t_InvalidSessionException, _M_MumbleServer._t_InvalidChannelException, _M_MumbleServer._t_InvalidSecretException)) + Server._op_addContextCallback = IcePy.Operation('addContextCallback', Ice.OperationMode.Normal, Ice.OperationMode.Normal, True, None, (), (((), IcePy._t_int, False, 0), ((), IcePy._t_string, False, 0), ((), IcePy._t_string, False, 0), ((), _M_MumbleServer._t_ServerContextCallbackPrx, False, 0), ((), IcePy._t_int, False, 0)), (), None, (_M_MumbleServer._t_ServerBootedException, _M_MumbleServer._t_InvalidCallbackException, _M_MumbleServer._t_InvalidSecretException)) + Server._op_removeContextCallback = IcePy.Operation('removeContextCallback', Ice.OperationMode.Normal, Ice.OperationMode.Normal, True, None, (), (((), _M_MumbleServer._t_ServerContextCallbackPrx, False, 0),), (), None, (_M_MumbleServer._t_ServerBootedException, _M_MumbleServer._t_InvalidCallbackException, _M_MumbleServer._t_InvalidSecretException)) + Server._op_getChannelState = IcePy.Operation('getChannelState', Ice.OperationMode.Idempotent, Ice.OperationMode.Idempotent, True, None, (), (((), IcePy._t_int, False, 0),), (), ((), _M_MumbleServer._t_Channel, False, 0), (_M_MumbleServer._t_ServerBootedException, _M_MumbleServer._t_InvalidChannelException, _M_MumbleServer._t_InvalidSecretException)) + Server._op_setChannelState = IcePy.Operation('setChannelState', Ice.OperationMode.Idempotent, Ice.OperationMode.Idempotent, True, None, (), (((), _M_MumbleServer._t_Channel, False, 0),), (), None, (_M_MumbleServer._t_ServerBootedException, _M_MumbleServer._t_InvalidChannelException, _M_MumbleServer._t_InvalidSecretException, _M_MumbleServer._t_NestingLimitException)) + Server._op_removeChannel = IcePy.Operation('removeChannel', Ice.OperationMode.Normal, Ice.OperationMode.Normal, True, None, (), (((), IcePy._t_int, False, 0),), (), None, (_M_MumbleServer._t_ServerBootedException, _M_MumbleServer._t_InvalidChannelException, _M_MumbleServer._t_InvalidSecretException)) + Server._op_addChannel = IcePy.Operation('addChannel', Ice.OperationMode.Normal, Ice.OperationMode.Normal, True, None, (), (((), IcePy._t_string, False, 0), ((), IcePy._t_int, False, 0)), (), ((), IcePy._t_int, False, 0), (_M_MumbleServer._t_ServerBootedException, _M_MumbleServer._t_InvalidChannelException, _M_MumbleServer._t_InvalidSecretException, _M_MumbleServer._t_NestingLimitException)) + Server._op_sendMessageChannel = IcePy.Operation('sendMessageChannel', Ice.OperationMode.Normal, Ice.OperationMode.Normal, True, None, (), (((), IcePy._t_int, False, 0), ((), IcePy._t_bool, False, 0), ((), IcePy._t_string, False, 0)), (), None, (_M_MumbleServer._t_ServerBootedException, _M_MumbleServer._t_InvalidChannelException, _M_MumbleServer._t_InvalidSecretException)) + Server._op_getACL = IcePy.Operation('getACL', Ice.OperationMode.Idempotent, Ice.OperationMode.Idempotent, True, None, (), (((), IcePy._t_int, False, 0),), (((), _M_MumbleServer._t_ACLList, False, 0), ((), _M_MumbleServer._t_GroupList, False, 0), ((), IcePy._t_bool, False, 0)), None, (_M_MumbleServer._t_ServerBootedException, _M_MumbleServer._t_InvalidChannelException, _M_MumbleServer._t_InvalidSecretException)) + Server._op_setACL = IcePy.Operation('setACL', Ice.OperationMode.Idempotent, Ice.OperationMode.Idempotent, True, None, (), (((), IcePy._t_int, False, 0), ((), _M_MumbleServer._t_ACLList, False, 0), ((), _M_MumbleServer._t_GroupList, False, 0), ((), IcePy._t_bool, False, 0)), (), None, (_M_MumbleServer._t_ServerBootedException, _M_MumbleServer._t_InvalidChannelException, _M_MumbleServer._t_InvalidSecretException)) + Server._op_addUserToGroup = IcePy.Operation('addUserToGroup', Ice.OperationMode.Idempotent, Ice.OperationMode.Idempotent, True, None, (), (((), IcePy._t_int, False, 0), ((), IcePy._t_int, False, 0), ((), IcePy._t_string, False, 0)), (), None, (_M_MumbleServer._t_ServerBootedException, _M_MumbleServer._t_InvalidChannelException, _M_MumbleServer._t_InvalidSessionException, _M_MumbleServer._t_InvalidSecretException)) + Server._op_removeUserFromGroup = IcePy.Operation('removeUserFromGroup', Ice.OperationMode.Idempotent, Ice.OperationMode.Idempotent, True, None, (), (((), IcePy._t_int, False, 0), ((), IcePy._t_int, False, 0), ((), IcePy._t_string, False, 0)), (), None, (_M_MumbleServer._t_ServerBootedException, _M_MumbleServer._t_InvalidChannelException, _M_MumbleServer._t_InvalidSessionException, _M_MumbleServer._t_InvalidSecretException)) + Server._op_redirectWhisperGroup = IcePy.Operation('redirectWhisperGroup', Ice.OperationMode.Idempotent, Ice.OperationMode.Idempotent, True, None, (), (((), IcePy._t_int, False, 0), ((), IcePy._t_string, False, 0), ((), IcePy._t_string, False, 0)), (), None, (_M_MumbleServer._t_ServerBootedException, _M_MumbleServer._t_InvalidSessionException, _M_MumbleServer._t_InvalidSecretException)) + Server._op_getUserNames = IcePy.Operation('getUserNames', Ice.OperationMode.Idempotent, Ice.OperationMode.Idempotent, True, None, (), (((), _M_MumbleServer._t_IdList, False, 0),), (), ((), _M_MumbleServer._t_NameMap, False, 0), (_M_MumbleServer._t_ServerBootedException, _M_MumbleServer._t_InvalidSecretException)) + Server._op_getUserIds = IcePy.Operation('getUserIds', Ice.OperationMode.Idempotent, Ice.OperationMode.Idempotent, True, None, (), (((), _M_MumbleServer._t_NameList, False, 0),), (), ((), _M_MumbleServer._t_IdMap, False, 0), (_M_MumbleServer._t_ServerBootedException, _M_MumbleServer._t_InvalidSecretException)) + Server._op_registerUser = IcePy.Operation('registerUser', Ice.OperationMode.Normal, Ice.OperationMode.Normal, True, None, (), (((), _M_MumbleServer._t_UserInfoMap, False, 0),), (), ((), IcePy._t_int, False, 0), (_M_MumbleServer._t_ServerBootedException, _M_MumbleServer._t_InvalidUserException, _M_MumbleServer._t_InvalidSecretException)) + Server._op_unregisterUser = IcePy.Operation('unregisterUser', Ice.OperationMode.Normal, Ice.OperationMode.Normal, True, None, (), (((), IcePy._t_int, False, 0),), (), None, (_M_MumbleServer._t_ServerBootedException, _M_MumbleServer._t_InvalidUserException, _M_MumbleServer._t_InvalidSecretException)) + Server._op_updateRegistration = IcePy.Operation('updateRegistration', Ice.OperationMode.Idempotent, Ice.OperationMode.Idempotent, True, None, (), (((), IcePy._t_int, False, 0), ((), _M_MumbleServer._t_UserInfoMap, False, 0)), (), None, (_M_MumbleServer._t_ServerBootedException, _M_MumbleServer._t_InvalidUserException, _M_MumbleServer._t_InvalidSecretException)) + Server._op_getRegistration = IcePy.Operation('getRegistration', Ice.OperationMode.Idempotent, Ice.OperationMode.Idempotent, True, None, (), (((), IcePy._t_int, False, 0),), (), ((), _M_MumbleServer._t_UserInfoMap, False, 0), (_M_MumbleServer._t_ServerBootedException, _M_MumbleServer._t_InvalidUserException, _M_MumbleServer._t_InvalidSecretException)) + Server._op_getRegisteredUsers = IcePy.Operation('getRegisteredUsers', Ice.OperationMode.Idempotent, Ice.OperationMode.Idempotent, True, None, (), (((), IcePy._t_string, False, 0),), (), ((), _M_MumbleServer._t_NameMap, False, 0), (_M_MumbleServer._t_ServerBootedException, _M_MumbleServer._t_InvalidSecretException)) + Server._op_verifyPassword = IcePy.Operation('verifyPassword', Ice.OperationMode.Idempotent, Ice.OperationMode.Idempotent, True, None, (), (((), IcePy._t_string, False, 0), ((), IcePy._t_string, False, 0)), (), ((), IcePy._t_int, False, 0), (_M_MumbleServer._t_ServerBootedException, _M_MumbleServer._t_InvalidSecretException)) + Server._op_getTexture = IcePy.Operation('getTexture', Ice.OperationMode.Idempotent, Ice.OperationMode.Idempotent, True, None, (), (((), IcePy._t_int, False, 0),), (), ((), _M_MumbleServer._t_Texture, False, 0), (_M_MumbleServer._t_ServerBootedException, _M_MumbleServer._t_InvalidUserException, _M_MumbleServer._t_InvalidSecretException)) + Server._op_setTexture = IcePy.Operation('setTexture', Ice.OperationMode.Idempotent, Ice.OperationMode.Idempotent, True, None, (), (((), IcePy._t_int, False, 0), ((), _M_MumbleServer._t_Texture, False, 0)), (), None, (_M_MumbleServer._t_ServerBootedException, _M_MumbleServer._t_InvalidUserException, _M_MumbleServer._t_InvalidTextureException, _M_MumbleServer._t_InvalidSecretException)) + Server._op_getUptime = IcePy.Operation('getUptime', Ice.OperationMode.Idempotent, Ice.OperationMode.Idempotent, True, None, (), (), (), ((), IcePy._t_int, False, 0), (_M_MumbleServer._t_ServerBootedException, _M_MumbleServer._t_InvalidSecretException)) + Server._op_updateCertificate = IcePy.Operation('updateCertificate', Ice.OperationMode.Idempotent, Ice.OperationMode.Idempotent, True, None, (), (((), IcePy._t_string, False, 0), ((), IcePy._t_string, False, 0), ((), IcePy._t_string, False, 0)), (), None, (_M_MumbleServer._t_ServerBootedException, _M_MumbleServer._t_InvalidSecretException, _M_MumbleServer._t_InvalidInputDataException)) + Server._op_startListening = IcePy.Operation('startListening', Ice.OperationMode.Idempotent, Ice.OperationMode.Idempotent, True, None, (), (((), IcePy._t_int, False, 0), ((), IcePy._t_int, False, 0)), (), None, ()) + Server._op_stopListening = IcePy.Operation('stopListening', Ice.OperationMode.Idempotent, Ice.OperationMode.Idempotent, True, None, (), (((), IcePy._t_int, False, 0), ((), IcePy._t_int, False, 0)), (), None, ()) + Server._op_isListening = IcePy.Operation('isListening', Ice.OperationMode.Idempotent, Ice.OperationMode.Idempotent, True, None, (), (((), IcePy._t_int, False, 0), ((), IcePy._t_int, False, 0)), (), ((), IcePy._t_bool, False, 0), ()) + Server._op_getListeningChannels = IcePy.Operation('getListeningChannels', Ice.OperationMode.Idempotent, Ice.OperationMode.Idempotent, True, None, (), (((), IcePy._t_int, False, 0),), (), ((), _M_MumbleServer._t_IntList, False, 0), ()) + Server._op_getListeningUsers = IcePy.Operation('getListeningUsers', Ice.OperationMode.Idempotent, Ice.OperationMode.Idempotent, True, None, (), (((), IcePy._t_int, False, 0),), (), ((), _M_MumbleServer._t_IntList, False, 0), ()) + Server._op_getListenerVolumeAdjustment = IcePy.Operation('getListenerVolumeAdjustment', Ice.OperationMode.Idempotent, Ice.OperationMode.Idempotent, True, None, (), (((), IcePy._t_int, False, 0), ((), IcePy._t_int, False, 0)), (), ((), IcePy._t_float, False, 0), ()) + Server._op_setListenerVolumeAdjustment = IcePy.Operation('setListenerVolumeAdjustment', Ice.OperationMode.Idempotent, Ice.OperationMode.Idempotent, True, None, (), (((), IcePy._t_int, False, 0), ((), IcePy._t_int, False, 0), ((), IcePy._t_float, False, 0)), (), None, ()) + Server._op_sendWelcomeMessage = IcePy.Operation('sendWelcomeMessage', Ice.OperationMode.Idempotent, Ice.OperationMode.Idempotent, True, None, (), (((), _M_MumbleServer._t_IdList, False, 0),), (), None, ()) + + _M_MumbleServer.Server = Server + del Server + +_M_MumbleServer._t_MetaCallback = IcePy.defineValue('::MumbleServer::MetaCallback', Ice.Value, -1, (), False, True, None, ()) + +if 'MetaCallbackPrx' not in _M_MumbleServer.__dict__: + _M_MumbleServer.MetaCallbackPrx = Ice.createTempClass() + class MetaCallbackPrx(Ice.ObjectPrx): + + """ + Called when a server is started. The server is up and running when this event is sent, so all methods that + need a running server will work. + Arguments: + srv -- Interface for started server. + context -- The request context for the invocation. + """ + def started(self, srv, context=None): + return _M_MumbleServer.MetaCallback._op_started.invoke(self, ((srv, ), context)) + + """ + Called when a server is started. The server is up and running when this event is sent, so all methods that + need a running server will work. + Arguments: + srv -- Interface for started server. + context -- The request context for the invocation. + Returns: A future object for the invocation. + """ + def startedAsync(self, srv, context=None): + return _M_MumbleServer.MetaCallback._op_started.invokeAsync(self, ((srv, ), context)) + + """ + Called when a server is started. The server is up and running when this event is sent, so all methods that + need a running server will work. + Arguments: + srv -- Interface for started server. + _response -- The asynchronous response callback. + _ex -- The asynchronous exception callback. + _sent -- The asynchronous sent callback. + context -- The request context for the invocation. + Returns: An asynchronous result object for the invocation. + """ + def begin_started(self, srv, _response=None, _ex=None, _sent=None, context=None): + return _M_MumbleServer.MetaCallback._op_started.begin(self, ((srv, ), _response, _ex, _sent, context)) + + """ + Called when a server is started. The server is up and running when this event is sent, so all methods that + need a running server will work. + Arguments: + srv -- Interface for started server. + """ + def end_started(self, _r): + return _M_MumbleServer.MetaCallback._op_started.end(self, _r) + + """ + Called when a server is stopped. The server is already stopped when this event is sent, so no methods that + need a running server will work. + Arguments: + srv -- Interface for started server. + context -- The request context for the invocation. + """ + def stopped(self, srv, context=None): + return _M_MumbleServer.MetaCallback._op_stopped.invoke(self, ((srv, ), context)) + + """ + Called when a server is stopped. The server is already stopped when this event is sent, so no methods that + need a running server will work. + Arguments: + srv -- Interface for started server. + context -- The request context for the invocation. + Returns: A future object for the invocation. + """ + def stoppedAsync(self, srv, context=None): + return _M_MumbleServer.MetaCallback._op_stopped.invokeAsync(self, ((srv, ), context)) + + """ + Called when a server is stopped. The server is already stopped when this event is sent, so no methods that + need a running server will work. + Arguments: + srv -- Interface for started server. + _response -- The asynchronous response callback. + _ex -- The asynchronous exception callback. + _sent -- The asynchronous sent callback. + context -- The request context for the invocation. + Returns: An asynchronous result object for the invocation. + """ + def begin_stopped(self, srv, _response=None, _ex=None, _sent=None, context=None): + return _M_MumbleServer.MetaCallback._op_stopped.begin(self, ((srv, ), _response, _ex, _sent, context)) + + """ + Called when a server is stopped. The server is already stopped when this event is sent, so no methods that + need a running server will work. + Arguments: + srv -- Interface for started server. + """ + def end_stopped(self, _r): + return _M_MumbleServer.MetaCallback._op_stopped.end(self, _r) + + @staticmethod + def checkedCast(proxy, facetOrContext=None, context=None): + return _M_MumbleServer.MetaCallbackPrx.ice_checkedCast(proxy, '::MumbleServer::MetaCallback', facetOrContext, context) + + @staticmethod + def uncheckedCast(proxy, facet=None): + return _M_MumbleServer.MetaCallbackPrx.ice_uncheckedCast(proxy, facet) + + @staticmethod + def ice_staticId(): + return '::MumbleServer::MetaCallback' + _M_MumbleServer._t_MetaCallbackPrx = IcePy.defineProxy('::MumbleServer::MetaCallback', MetaCallbackPrx) + + _M_MumbleServer.MetaCallbackPrx = MetaCallbackPrx + del MetaCallbackPrx + + _M_MumbleServer.MetaCallback = Ice.createTempClass() + class MetaCallback(Ice.Object): + + def ice_ids(self, current=None): + return ('::Ice::Object', '::MumbleServer::MetaCallback') + + def ice_id(self, current=None): + return '::MumbleServer::MetaCallback' + + @staticmethod + def ice_staticId(): + return '::MumbleServer::MetaCallback' + + def started(self, srv, current=None): + """ + Called when a server is started. The server is up and running when this event is sent, so all methods that + need a running server will work. + Arguments: + srv -- Interface for started server. + current -- The Current object for the invocation. + Returns: A future object for the invocation. + """ + raise NotImplementedError("servant method 'started' not implemented") + + def stopped(self, srv, current=None): + """ + Called when a server is stopped. The server is already stopped when this event is sent, so no methods that + need a running server will work. + Arguments: + srv -- Interface for started server. + current -- The Current object for the invocation. + Returns: A future object for the invocation. + """ + raise NotImplementedError("servant method 'stopped' not implemented") + + def __str__(self): + return IcePy.stringify(self, _M_MumbleServer._t_MetaCallbackDisp) + + __repr__ = __str__ + + _M_MumbleServer._t_MetaCallbackDisp = IcePy.defineClass('::MumbleServer::MetaCallback', MetaCallback, (), None, ()) + MetaCallback._ice_type = _M_MumbleServer._t_MetaCallbackDisp + + MetaCallback._op_started = IcePy.Operation('started', Ice.OperationMode.Normal, Ice.OperationMode.Normal, False, None, (), (((), _M_MumbleServer._t_ServerPrx, False, 0),), (), None, ()) + MetaCallback._op_stopped = IcePy.Operation('stopped', Ice.OperationMode.Normal, Ice.OperationMode.Normal, False, None, (), (((), _M_MumbleServer._t_ServerPrx, False, 0),), (), None, ()) + + _M_MumbleServer.MetaCallback = MetaCallback + del MetaCallback + +if '_t_ServerList' not in _M_MumbleServer.__dict__: + _M_MumbleServer._t_ServerList = IcePy.defineSequence('::MumbleServer::ServerList', (), _M_MumbleServer._t_ServerPrx) + +_M_MumbleServer._t_Meta = IcePy.defineValue('::MumbleServer::Meta', Ice.Value, -1, (), False, True, None, ()) + +if 'MetaPrx' not in _M_MumbleServer.__dict__: + _M_MumbleServer.MetaPrx = Ice.createTempClass() + class MetaPrx(Ice.ObjectPrx): + + """ + Fetch interface to specific server. + Arguments: + id -- Server ID. See Server.getId. + context -- The request context for the invocation. + Returns: Interface for specified server, or a null proxy if id is invalid. + """ + def getServer(self, id, context=None): + return _M_MumbleServer.Meta._op_getServer.invoke(self, ((id, ), context)) + + """ + Fetch interface to specific server. + Arguments: + id -- Server ID. See Server.getId. + context -- The request context for the invocation. + Returns: A future object for the invocation. + """ + def getServerAsync(self, id, context=None): + return _M_MumbleServer.Meta._op_getServer.invokeAsync(self, ((id, ), context)) + + """ + Fetch interface to specific server. + Arguments: + id -- Server ID. See Server.getId. + _response -- The asynchronous response callback. + _ex -- The asynchronous exception callback. + _sent -- The asynchronous sent callback. + context -- The request context for the invocation. + Returns: An asynchronous result object for the invocation. + """ + def begin_getServer(self, id, _response=None, _ex=None, _sent=None, context=None): + return _M_MumbleServer.Meta._op_getServer.begin(self, ((id, ), _response, _ex, _sent, context)) + + """ + Fetch interface to specific server. + Arguments: + id -- Server ID. See Server.getId. + Returns: Interface for specified server, or a null proxy if id is invalid. + """ + def end_getServer(self, _r): + return _M_MumbleServer.Meta._op_getServer.end(self, _r) + + """ + Create a new server. Call Server.getId on the returned interface to find it's ID. + Arguments: + context -- The request context for the invocation. + Returns: Interface for new server. + """ + def newServer(self, context=None): + return _M_MumbleServer.Meta._op_newServer.invoke(self, ((), context)) + + """ + Create a new server. Call Server.getId on the returned interface to find it's ID. + Arguments: + context -- The request context for the invocation. + Returns: A future object for the invocation. + """ + def newServerAsync(self, context=None): + return _M_MumbleServer.Meta._op_newServer.invokeAsync(self, ((), context)) + + """ + Create a new server. Call Server.getId on the returned interface to find it's ID. + Arguments: + _response -- The asynchronous response callback. + _ex -- The asynchronous exception callback. + _sent -- The asynchronous sent callback. + context -- The request context for the invocation. + Returns: An asynchronous result object for the invocation. + """ + def begin_newServer(self, _response=None, _ex=None, _sent=None, context=None): + return _M_MumbleServer.Meta._op_newServer.begin(self, ((), _response, _ex, _sent, context)) + + """ + Create a new server. Call Server.getId on the returned interface to find it's ID. + Arguments: + Returns: Interface for new server. + """ + def end_newServer(self, _r): + return _M_MumbleServer.Meta._op_newServer.end(self, _r) + + """ + Fetch list of all currently running servers. + Arguments: + context -- The request context for the invocation. + Returns: List of interfaces for running servers. + """ + def getBootedServers(self, context=None): + return _M_MumbleServer.Meta._op_getBootedServers.invoke(self, ((), context)) + + """ + Fetch list of all currently running servers. + Arguments: + context -- The request context for the invocation. + Returns: A future object for the invocation. + """ + def getBootedServersAsync(self, context=None): + return _M_MumbleServer.Meta._op_getBootedServers.invokeAsync(self, ((), context)) + + """ + Fetch list of all currently running servers. + Arguments: + _response -- The asynchronous response callback. + _ex -- The asynchronous exception callback. + _sent -- The asynchronous sent callback. + context -- The request context for the invocation. + Returns: An asynchronous result object for the invocation. + """ + def begin_getBootedServers(self, _response=None, _ex=None, _sent=None, context=None): + return _M_MumbleServer.Meta._op_getBootedServers.begin(self, ((), _response, _ex, _sent, context)) + + """ + Fetch list of all currently running servers. + Arguments: + Returns: List of interfaces for running servers. + """ + def end_getBootedServers(self, _r): + return _M_MumbleServer.Meta._op_getBootedServers.end(self, _r) + + """ + Fetch list of all defined servers. + Arguments: + context -- The request context for the invocation. + Returns: List of interfaces for all servers. + """ + def getAllServers(self, context=None): + return _M_MumbleServer.Meta._op_getAllServers.invoke(self, ((), context)) + + """ + Fetch list of all defined servers. + Arguments: + context -- The request context for the invocation. + Returns: A future object for the invocation. + """ + def getAllServersAsync(self, context=None): + return _M_MumbleServer.Meta._op_getAllServers.invokeAsync(self, ((), context)) + + """ + Fetch list of all defined servers. + Arguments: + _response -- The asynchronous response callback. + _ex -- The asynchronous exception callback. + _sent -- The asynchronous sent callback. + context -- The request context for the invocation. + Returns: An asynchronous result object for the invocation. + """ + def begin_getAllServers(self, _response=None, _ex=None, _sent=None, context=None): + return _M_MumbleServer.Meta._op_getAllServers.begin(self, ((), _response, _ex, _sent, context)) + + """ + Fetch list of all defined servers. + Arguments: + Returns: List of interfaces for all servers. + """ + def end_getAllServers(self, _r): + return _M_MumbleServer.Meta._op_getAllServers.end(self, _r) + + """ + Fetch default configuration. This returns the configuration items that were set in the configuration file, or + the built-in default. The individual servers will use these values unless they have been overridden in the + server specific configuration. The only special case is the port, which defaults to the value defined here + + the servers ID - 1 (so that virtual server #1 uses the defined port, server #2 uses port+1 etc). + Arguments: + context -- The request context for the invocation. + Returns: Default configuration of the servers. + """ + def getDefaultConf(self, context=None): + return _M_MumbleServer.Meta._op_getDefaultConf.invoke(self, ((), context)) + + """ + Fetch default configuration. This returns the configuration items that were set in the configuration file, or + the built-in default. The individual servers will use these values unless they have been overridden in the + server specific configuration. The only special case is the port, which defaults to the value defined here + + the servers ID - 1 (so that virtual server #1 uses the defined port, server #2 uses port+1 etc). + Arguments: + context -- The request context for the invocation. + Returns: A future object for the invocation. + """ + def getDefaultConfAsync(self, context=None): + return _M_MumbleServer.Meta._op_getDefaultConf.invokeAsync(self, ((), context)) + + """ + Fetch default configuration. This returns the configuration items that were set in the configuration file, or + the built-in default. The individual servers will use these values unless they have been overridden in the + server specific configuration. The only special case is the port, which defaults to the value defined here + + the servers ID - 1 (so that virtual server #1 uses the defined port, server #2 uses port+1 etc). + Arguments: + _response -- The asynchronous response callback. + _ex -- The asynchronous exception callback. + _sent -- The asynchronous sent callback. + context -- The request context for the invocation. + Returns: An asynchronous result object for the invocation. + """ + def begin_getDefaultConf(self, _response=None, _ex=None, _sent=None, context=None): + return _M_MumbleServer.Meta._op_getDefaultConf.begin(self, ((), _response, _ex, _sent, context)) + + """ + Fetch default configuration. This returns the configuration items that were set in the configuration file, or + the built-in default. The individual servers will use these values unless they have been overridden in the + server specific configuration. The only special case is the port, which defaults to the value defined here + + the servers ID - 1 (so that virtual server #1 uses the defined port, server #2 uses port+1 etc). + Arguments: + Returns: Default configuration of the servers. + """ + def end_getDefaultConf(self, _r): + return _M_MumbleServer.Meta._op_getDefaultConf.end(self, _r) + + """ + Fetch version of Murmur. + Arguments: + context -- The request context for the invocation. + Returns a tuple containing the following: + major -- Major version. + minor -- Minor version. + patch -- Patchlevel. + text -- Textual representation of version. Note that this may not match the major, minor and patch levels, as it may be simply the compile date or the SVN revision. This is usually the text you want to present to users. + """ + def getVersion(self, context=None): + return _M_MumbleServer.Meta._op_getVersion.invoke(self, ((), context)) + + """ + Fetch version of Murmur. + Arguments: + context -- The request context for the invocation. + Returns: A future object for the invocation. + """ + def getVersionAsync(self, context=None): + return _M_MumbleServer.Meta._op_getVersion.invokeAsync(self, ((), context)) + + """ + Fetch version of Murmur. + Arguments: + _response -- The asynchronous response callback. + _ex -- The asynchronous exception callback. + _sent -- The asynchronous sent callback. + context -- The request context for the invocation. + Returns: An asynchronous result object for the invocation. + """ + def begin_getVersion(self, _response=None, _ex=None, _sent=None, context=None): + return _M_MumbleServer.Meta._op_getVersion.begin(self, ((), _response, _ex, _sent, context)) + + """ + Fetch version of Murmur. + Arguments: + Returns a tuple containing the following: + major -- Major version. + minor -- Minor version. + patch -- Patchlevel. + text -- Textual representation of version. Note that this may not match the major, minor and patch levels, as it may be simply the compile date or the SVN revision. This is usually the text you want to present to users. + """ + def end_getVersion(self, _r): + return _M_MumbleServer.Meta._op_getVersion.end(self, _r) + + """ + Add a callback. The callback will receive notifications when servers are started or stopped. + Arguments: + cb -- Callback interface which will receive notifications. + context -- The request context for the invocation. + """ + def addCallback(self, cb, context=None): + return _M_MumbleServer.Meta._op_addCallback.invoke(self, ((cb, ), context)) + + """ + Add a callback. The callback will receive notifications when servers are started or stopped. + Arguments: + cb -- Callback interface which will receive notifications. + context -- The request context for the invocation. + Returns: A future object for the invocation. + """ + def addCallbackAsync(self, cb, context=None): + return _M_MumbleServer.Meta._op_addCallback.invokeAsync(self, ((cb, ), context)) + + """ + Add a callback. The callback will receive notifications when servers are started or stopped. + Arguments: + cb -- Callback interface which will receive notifications. + _response -- The asynchronous response callback. + _ex -- The asynchronous exception callback. + _sent -- The asynchronous sent callback. + context -- The request context for the invocation. + Returns: An asynchronous result object for the invocation. + """ + def begin_addCallback(self, cb, _response=None, _ex=None, _sent=None, context=None): + return _M_MumbleServer.Meta._op_addCallback.begin(self, ((cb, ), _response, _ex, _sent, context)) + + """ + Add a callback. The callback will receive notifications when servers are started or stopped. + Arguments: + cb -- Callback interface which will receive notifications. + """ + def end_addCallback(self, _r): + return _M_MumbleServer.Meta._op_addCallback.end(self, _r) + + """ + Remove a callback. + Arguments: + cb -- Callback interface to be removed. + context -- The request context for the invocation. + """ + def removeCallback(self, cb, context=None): + return _M_MumbleServer.Meta._op_removeCallback.invoke(self, ((cb, ), context)) + + """ + Remove a callback. + Arguments: + cb -- Callback interface to be removed. + context -- The request context for the invocation. + Returns: A future object for the invocation. + """ + def removeCallbackAsync(self, cb, context=None): + return _M_MumbleServer.Meta._op_removeCallback.invokeAsync(self, ((cb, ), context)) + + """ + Remove a callback. + Arguments: + cb -- Callback interface to be removed. + _response -- The asynchronous response callback. + _ex -- The asynchronous exception callback. + _sent -- The asynchronous sent callback. + context -- The request context for the invocation. + Returns: An asynchronous result object for the invocation. + """ + def begin_removeCallback(self, cb, _response=None, _ex=None, _sent=None, context=None): + return _M_MumbleServer.Meta._op_removeCallback.begin(self, ((cb, ), _response, _ex, _sent, context)) + + """ + Remove a callback. + Arguments: + cb -- Callback interface to be removed. + """ + def end_removeCallback(self, _r): + return _M_MumbleServer.Meta._op_removeCallback.end(self, _r) + + """ + Get murmur uptime. + Arguments: + context -- The request context for the invocation. + Returns: Uptime of murmur in seconds + """ + def getUptime(self, context=None): + return _M_MumbleServer.Meta._op_getUptime.invoke(self, ((), context)) + + """ + Get murmur uptime. + Arguments: + context -- The request context for the invocation. + Returns: A future object for the invocation. + """ + def getUptimeAsync(self, context=None): + return _M_MumbleServer.Meta._op_getUptime.invokeAsync(self, ((), context)) + + """ + Get murmur uptime. + Arguments: + _response -- The asynchronous response callback. + _ex -- The asynchronous exception callback. + _sent -- The asynchronous sent callback. + context -- The request context for the invocation. + Returns: An asynchronous result object for the invocation. + """ + def begin_getUptime(self, _response=None, _ex=None, _sent=None, context=None): + return _M_MumbleServer.Meta._op_getUptime.begin(self, ((), _response, _ex, _sent, context)) + + """ + Get murmur uptime. + Arguments: + Returns: Uptime of murmur in seconds + """ + def end_getUptime(self, _r): + return _M_MumbleServer.Meta._op_getUptime.end(self, _r) + + """ + Get slice file. + Arguments: + context -- The request context for the invocation. + Returns: Contents of the slice file server compiled with. + """ + def getSlice(self, context=None): + return _M_MumbleServer.Meta._op_getSlice.invoke(self, ((), context)) + + """ + Get slice file. + Arguments: + context -- The request context for the invocation. + Returns: A future object for the invocation. + """ + def getSliceAsync(self, context=None): + return _M_MumbleServer.Meta._op_getSlice.invokeAsync(self, ((), context)) + + """ + Get slice file. + Arguments: + _response -- The asynchronous response callback. + _ex -- The asynchronous exception callback. + _sent -- The asynchronous sent callback. + context -- The request context for the invocation. + Returns: An asynchronous result object for the invocation. + """ + def begin_getSlice(self, _response=None, _ex=None, _sent=None, context=None): + return _M_MumbleServer.Meta._op_getSlice.begin(self, ((), _response, _ex, _sent, context)) + + """ + Get slice file. + Arguments: + Returns: Contents of the slice file server compiled with. + """ + def end_getSlice(self, _r): + return _M_MumbleServer.Meta._op_getSlice.end(self, _r) + + """ + Returns a checksum dict for the slice file. + Arguments: + context -- The request context for the invocation. + Returns: Checksum dict + """ + def getSliceChecksums(self, context=None): + return _M_MumbleServer.Meta._op_getSliceChecksums.invoke(self, ((), context)) + + """ + Returns a checksum dict for the slice file. + Arguments: + context -- The request context for the invocation. + Returns: A future object for the invocation. + """ + def getSliceChecksumsAsync(self, context=None): + return _M_MumbleServer.Meta._op_getSliceChecksums.invokeAsync(self, ((), context)) + + """ + Returns a checksum dict for the slice file. + Arguments: + _response -- The asynchronous response callback. + _ex -- The asynchronous exception callback. + _sent -- The asynchronous sent callback. + context -- The request context for the invocation. + Returns: An asynchronous result object for the invocation. + """ + def begin_getSliceChecksums(self, _response=None, _ex=None, _sent=None, context=None): + return _M_MumbleServer.Meta._op_getSliceChecksums.begin(self, ((), _response, _ex, _sent, context)) + + """ + Returns a checksum dict for the slice file. + Arguments: + Returns: Checksum dict + """ + def end_getSliceChecksums(self, _r): + return _M_MumbleServer.Meta._op_getSliceChecksums.end(self, _r) + + @staticmethod + def checkedCast(proxy, facetOrContext=None, context=None): + return _M_MumbleServer.MetaPrx.ice_checkedCast(proxy, '::MumbleServer::Meta', facetOrContext, context) + + @staticmethod + def uncheckedCast(proxy, facet=None): + return _M_MumbleServer.MetaPrx.ice_uncheckedCast(proxy, facet) + + @staticmethod + def ice_staticId(): + return '::MumbleServer::Meta' + _M_MumbleServer._t_MetaPrx = IcePy.defineProxy('::MumbleServer::Meta', MetaPrx) + + _M_MumbleServer.MetaPrx = MetaPrx + del MetaPrx + + _M_MumbleServer.Meta = Ice.createTempClass() + class Meta(Ice.Object): + + def ice_ids(self, current=None): + return ('::Ice::Object', '::MumbleServer::Meta') + + def ice_id(self, current=None): + return '::MumbleServer::Meta' + + @staticmethod + def ice_staticId(): + return '::MumbleServer::Meta' + + def getServer(self, id, current=None): + """ + Fetch interface to specific server. + Arguments: + id -- Server ID. See Server.getId. + current -- The Current object for the invocation. + Returns: A future object for the invocation. + """ + raise NotImplementedError("servant method 'getServer' not implemented") + + def newServer(self, current=None): + """ + Create a new server. Call Server.getId on the returned interface to find it's ID. + Arguments: + current -- The Current object for the invocation. + Returns: A future object for the invocation. + """ + raise NotImplementedError("servant method 'newServer' not implemented") + + def getBootedServers(self, current=None): + """ + Fetch list of all currently running servers. + Arguments: + current -- The Current object for the invocation. + Returns: A future object for the invocation. + """ + raise NotImplementedError("servant method 'getBootedServers' not implemented") + + def getAllServers(self, current=None): + """ + Fetch list of all defined servers. + Arguments: + current -- The Current object for the invocation. + Returns: A future object for the invocation. + """ + raise NotImplementedError("servant method 'getAllServers' not implemented") + + def getDefaultConf(self, current=None): + """ + Fetch default configuration. This returns the configuration items that were set in the configuration file, or + the built-in default. The individual servers will use these values unless they have been overridden in the + server specific configuration. The only special case is the port, which defaults to the value defined here + + the servers ID - 1 (so that virtual server #1 uses the defined port, server #2 uses port+1 etc). + Arguments: + current -- The Current object for the invocation. + Returns: A future object for the invocation. + """ + raise NotImplementedError("servant method 'getDefaultConf' not implemented") + + def getVersion(self, current=None): + """ + Fetch version of Murmur. + Arguments: + current -- The Current object for the invocation. + Returns: A future object for the invocation. + """ + raise NotImplementedError("servant method 'getVersion' not implemented") + + def addCallback(self, cb, current=None): + """ + Add a callback. The callback will receive notifications when servers are started or stopped. + Arguments: + cb -- Callback interface which will receive notifications. + current -- The Current object for the invocation. + Returns: A future object for the invocation. + """ + raise NotImplementedError("servant method 'addCallback' not implemented") + + def removeCallback(self, cb, current=None): + """ + Remove a callback. + Arguments: + cb -- Callback interface to be removed. + current -- The Current object for the invocation. + Returns: A future object for the invocation. + """ + raise NotImplementedError("servant method 'removeCallback' not implemented") + + def getUptime(self, current=None): + """ + Get murmur uptime. + Arguments: + current -- The Current object for the invocation. + Returns: A future object for the invocation. + """ + raise NotImplementedError("servant method 'getUptime' not implemented") + + def getSlice(self, current=None): + """ + Get slice file. + Arguments: + current -- The Current object for the invocation. + Returns: A future object for the invocation. + """ + raise NotImplementedError("servant method 'getSlice' not implemented") + + def getSliceChecksums(self, current=None): + """ + Returns a checksum dict for the slice file. + Arguments: + current -- The Current object for the invocation. + Returns: A future object for the invocation. + """ + raise NotImplementedError("servant method 'getSliceChecksums' not implemented") + + def __str__(self): + return IcePy.stringify(self, _M_MumbleServer._t_MetaDisp) + + __repr__ = __str__ + + _M_MumbleServer._t_MetaDisp = IcePy.defineClass('::MumbleServer::Meta', Meta, (), None, ()) + Meta._ice_type = _M_MumbleServer._t_MetaDisp + + Meta._op_getServer = IcePy.Operation('getServer', Ice.OperationMode.Idempotent, Ice.OperationMode.Idempotent, True, None, (), (((), IcePy._t_int, False, 0),), (), ((), _M_MumbleServer._t_ServerPrx, False, 0), (_M_MumbleServer._t_InvalidSecretException,)) + Meta._op_newServer = IcePy.Operation('newServer', Ice.OperationMode.Normal, Ice.OperationMode.Normal, True, None, (), (), (), ((), _M_MumbleServer._t_ServerPrx, False, 0), (_M_MumbleServer._t_InvalidSecretException,)) + Meta._op_getBootedServers = IcePy.Operation('getBootedServers', Ice.OperationMode.Idempotent, Ice.OperationMode.Idempotent, True, None, (), (), (), ((), _M_MumbleServer._t_ServerList, False, 0), (_M_MumbleServer._t_InvalidSecretException,)) + Meta._op_getAllServers = IcePy.Operation('getAllServers', Ice.OperationMode.Idempotent, Ice.OperationMode.Idempotent, True, None, (), (), (), ((), _M_MumbleServer._t_ServerList, False, 0), (_M_MumbleServer._t_InvalidSecretException,)) + Meta._op_getDefaultConf = IcePy.Operation('getDefaultConf', Ice.OperationMode.Idempotent, Ice.OperationMode.Idempotent, True, None, (), (), (), ((), _M_MumbleServer._t_ConfigMap, False, 0), (_M_MumbleServer._t_InvalidSecretException,)) + Meta._op_getVersion = IcePy.Operation('getVersion', Ice.OperationMode.Idempotent, Ice.OperationMode.Idempotent, True, None, (), (), (((), IcePy._t_int, False, 0), ((), IcePy._t_int, False, 0), ((), IcePy._t_int, False, 0), ((), IcePy._t_string, False, 0)), None, ()) + Meta._op_addCallback = IcePy.Operation('addCallback', Ice.OperationMode.Normal, Ice.OperationMode.Normal, True, None, (), (((), _M_MumbleServer._t_MetaCallbackPrx, False, 0),), (), None, (_M_MumbleServer._t_InvalidCallbackException, _M_MumbleServer._t_InvalidSecretException)) + Meta._op_removeCallback = IcePy.Operation('removeCallback', Ice.OperationMode.Normal, Ice.OperationMode.Normal, True, None, (), (((), _M_MumbleServer._t_MetaCallbackPrx, False, 0),), (), None, (_M_MumbleServer._t_InvalidCallbackException, _M_MumbleServer._t_InvalidSecretException)) + Meta._op_getUptime = IcePy.Operation('getUptime', Ice.OperationMode.Idempotent, Ice.OperationMode.Idempotent, True, None, (), (), (), ((), IcePy._t_int, False, 0), ()) + Meta._op_getSlice = IcePy.Operation('getSlice', Ice.OperationMode.Idempotent, Ice.OperationMode.Idempotent, True, None, (), (), (), ((), IcePy._t_string, False, 0), ()) + Meta._op_getSliceChecksums = IcePy.Operation('getSliceChecksums', Ice.OperationMode.Idempotent, Ice.OperationMode.Idempotent, True, None, (), (), (), ((), _M_Ice._t_SliceChecksumDict, False, 0), ()) + + _M_MumbleServer.Meta = Meta + del Meta + +# End of module MumbleServer diff --git a/__pycache__/Mumble_pb2.cpython-312.pyc b/__pycache__/Mumble_pb2.cpython-312.pyc deleted file mode 100644 index aec03443f33d8e75b3631e6c9bc42702bfade1ed..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10448 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 RM7sKwCWT_>tTN)|{{a;PH+cX6 diff --git a/audioKiller.py b/audioKiller.py new file mode 100644 index 0000000..910a611 --- /dev/null +++ b/audioKiller.py @@ -0,0 +1,40 @@ +import struct +REMEMBER_ME = "<4sI4s4sIHHIIHH4sI" +def read_wav_header(filename): + with open(filename, "r+b") as f: + # Standard PCM WAV header is typically 44 bytes + f.seek(0) + f.write(b"RIFF") + header = f.read(44) + + # Unpack the header according to the RIFF/WAV format + # < : little-endian + # 4s : 4-byte string + # I : unsigned 32-bit integer + # H : unsigned 16-bit integer + fields = struct.unpack("<4sI4s4sIHHIIHH4sI", header) + + wav_info = { + "chunk_id": fields[0].decode(), # RIFF + "chunk_size": fields[1], # File size - 8 + "format": fields[2].decode(), # WAVE + "subchunk1_id": fields[3].decode(), # fmt + "subchunk1_size": fields[4], # Usually 16 for PCM + "audio_format": fields[5], # 1 = PCM + "num_channels": fields[6], # 1 = mono, 2 = stereo + "sample_rate": fields[7], # e.g. 48000 + "byte_rate": fields[8], # sample_rate * channels * bits/8 + "block_align": fields[9], # channels * bits/8 + "bits_per_sample":fields[10], # 16, 24, 32 + "subchunk2_id": fields[11].decode(), # data + "subchunk2_size": fields[12], # Number of bytes of PCM data + } + + return wav_info + + +# Example usage +info = read_wav_header("sample-speech-5m.wav") + +for key, value in info.items(): + print(f"{key}: {value}") \ No newline at end of file diff --git a/mumble_server_config.py b/mumble_server_config.py new file mode 100644 index 0000000..2b0ccec --- /dev/null +++ b/mumble_server_config.py @@ -0,0 +1,230 @@ + +# NOTE: + + +import base64 +import io +import shlex +from datetime import datetime + +import paramiko +import yaml + +# Servers to update +SERVERS = [ + "172.16.10.123", + "172.16.10.110", + "172.16.10.107", +] + +# SSH configuration +USERNAME = "cezen" +PASSWORD = "17lamborghini" +REMOTE_YAML = "/home/cezen/Desktop/mumble-server/docker-compose.yml" +BACKUP_YAML = REMOTE_YAML + ".bak" +VERSION_DIR = "/home/cezen/Desktop/mumble-server/config_versions" +VERSION_KEEP_LIMIT = 10 +VERSION_FILE_PREFIX = "docker-compose" + +# Service whose environment section will be edited +SERVICE_NAME = "mumble" + + +def run_sudo_command(ssh, command): + full_command = f"echo '{PASSWORD}' | sudo -S {command}" + stdin, stdout, stderr = ssh.exec_command(full_command) + exit_code = stdout.channel.recv_exit_status() + + if exit_code != 0: + raise RuntimeError(stderr.read().decode("utf-8")) + + return stdout.read().decode("utf-8") if stdout.readable() else "" + + +def read_remote_file(ssh, path): + return run_sudo_command(ssh, f'cat "{path}"') + + +def write_remote_file(ssh, path, content): + # Encode content to base64 to avoid all shell quoting/escaping issues + encoded = base64.b64encode(content.encode("utf-8")).decode("ascii") + run_sudo_command(ssh, f"bash -c 'echo {encoded} | base64 -d > \"{path}\"'") + + +def ensure_version_dir(ssh): + run_sudo_command(ssh, f"mkdir -p {shlex.quote(VERSION_DIR)}") + + +def write_config_version(ssh, timestamp, content): + ensure_version_dir(ssh) + version_path = f"{VERSION_DIR}/{VERSION_FILE_PREFIX}_{timestamp}.yml" + write_remote_file(ssh, version_path, content) + prune_config_versions(ssh) + return version_path + + +def prune_config_versions(ssh): + keep_from = VERSION_KEEP_LIMIT + 1 + cleanup_script = ( + f"cd {shlex.quote(VERSION_DIR)} 2>/dev/null || exit 0\n" + f"ls -1t {VERSION_FILE_PREFIX}_*.yml 2>/dev/null " + f"| tail -n +{keep_from} " + "| xargs -r rm --" + ) + run_sudo_command(ssh, f"bash -c {shlex.quote(cleanup_script)}") + + +def backup_remote_file(ssh): + run_sudo_command(ssh, f'cp "{REMOTE_YAML}" "{BACKUP_YAML}"') + + +def parse_environment(env_list): + """ + Converts: + ["KEY1=value1", "KEY2=value2"] + To: + [("KEY1", "value1"), ("KEY2", "value2")] + """ + result = [] + for item in env_list: + if isinstance(item, str) and "=" in item: + key, value = item.split("=", 1) + result.append((key, value)) + return result + + +def format_environment(pairs): + """ + Converts: + [("KEY1", "value1"), ("KEY2", "value2")] + To: + ["KEY1=value1", "KEY2=value2"] + """ + return [f"{key}={value}" for key, value in pairs] + + +def load_environment_from_server(host, password): + print(f"Connecting to {host}...") + + ssh = paramiko.SSHClient() + ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) + + try: + ssh.connect(hostname=host, username=USERNAME, password=password, timeout=10) + + content = read_remote_file(ssh, REMOTE_YAML) + data = yaml.safe_load(content) + + env_list = data["services"][SERVICE_NAME].get("environment", []) + env_pairs = parse_environment(env_list) + + return ssh, data, env_pairs, content + + except Exception: + ssh.close() + raise + + +def save_environment_to_server(ssh, data, env_pairs): + data["services"][SERVICE_NAME]["environment"] = format_environment(env_pairs) + + # Create backup first + backup_remote_file(ssh) + + # Serialize YAML + output = io.StringIO() + yaml.dump(data, output, default_flow_style=False, sort_keys=False) + + # Write updated file + write_remote_file(ssh, REMOTE_YAML, output.getvalue()) + + +def save_versions_after_success(previous_configs, timestamp): + version_results = {} + + for host, content in previous_configs.items(): + try: + ssh = paramiko.SSHClient() + ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) + ssh.connect(hostname=host, username=USERNAME, password=PASSWORD, timeout=10) + try: + version_results[host] = write_config_version(ssh, timestamp, content) + finally: + ssh.close() + except Exception as e: + version_results[host] = str(e) + + return version_results + + +def edit_environment(env_pairs, json_data): + print(env_pairs,"ewejnwejnwejwej") + updated = [] + for key, value in env_pairs: + new_value = json_data.get(key, "") + if new_value == "": + updated.append((key, value)) # keep original + else: + updated.append((key, new_value)) + return updated + + +def run(json_data, servers=None): + target_servers = list(servers or SERVERS) + if not target_servers: + return { + "status": "error", + "message": "Select at least one VM to update.", + "results": {}, + } + + first_host = target_servers[0] + + try: + ssh, data, env_pairs, _ = load_environment_from_server(first_host, PASSWORD) + ssh.close() + except Exception as e: + return {"status": "error", "message": f"Failed to connect to {first_host}: {str(e)}"} + + updated_env = edit_environment(env_pairs, json_data) + + results = {} + previous_configs = {} + for host in target_servers: + try: + ssh, server_data, _, previous_content = load_environment_from_server(host, PASSWORD) + try: + save_environment_to_server(ssh, server_data, updated_env) + results[host] = "success" + previous_configs[host] = previous_content + finally: + ssh.close() + except Exception as e: + results[host] = str(e) + + if any(result != "success" for result in results.values()): + return { + "status": "error", + "message": "Config was not saved successfully to all selected VMs. No version files were created.", + "results": results, + } + + timestamp = datetime.now().strftime("%Y-%m-%d_%H-%M-%S") + version_results = save_versions_after_success(previous_configs, timestamp) + + if any( + not str(result).startswith(f"{VERSION_DIR}/") + for result in version_results.values() + ): + return { + "status": "error", + "message": "Config was saved to all selected VMs, but one or more version files could not be created.", + "results": results, + "version_results": version_results, + } + + return { + "status": "success", + "results": results, + "version_results": version_results, + } diff --git a/rec.py b/rec.py index e0d7e53..5a59de2 100644 --- a/rec.py +++ b/rec.py @@ -1,11 +1,11 @@ import alsaaudio import socket - +import opuslib # Network UDP_PORT = 5005 sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) sock.bind(("0.0.0.0", UDP_PORT)) - +decoder = opuslib.Decoder(48000, 1) # Audio RATE = 48000 CHANNELS = 1 @@ -30,7 +30,8 @@ try: while True: try: data, addr = sock.recvfrom(4096) - out.write(data) # play the 960 samples + pcm_data = decoder.decode(data, 960) + out.write(pcm_data) # play the 960 samples except socket.timeout: out.write(SILENCE) # packet lost → play silence diff --git a/sniffer.py b/sniffer.py index f77b720..419da71 100644 --- a/sniffer.py +++ b/sniffer.py @@ -4,9 +4,15 @@ import struct import Mumble_pb2 import threading import time +import opuslib +import alsaaudio +from cryptography.hazmat.primitives.ciphers.aead import AESOCB3 SERVER_IP = "172.16.11.170" SERVER_PORT = 64738 + +# KEY = None +# SERVER_NONCE = None # create raw TCP socket sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) @@ -85,6 +91,90 @@ ping_thread.daemon = True # dies when main program exits ping_thread.start() +decoder = opuslib.Decoder(48000, 1) + +CHUNKSIZE = 960 +out = alsaaudio.PCM( + alsaaudio.PCM_PLAYBACK, + alsaaudio.PCM_NORMAL, + channels=1, + rate=48000, + format=alsaaudio.PCM_FORMAT_S16_LE, + periodsize=CHUNKSIZE, + device='default' +) +SILENCE = b'\x00' * (CHUNKSIZE * 2) + + +def decrypt_udp(data): + if KEY is None or SERVER_NONCE is None: + print("No keys yet!") + return None + if len(data) < 4: + return None + nonce = bytes(SERVER_NONCE[0:15]) + bytes([data[0]]) + encrypted = data[4:] + try: + plaintext = AESOCB3(KEY).decrypt(nonce, encrypted, None) + return plaintext + except: + return None + +def parse_opus(plaintext): + if not plaintext: + return None + header = plaintext[0] + pkt_type = (header >> 5) & 0x7 + if pkt_type != 4: + return None + + offset = 1 + # skip sequence varint + while plaintext[offset] & 0x80: + offset += 1 + offset += 1 + + # parse opus length varint + opus_len = 0 + shift = 0 + while True: + byte = plaintext[offset] + opus_len |= (byte & 0x7F) << shift + offset += 1 + shift += 7 + if not (byte & 0x80): + break + + return plaintext[offset:offset + opus_len] + +# UDP listener thread +def udp_listener(): + udp_sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) + udp_sock.bind(("172.16.11.170", 64738)) # bind to any available port + udp_sock.settimeout(0.05) + + print("UDP listener started...") + while True: + try: + data, addr = udp_sock.recvfrom(1024) + if addr[0] != SERVER_IP: + continue + + plaintext = decrypt_udp(data) + opus_data = parse_opus(plaintext) + + if opus_data: + pcm = decoder.decode(opus_data, CHUNKSIZE) + out.write(pcm) + print(f"Playing audio | Opus: {len(opus_data)}B → PCM: {len(pcm)}B") + except socket.timeout: + print(KEY,SERVER_NONCE,"SWS") + out.write(SILENCE) + +udp_thread = threading.Thread(target=udp_listener) +udp_thread.daemon = True +udp_thread.start() + while True: msg_type, data = recv_message(tls) if msg_type is None: @@ -112,8 +202,13 @@ while True: print(" FULLY CONNECTED TO MUMBLE! ✅") elif msg_type == 15: # CryptSetup — encryption keys! + global KEY, SERVER_NONCE + KEY = None + SERVER_NONCE = None c = Mumble_pb2.CryptSetup() c.ParseFromString(data) + KEY = bytes(c.key) + SERVER_NONCE = bytearray(c.server_nonce) print(f" KEY: {c.key.hex()}") print(f" CLIENT_NONCE: {c.client_nonce.hex()}") print(f" SERVER_NONCE: {c.server_nonce.hex()}") \ No newline at end of file diff --git a/test.py b/test.py new file mode 100644 index 0000000..95b6cce --- /dev/null +++ b/test.py @@ -0,0 +1,94 @@ +import sys +import Ice +import MumbleServer +import re + +HOST = "172.16.10.3" # VM IP +INTERNAL = "172.19.0.2" # container IP + +def fix_proxy(prx, communicator): + s = communicator.proxyToString(prx) + # Match any IP address pattern after "-h " and replace it + s = re.sub(r'-h (\d{1,3}\.){3}\d{1,3}', f'-h {HOST}', s) + return communicator.stringToProxy(s) + +def main(): + with Ice.initialize(sys.argv) as communicator: + base = communicator.stringToProxy(f"Meta:tcp -h {HOST} -p 6502 -t 60000") + meta = MumbleServer.MetaPrx.checkedCast(base) + + assert meta is not None + + context = {"secret": "password"} + + # We just assume the server we want to modify has ID 1 + server = meta.getServer(1, context) + print("Server:", server) + + server = MumbleServer.ServerPrx.uncheckedCast(fix_proxy(server, communicator)) + print("Running:", server) + assert server is not None + users = server.getUsers(context) + + # Python 3 uses .items(), not .iteritems() + for session_id, user in users.items(): + print(session_id, user.name) + + # Not providing the context with the correct password would make this + # request fail with an InvalidSecretException + server.setSuperuserPassword("Strong password", context) + + +if __name__ == "__main__": + main() + + + +# import Ice +# import MumbleServer + +# HOST = "172.16.10.123" # external VM IP +# PORT = 6502 +# ICE_SECRET = "password" +# SERVER_ID = 1 +# INTERNAL = "172.19.0.2" # container IP to replace + +# props = Ice.createProperties() +# props.setProperty("Ice.ImplicitContext", "Shared") + +# init = Ice.InitializationData() +# init.properties = props + +# def fix_proxy(prx, communicator): +# """Replace internal container IP with external VM IP in proxy string.""" +# s = communicator.proxyToString(prx) +# s = s.replace(INTERNAL, HOST) +# return communicator.stringToProxy(s) + +# with Ice.initialize(initData=init) as communicator: +# communicator.getImplicitContext().put("secret", ICE_SECRET) + +# proxy = communicator.stringToProxy(f"Meta:tcp -h {HOST} -p {PORT} -t 10000") +# meta = MumbleServer.MetaPrx.uncheckedCast(proxy) + +# try: +# version = meta.getVersion() +# print("Connected! Version:", version) + +# # Fix the server proxy endpoint before using it +# raw_server = meta.getServer(SERVER_ID) +# fixed = fix_proxy(raw_server, communicator) +# server = MumbleServer.ServerPrx.uncheckedCast(fixed) + +# print("Running:", server.isRunning()) + +# for cid, ch in server.getChannels().items(): +# print(f" [{cid}] {ch.name}") + +# users = server.getUsers() +# print("Online users:", len(users)) +# for sid, u in users.items(): +# print(f" [{sid}] {u.name}") + +# except Exception as e: +# print("Error:", type(e).__name__, e) \ No newline at end of file