Moving more towards a serverquery look.

This commit is contained in:
Manevolent
2018-07-30 16:32:50 -04:00
parent f533e2e918
commit e93b0dee6f
115 changed files with 6282 additions and 1604 deletions
@@ -0,0 +1,85 @@
package com.github.manevolent.ts3j.api;
/*
* #%L
* TeamSpeak 3 Java API
* %%
* Copyright (C) 2014 Bert De Geyter
* %%
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
* #L%
*/
import java.util.Date;
import java.util.Map;
public class Ban extends Wrapper {
public Ban(Map<String, String> map) {
super(map);
}
public int getId() {
return getInt("banid");
}
public String getBannedIp() {
return get("ip");
}
public String getBannedName() {
return get("name");
}
public String getBannedUId() {
return get("uid");
}
public String getLastNickname() {
return get("lastnickname");
}
public Date getCreatedDate() {
return new Date(getLong("created") * 1000);
}
public long getDuration() {
return getLong("duration");
}
public String getInvokerName() {
return get("invokername");
}
public int getInvokerClientDBId() {
return getInt("invokercldbid");
}
public String getInvokerUId() {
return get("invokeruid");
}
public String getReason() {
return get("reason");
}
public int getEnforcements() {
return getInt("enforcements");
}
}
@@ -0,0 +1,41 @@
package com.github.manevolent.ts3j.api;
/*
* #%L
* TeamSpeak 3 Java API
* %%
* Copyright (C) 2014 Bert De Geyter
* %%
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
* #L%
*/
import java.util.Map;
public class Binding extends Wrapper {
public Binding(Map<String, String> map) {
super(map);
}
public String getIp() {
return get("ip");
}
}
@@ -0,0 +1,65 @@
package com.github.manevolent.ts3j.api;
/*
* #%L
* TeamSpeak 3 Java API
* %%
* Copyright (C) 2014 Bert De Geyter
* %%
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
* #L%
*/
import java.util.Map;
public class Channel extends ChannelBase {
public Channel(Map<String, String> map) {
super(map);
}
@Override
public int getId() {
return getInt(ChannelProperty.CID);
}
public int getTotalClientsFamily() {
return getInt("total_clients_family");
}
public int getTotalClients() {
return getInt("total_clients");
}
public int getNeededSubscribePower() {
return getInt(ChannelProperty.CHANNEL_NEEDED_SUBSCRIBE_POWER);
}
/**
* @return {@code true}, if the channel is empty, {@code false} otherwise.
*/
public boolean isEmpty() {
return (getTotalClients() == 0);
}
@Override
public boolean isFamilyEmpty() {
return (getTotalClientsFamily() == 0);
}
}
@@ -0,0 +1,109 @@
package com.github.manevolent.ts3j.api;
/*
* #%L
* TeamSpeak 3 Java API
* %%
* Copyright (C) 2014 - 2015 Bert De Geyter, Roger Baumgartner
* %%
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
* #L%
*/
import java.util.Map;
public abstract class ChannelBase extends Wrapper {
protected ChannelBase(Map<String, String> map) {
super(map);
}
public abstract int getId();
public int getParentChannelId() {
return getInt(ChannelProperty.PID);
}
public int getOrder() {
return getInt(ChannelProperty.CHANNEL_ORDER);
}
public String getName() {
return get(ChannelProperty.CHANNEL_NAME);
}
public String getTopic() {
return get(ChannelProperty.CHANNEL_TOPIC);
}
public boolean isDefault() {
return getBoolean(ChannelProperty.CHANNEL_FLAG_DEFAULT);
}
public boolean hasPassword() {
return getBoolean(ChannelProperty.CHANNEL_FLAG_PASSWORD);
}
public boolean isPermanent() {
return getBoolean(ChannelProperty.CHANNEL_FLAG_PERMANENT);
}
public boolean isSemiPermanent() {
return getBoolean(ChannelProperty.CHANNEL_FLAG_SEMI_PERMANENT);
}
public Codec getCodec() {
final int codec = getInt(ChannelProperty.CHANNEL_CODEC);
for (final Codec c : Codec.values()) {
if (c.getIndex() == codec) {
return c;
}
}
return Codec.UNKNOWN;
}
public int getCodecQuality() {
return getInt(ChannelProperty.CHANNEL_CODEC_QUALITY);
}
public int getNeededTalkPower() {
return getInt(ChannelProperty.CHANNEL_NEEDED_TALK_POWER);
}
public long getIconId() {
return getLong(ChannelProperty.CHANNEL_ICON_ID);
}
public int getMaxClients() {
return getInt(ChannelProperty.CHANNEL_MAXCLIENTS);
}
public int getMaxFamilyClients() {
return getInt(ChannelProperty.CHANNEL_MAXFAMILYCLIENTS);
}
public int getSecondsEmpty() {
return getInt(ChannelProperty.SECONDS_EMPTY);
}
/**
* @return {@code true}, if the channel and all child channels are empty, {@code false} otherwise.
*/
abstract public boolean isFamilyEmpty();
}
@@ -0,0 +1,83 @@
package com.github.manevolent.ts3j.api;
/*
* #%L
* TeamSpeak 3 Java API
* %%
* Copyright (C) 2014 Bert De Geyter
* %%
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
* #L%
*/
import java.util.Map;
public class ChannelGroup extends Wrapper {
public ChannelGroup(Map<String, String> map) {
super(map);
}
public int getId() {
return getInt("cgid");
}
public String getName() {
return get("name");
}
public PermissionGroupDatabaseType getType() {
final int type = getInt("type");
for (final PermissionGroupDatabaseType t : PermissionGroupDatabaseType.values()) {
if (t.getIndex() == type) {
return t;
}
}
return null;
}
public long getIconId() {
return getLong("iconid");
}
public boolean isSavedInDatabase() {
return getBoolean("savedb");
}
public int getSortId() {
return getInt("sortid");
}
public int getNameMode() {
return getInt("namemode");
}
public int getModifyPower() {
return getInt("n_modifyp");
}
public int getMemberAddPower() {
return getInt("n_member_addp");
}
public int getMemberRemovePower() {
return getInt("n_member_removep");
}
}
@@ -0,0 +1,49 @@
package com.github.manevolent.ts3j.api;
/*
* #%L
* TeamSpeak 3 Java API
* %%
* Copyright (C) 2014 Bert De Geyter
* %%
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
* #L%
*/
import java.util.Map;
public class ChannelGroupClient extends Wrapper {
public ChannelGroupClient(Map<String, String> map) {
super(map);
}
public int getChannelId() {
return getInt("cid");
}
public int getClientDatabaseId() {
return getInt("cldbid");
}
public int getChannelGroupId() {
return getInt("cgid");
}
}
@@ -0,0 +1,89 @@
package com.github.manevolent.ts3j.api;
/*
* #%L
* TeamSpeak 3 Java API
* %%
* Copyright (C) 2014 Bert De Geyter
* %%
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
* #L%
*/
import java.util.Map;
public class ChannelInfo extends ChannelBase {
private final int channelId;
public ChannelInfo(int channelId, Map<String, String> map) {
super(map);
this.channelId = channelId;
}
@Override
public int getId() {
return channelId;
}
public String getDescription() {
return get(ChannelProperty.CHANNEL_DESCRIPTION);
}
public String getPassword() {
return get(ChannelProperty.CHANNEL_PASSWORD);
}
public int getCodecLatencyFactor() {
return getInt(ChannelProperty.CHANNEL_CODEC_LATENCY_FACTOR);
}
public boolean isEncrypted() {
return !getBoolean(ChannelProperty.CHANNEL_CODEC_IS_UNENCRYPTED);
}
public boolean hasUnlimitedClients() {
return getBoolean(ChannelProperty.CHANNEL_FLAG_MAXCLIENTS_UNLIMITED);
}
public boolean hasUnlimitedFamilyClients() {
return getBoolean(ChannelProperty.CHANNEL_FLAG_MAXFAMILYCLIENTS_UNLIMITED);
}
public boolean hasInheritedMaxFamilyClients() {
return getBoolean(ChannelProperty.CHANNEL_FLAG_MAXFAMILYCLIENTS_INHERITED);
}
public String getFilePath() {
return get(ChannelProperty.CHANNEL_FILEPATH);
}
public boolean isForcedSilence() {
return getBoolean(ChannelProperty.CHANNEL_FORCED_SILENCE);
}
public String getPhoneticName() {
return get(ChannelProperty.CHANNEL_NAME_PHONETIC);
}
@Override
public boolean isFamilyEmpty() {
return (getSecondsEmpty() >= 0);
}
}
@@ -0,0 +1,79 @@
package com.github.manevolent.ts3j.api;
/*
* #%L
* TeamSpeak 3 Java API
* %%
* Copyright (C) 2014 Bert De Geyter
* %%
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
* #L%
*/
import java.util.Locale;
public enum ChannelProperty implements Property {
CHANNEL_CODEC(true),
CHANNEL_CODEC_IS_UNENCRYPTED(true),
CHANNEL_CODEC_LATENCY_FACTOR(false),
CHANNEL_CODEC_QUALITY(true),
CHANNEL_DELETE_DELAY(true),
CHANNEL_DESCRIPTION(true),
CHANNEL_FILEPATH(false),
CHANNEL_FLAG_DEFAULT(true),
CHANNEL_FLAG_MAXCLIENTS_UNLIMITED(true),
CHANNEL_FLAG_MAXFAMILYCLIENTS_INHERITED(true),
CHANNEL_FLAG_MAXFAMILYCLIENTS_UNLIMITED(true),
CHANNEL_FLAG_PASSWORD(false),
CHANNEL_FLAG_PERMANENT(true),
CHANNEL_FLAG_SEMI_PERMANENT(true),
CHANNEL_FLAG_TEMPORARY(true),
CHANNEL_FORCED_SILENCE(false),
CHANNEL_ICON_ID(true),
CHANNEL_MAXCLIENTS(true),
CHANNEL_MAXFAMILYCLIENTS(true),
CHANNEL_NAME(true),
CHANNEL_NAME_PHONETIC(true),
CHANNEL_NEEDED_SUBSCRIBE_POWER(false),
CHANNEL_NEEDED_TALK_POWER(true),
CHANNEL_ORDER(true),
CHANNEL_PASSWORD(true),
CHANNEL_TOPIC(true),
SECONDS_EMPTY(false),
CID(false),
PID(false),
CPID(true);
private final boolean changeable;
ChannelProperty(boolean changeable) {
this.changeable = changeable;
}
@Override
public String getName() {
return name().toLowerCase(Locale.ROOT);
}
@Override
public boolean isChangeable() {
return changeable;
}
}
@@ -0,0 +1,243 @@
package com.github.manevolent.ts3j.api;
/*
* #%L
* TeamSpeak 3 Java API
* %%
* Copyright (C) 2014 Bert De Geyter
* %%
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
* #L%
*/
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.util.Date;
import java.util.Map;
public class Client extends Wrapper {
public Client(Map<String, String> map) {
super(map);
}
public boolean canTalk() {
return getBoolean(ClientProperty.CLIENT_IS_TALKER);
}
public String getAwayMessage() {
return get(ClientProperty.CLIENT_AWAY_MESSAGE);
}
public String[] getBadgeGUIDs() {
String raw = get(ClientProperty.CLIENT_BADGES);
String[] properties = raw.split("[\\s:;]");
for (String property : properties) {
if (!property.startsWith("badges=")) continue;
String commaSepBadges = property.substring("badges=".length());
return commaSepBadges.split(",");
}
return new String[0];
}
public int getChannelGroupId() {
return getInt(ClientProperty.CLIENT_CHANNEL_GROUP_ID);
}
public int getChannelId() {
return getInt(ClientProperty.CID);
}
/**
* Utility method. This method will return a client URI.
* A client URI can be used to reference a client in descriptions or just via chat.
* Example: {@code client://<clientId>/<clientUId>~<clientNickname>}
*
* @return Client's URI
*/
public String getClientURI() {
StringBuilder sb = new StringBuilder();
sb.append("client://").append(getId()).append('/');
sb.append(getUniqueIdentifier()).append('~');
try {
// We will encode the nickname, so characters like spaces work with this.
sb.append(URLEncoder.encode(getNickname(), "UTF-8"));
} catch (UnsupportedEncodingException e) {
throw new IllegalStateException("JVM doesn't support UTF-8", e);
}
return sb.toString();
}
public String getCountry() {
return get(ClientProperty.CLIENT_COUNTRY);
}
public Date getCreatedDate() {
return new Date(getLong(ClientProperty.CLIENT_CREATED) * 1000);
}
public int getDatabaseId() {
return getInt(ClientProperty.CLIENT_DATABASE_ID);
}
public long getIconId() {
return getLong(ClientProperty.CLIENT_ICON_ID);
}
public int getId() {
return getInt("clid");
}
public long getIdleTime() {
return getLong(ClientProperty.CLIENT_IDLE_TIME);
}
public int getInheritedChannelGroupId() {
return getInt(ClientProperty.CLIENT_CHANNEL_GROUP_INHERITED_CHANNEL_ID);
}
public String getIp() {
return get(ClientProperty.CONNECTION_CLIENT_IP);
}
public Date getLastConnectedDate() {
return new Date(getLong(ClientProperty.CLIENT_LASTCONNECTED) * 1000);
}
public String getNickname() {
return get(ClientProperty.CLIENT_NICKNAME);
}
public String getPlatform() {
return get(ClientProperty.CLIENT_PLATFORM);
}
public int[] getServerGroups() {
final String str = get(ClientProperty.CLIENT_SERVERGROUPS);
final String[] arr = str.split(",");
final int[] groups = new int[arr.length];
for (int i = 0; i < groups.length; i++) {
groups[i] = Integer.parseInt(arr[i]);
}
return groups;
}
public int getTalkPower() {
return getInt(ClientProperty.CLIENT_TALK_POWER);
}
public int getType() {
return getInt(ClientProperty.CLIENT_TYPE);
}
public String getUniqueIdentifier() {
return get(ClientProperty.CLIENT_UNIQUE_IDENTIFIER);
}
public String getVersion() {
return get(ClientProperty.CLIENT_VERSION);
}
public boolean hasOverwolf() {
String raw = get(ClientProperty.CLIENT_BADGES);
String[] properties = raw.split("[\\s:;]");
for (String property : properties) {
if (!(property.startsWith("overwolf=") || property.startsWith("Overwolf="))) continue;
String overwolfValue = property.substring("overwolf=".length());
return overwolfValue.equals("1");
}
return false;
}
public boolean isAway() {
return getBoolean(ClientProperty.CLIENT_AWAY);
}
public boolean isChannelCommander() {
return getBoolean(ClientProperty.CLIENT_IS_CHANNEL_COMMANDER);
}
/**
* Utility method that does a linear search on the array of server group IDs returned
* by {@link #getServerGroups()} and returns {@code true} if that array contains
* the given server group ID.
*
* @param serverGroupId
* the ID of the server group to search for
*
* @return whether this client is a member of the given server group
*/
public boolean isInServerGroup(int serverGroupId) {
int[] serverGroupIds = getServerGroups();
for (int s : serverGroupIds) {
if (s == serverGroupId) return true;
}
return false;
}
/**
* Utility method that does a linear search on the array of server group IDs returned
* by {@link #getServerGroups()} and returns {@code true} if that array contains
* the ID of the given server group.
*
* @param serverGroup
* the server group to search for
*
* @return whether this client is a member of the given server group
*/
public boolean isInServerGroup(ServerGroup serverGroup) {
return isInServerGroup(serverGroup.getId());
}
public boolean isInputHardware() {
return getBoolean(ClientProperty.CLIENT_INPUT_HARDWARE);
}
public boolean isInputMuted() {
return getBoolean(ClientProperty.CLIENT_INPUT_MUTED);
}
public boolean isOutputHardware() {
return getBoolean(ClientProperty.CLIENT_OUTPUT_HARDWARE);
}
public boolean isOutputMuted() {
return getBoolean(ClientProperty.CLIENT_OUTPUT_MUTED);
}
public boolean isPrioritySpeaker() {
return getBoolean(ClientProperty.CLIENT_IS_PRIORITY_SPEAKER);
}
public boolean isRecording() {
return getBoolean(ClientProperty.CLIENT_IS_RECORDING);
}
public boolean isRegularClient() {
return getType() == 0;
}
public boolean isServerQueryClient() {
return getType() == 1;
}
public boolean isTalking() {
return getBoolean(ClientProperty.CLIENT_FLAG_TALKING);
}
}
@@ -0,0 +1,167 @@
package com.github.manevolent.ts3j.api;
/*
* #%L
* TeamSpeak 3 Java API
* %%
* Copyright (C) 2014 Bert De Geyter
* %%
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
* #L%
*/
import java.util.Map;
public class ClientInfo extends Client {
private final int clientId;
public ClientInfo(int clientId, Map<String, String> map) {
super(map);
this.clientId = clientId;
}
@Override
public int getId() {
return clientId;
}
public String getAvatar() {
return get(ClientProperty.CLIENT_FLAG_AVATAR);
}
public long getBandwidthReceivedLastMinute() {
return getLong(ClientProperty.CONNECTION_BANDWIDTH_RECEIVED_LAST_MINUTE_TOTAL);
}
public long getBandwidthReceivedLastSecond() {
return getLong(ClientProperty.CONNECTION_BANDWIDTH_RECEIVED_LAST_SECOND_TOTAL);
}
public long getBandwidthSentlastMinute() {
return getLong(ClientProperty.CONNECTION_BANDWIDTH_SENT_LAST_MINUTE_TOTAL);
}
public long getBandwidthSentLastSecond() {
return getLong(ClientProperty.CONNECTION_BANDWIDTH_SENT_LAST_SECOND_TOTAL);
}
public String getBase64ClientUId() {
return get("client_base64HashClientUID");
}
public int getDefaultChannel() {
// TeamSpeak decided to prefix the channel ID with a forward slash (/)...
final String channelId = get(ClientProperty.CLIENT_DEFAULT_CHANNEL);
if (channelId.isEmpty()) return -1;
return Integer.parseInt(channelId.substring(1));
}
public String getDefaultToken() {
return get(ClientProperty.CLIENT_DEFAULT_TOKEN);
}
public String getDescription() {
return get(ClientProperty.CLIENT_DESCRIPTION);
}
public long getFiletransferBandwidthReceived() {
return getLong(ClientProperty.CONNECTION_FILETRANSFER_BANDWIDTH_RECEIVED);
}
public long getFiletransferBandwidthSent() {
return getLong(ClientProperty.CONNECTION_FILETRANSFER_BANDWIDTH_SENT);
}
public String getLoginName() {
return get(ClientProperty.CLIENT_LOGIN_NAME);
}
public String getMetaData() {
return get(ClientProperty.CLIENT_META_DATA);
}
public long getMonthlyBytesDownloaded() {
return getLong(ClientProperty.CLIENT_MONTH_BYTES_DOWNLOADED);
}
public long getMonthlyBytesUploaded() {
return getLong(ClientProperty.CLIENT_MONTH_BYTES_UPLOADED);
}
public int getNeededServerQueryViewPower() {
return getInt(ClientProperty.CLIENT_NEEDED_SERVERQUERY_VIEW_POWER);
}
public String getPhoneticNickname() {
return get(ClientProperty.CLIENT_NICKNAME_PHONETIC);
}
public String getTalkRequestMessage() {
return get(ClientProperty.CLIENT_TALK_REQUEST_MSG);
}
public long getTimeConnected() { // milliseconds
return getLong(ClientProperty.CONNECTION_CONNECTED_TIME);
}
public long getTotalBytesDownloaded() {
return getLong(ClientProperty.CLIENT_TOTAL_BYTES_DOWNLOADED);
}
public long getTotalBytesReceived() {
return getLong(ClientProperty.CONNECTION_BYTES_RECEIVED_TOTAL);
}
public long getTotalBytesSent() {
return getLong(ClientProperty.CONNECTION_BYTES_SENT_TOTAL);
}
public long getTotalBytesUploaded() {
return getLong(ClientProperty.CLIENT_TOTAL_BYTES_UPLOADED);
}
public int getTotalConnections() {
return getInt(ClientProperty.CLIENT_TOTALCONNECTIONS);
}
public long getTotalPacketsReceived() {
return getLong(ClientProperty.CONNECTION_PACKETS_RECEIVED_TOTAL);
}
public long getTotalPacketsSent() {
return getLong(ClientProperty.CONNECTION_PACKETS_SENT_TOTAL);
}
public int getUnreadMessages() {
return getInt(ClientProperty.CLIENT_UNREAD_MESSAGES);
}
public boolean isOutputOnlyMuted() {
return getBoolean(ClientProperty.CLIENT_OUTPUTONLY_MUTED);
}
public boolean isRequestingToTalk() {
return getBoolean(ClientProperty.CLIENT_TALK_REQUEST);
}
@Override
public boolean isTalking() {
throw new UnsupportedOperationException();
}
}
@@ -0,0 +1,116 @@
package com.github.manevolent.ts3j.api;
/*
* #%L
* TeamSpeak 3 Java API
* %%
* Copyright (C) 2014 Bert De Geyter
* %%
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
* #L%
*/
import java.util.Locale;
import java.util.Map;
public enum ClientProperty implements Property {
CID(false),
CLIENT_AWAY(false),
CLIENT_AWAY_MESSAGE(false),
/**
* Property for the Overwolf badge and any myTeamSpeak badges.
* Can be changed only for the own client by using {@link TS3Api#updateClient(Map)}.
* <p>
* String format: {@code overwolf=n:badges=guid,guid,guid(,guid...)}<br>
* where {@code n} is 0 or 1 and {@code guid} is 128-bit badge GUIDs
* </p>
*/
CLIENT_BADGES(true),
CLIENT_BASE64HASHCLIENTUID(false),
CLIENT_CHANNEL_GROUP_ID(false),
CLIENT_CHANNEL_GROUP_INHERITED_CHANNEL_ID(false),
CLIENT_COUNTRY(false),
CLIENT_CREATED(false),
CLIENT_DATABASE_ID(false),
CLIENT_DEFAULT_CHANNEL(false),
CLIENT_DEFAULT_TOKEN(false),
CLIENT_DESCRIPTION(true),
CLIENT_FLAG_AVATAR(false),
CLIENT_FLAG_TALKING(false),
CLIENT_ICON_ID(true),
CLIENT_IDLE_TIME(false),
CLIENT_INPUT_HARDWARE(false),
CLIENT_INPUT_MUTED(false),
CLIENT_IS_CHANNEL_COMMANDER(true),
CLIENT_IS_PRIORITY_SPEAKER(false),
CLIENT_IS_RECORDING(false),
CLIENT_IS_TALKER(true),
CLIENT_LASTCONNECTED(false),
CLIENT_LOGIN_NAME(false),
CLIENT_META_DATA(false),
CLIENT_MONTH_BYTES_DOWNLOADED(false),
CLIENT_MONTH_BYTES_UPLOADED(false),
CLIENT_NEEDED_SERVERQUERY_VIEW_POWER(false),
CLIENT_NICKNAME(true),
CLIENT_NICKNAME_PHONETIC(false),
CLIENT_OUTPUT_HARDWARE(false),
CLIENT_OUTPUT_MUTED(false),
CLIENT_OUTPUTONLY_MUTED(false),
CLIENT_PLATFORM(false),
CLIENT_SERVERGROUPS(false),
CLIENT_TALK_POWER(false),
CLIENT_TALK_REQUEST(false),
CLIENT_TALK_REQUEST_MSG(false),
CLIENT_TOTAL_BYTES_DOWNLOADED(false),
CLIENT_TOTAL_BYTES_UPLOADED(false),
CLIENT_TOTALCONNECTIONS(false),
CLIENT_TYPE(false),
CLIENT_UNIQUE_IDENTIFIER(false),
CLIENT_UNREAD_MESSAGES(false),
CLIENT_VERSION(false),
CONNECTION_BANDWIDTH_RECEIVED_LAST_MINUTE_TOTAL(false),
CONNECTION_BANDWIDTH_RECEIVED_LAST_SECOND_TOTAL(false),
CONNECTION_BANDWIDTH_SENT_LAST_MINUTE_TOTAL(false),
CONNECTION_BANDWIDTH_SENT_LAST_SECOND_TOTAL(false),
CONNECTION_BYTES_RECEIVED_TOTAL(false),
CONNECTION_BYTES_SENT_TOTAL(false),
CONNECTION_CLIENT_IP(false),
CONNECTION_CONNECTED_TIME(false),
CONNECTION_FILETRANSFER_BANDWIDTH_RECEIVED(false),
CONNECTION_FILETRANSFER_BANDWIDTH_SENT(false),
CONNECTION_PACKETS_RECEIVED_TOTAL(false),
CONNECTION_PACKETS_SENT_TOTAL(false);
private final boolean changeable;
ClientProperty(boolean changeable) {
this.changeable = changeable;
}
@Override
public String getName() {
return name().toLowerCase(Locale.ROOT);
}
@Override
public boolean isChangeable() {
return changeable;
}
}
@@ -0,0 +1,130 @@
package com.github.manevolent.ts3j.api;
/*
* #%L
* TeamSpeak 3 Java API
* %%
* Copyright (C) 2014 Bert De Geyter
* %%
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
* #L%
*/
import java.util.Map;
/**
* Voice codecs currently used by TeamSpeak3.
* <p>
* A channel's codec may be edited by using {@link TS3Api#editChannel(int, Map)}.
* All voice data may also be encrypted.
* </p>
*/
public enum Codec {
/**
* The Speex narrowband codec with a sampling rate of 8kHz.
* <p>
* All Speex codecs are basically obsolete as Opus is better
* in every aspect and has a comparable required bandwidth.
* </p><ul>
* <li>Bandwidth per client with codec quality 0: 2.49 KiB/s</li>
* <li>Bandwidth per client with codec quality 10: 5.22 KiB/s</li>
* </ul>
*/
SPEEX_NARROWBAND(0),
/**
* The Speex wideband codec with a sampling rate of 16kHz.
* <p>
* All Speex codecs are basically obsolete as Opus is better
* in every aspect and has a comparable required bandwidth.
* </p><ul>
* <li>Bandwidth per client with codec quality 0: 2.69 KiB/s</li>
* <li>Bandwidth per client with codec quality 10: 7.37 KiB/s</li>
* </ul>
*/
SPEEX_WIDEBAND(1),
/**
* The Speex ultra-wideband codec with a sampling rate of 32kHz.
* <p>
* All Speex codecs are basically obsolete as Opus is better
* in every aspect and has a comparable required bandwidth.
* </p><ul>
* <li>Bandwidth per client with codec quality 0: 2.73 KiB/s</li>
* <li>Bandwidth per client with codec quality 10: 7.57 KiB/s</li>
* </ul>
*/
SPEEX_ULTRAWIDEBAND(2),
/**
* The CELT Mono codec. It is optimised for music but still generates very good
* results in voice transmission.
* <p>
* Note that this codec requires the most bandwidth of all currently available codecs.
* </p><ul>
* <li>Bandwidth per client with codec quality 0: 6.10 KiB/s</li>
* <li>Bandwidth per client with codec quality 10: 13.92 KiB/s</li>
* </ul>
*/
CELT_MONO(3),
/**
* The Opus codec optimised for voice transmission.
* <p>
* This is the default codec used by TeamSpeak and usually achieves the
* best results for voice transmission.
* </p><ul>
* <li>Bandwidth per client with codec quality 0: 2.73 KiB/s</li>
* <li>Bandwidth per client with codec quality 10: 7.71 KiB/s</li>
* </ul>
*/
OPUS_VOICE(4),
/**
* The Opus codec optimised for music transmission.
* <p>
* Please note that if used only to transmit speech, this codec can
* sound worse than Opus Voice despite a higher bandwidth.
* </p><ul>
* <li>Bandwidth per client with codec quality 0: 3.08 KiB/s</li>
* <li>Bandwidth per client with codec quality 10: 11.87 KiB/s</li>
* </ul>
*/
OPUS_MUSIC(5),
/**
* An unknown codec.
* <p>
* If you ever encounter an unknown codec, please tell us!
* We may have to update the API.
* </p>
*/
UNKNOWN(-1);
private final int i;
Codec(int i) {
this.i = i;
}
public int getIndex() {
return i;
}
}
@@ -0,0 +1,74 @@
package com.github.manevolent.ts3j.api;
/*
* #%L
* TeamSpeak 3 Java API
* %%
* Copyright (C) 2014 Bert De Geyter
* %%
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
* #L%
*/
import java.util.Map;
/**
* Describes how the virtual server manages audio encryption.
* <p>
* Can be edited with {@link TS3Api#editServer(Map)}.
* </p>
*/
public enum CodecEncryptionMode {
/**
* Each channel manages audio encryption on its own.
*
* @see TS3Api#editChannel(int, Map)
*/
CODEC_CRYPT_INDIVIDUAL(0),
/**
* Audio encryption is globally disabled on this virtual server.
*/
CODEC_CRYPT_DISABLED(1),
/**
* Audio encryption is globally enabled on this virtual server.
*/
CODEC_CRYPT_ENABLED(2),
/**
* An unknown codec encryption mode.
* <p>
* If you ever encounter an unknown mode, please tell us!
* We may have to update the API.
* </p>
*/
UNKNOWN(-1);
private final int i;
CodecEncryptionMode(int i) {
this.i = i;
}
public int getIndex() {
return i;
}
}
@@ -0,0 +1,62 @@
package com.github.manevolent.ts3j.api;
/*
* #%L
* TeamSpeak 3 Java API
* %%
* Copyright (C) 2014 Bert De Geyter
* %%
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
* #L%
*/
import java.util.Date;
import java.util.Map;
public class Complaint extends Wrapper {
public Complaint(Map<String, String> map) {
super(map);
}
public int getTargetClientDatabaseId() {
return getInt("tcldbid");
}
public String getTargetName() {
return get("tname");
}
public int getSourceClientDatabaseId() {
return getInt("fcldbid");
}
public String getSourceName() {
return get("fname");
}
public String getMessage() {
return get("message");
}
public Date getTimestamp() {
return new Date(getLong("timestamp") * 1000);
}
}
@@ -0,0 +1,97 @@
package com.github.manevolent.ts3j.api;
/*
* #%L
* TeamSpeak 3 Java API
* %%
* Copyright (C) 2014 Bert De Geyter
* %%
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
* #L%
*/
import java.util.Map;
public class ConnectionInfo extends Wrapper {
public ConnectionInfo(Map<String, String> map) {
super(map);
}
public long getFiletransferBandwidthSent() {
return getLong(VirtualServerProperty.CONNECTION_FILETRANSFER_BANDWIDTH_SENT);
}
public long getFiletransferBandwidthReceived() {
return getLong(VirtualServerProperty.CONNECTION_FILETRANSFER_BANDWIDTH_RECEIVED);
}
public long getFiletransferBytesSent() {
return getLong(VirtualServerProperty.CONNECTION_FILETRANSFER_BYTES_SENT_TOTAL);
}
public long getFiletransferBytesReceived() {
return getLong(VirtualServerProperty.CONNECTION_FILETRANSFER_BYTES_RECEIVED_TOTAL);
}
public long getTotalPacketsSent() {
return getLong(VirtualServerProperty.CONNECTION_PACKETS_SENT_TOTAL);
}
public long getTotalBytesSent() {
return getLong(VirtualServerProperty.CONNECTION_BYTES_SENT_TOTAL);
}
public long getTotalPacketsReceived() {
return getLong(VirtualServerProperty.CONNECTION_PACKETS_RECEIVED_TOTAL);
}
public long getTotalBytesReceived() {
return getLong(VirtualServerProperty.CONNECTION_BYTES_RECEIVED_TOTAL);
}
public long getBandwidthSentLastSecond() {
return getLong(VirtualServerProperty.CONNECTION_BANDWIDTH_SENT_LAST_SECOND_TOTAL);
}
public long getBandwidthSentLastMinute() {
return getLong(VirtualServerProperty.CONNECTION_BANDWIDTH_SENT_LAST_MINUTE_TOTAL);
}
public long getBandwidthReceivedLastSecond() {
return getLong(VirtualServerProperty.CONNECTION_BANDWIDTH_RECEIVED_LAST_SECOND_TOTAL);
}
public long getBandwidthReceivedLastMinute() {
return getLong(VirtualServerProperty.CONNECTION_BANDWIDTH_RECEIVED_LAST_MINUTE_TOTAL);
}
public long getConnectedTime() {
return getLong("connection_connected_time");
}
public double getPacketLoss() {
return getDouble("connection_packetloss_total");
}
public double getPing() {
return getDouble("connection_ping");
}
}
@@ -0,0 +1,48 @@
package com.github.manevolent.ts3j.api;
/*
* #%L
* TeamSpeak 3 Java API
* %%
* Copyright (C) 2014 Bert De Geyter
* %%
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
* #L%
*/
import java.util.Map;
public class CreatedVirtualServer extends Wrapper {
public CreatedVirtualServer(Map<String, String> map) {
super(map);
}
public int getId() {
return getInt("sid");
}
public int getPort() {
return getInt("virtualserver_port");
}
public String getServerAdminToken() {
return get("token");
}
}
@@ -0,0 +1,69 @@
package com.github.manevolent.ts3j.api;
/*
* #%L
* TeamSpeak 3 Java API
* %%
* Copyright (C) 2014 Bert De Geyter
* %%
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
* #L%
*/
import java.util.Date;
import java.util.Map;
public class DatabaseClient extends Wrapper {
public DatabaseClient(Map<String, String> map) {
super(map);
}
public int getDatabaseId() {
return getInt("cldbid");
}
public String getUniqueIdentifier() {
return get(ClientProperty.CLIENT_UNIQUE_IDENTIFIER);
}
public String getNickname() {
return get(ClientProperty.CLIENT_NICKNAME);
}
public Date getCreatedDate() {
return new Date(getLong(ClientProperty.CLIENT_CREATED) * 1000);
}
public Date getLastConnectedDate() {
return new Date(getLong(ClientProperty.CLIENT_LASTCONNECTED) * 1000);
}
public int getTotalConnections() {
return getInt(ClientProperty.CLIENT_TOTALCONNECTIONS);
}
public String getDescription() {
return get(ClientProperty.CLIENT_DESCRIPTION);
}
public String getLastIp() {
return get("client_lastip");
}
}
@@ -0,0 +1,69 @@
package com.github.manevolent.ts3j.api;
/*
* #%L
* TeamSpeak 3 Java API
* %%
* Copyright (C) 2014 Bert De Geyter
* %%
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
* #L%
*/
import java.util.Map;
public class DatabaseClientInfo extends DatabaseClient {
public DatabaseClientInfo(Map<String, String> map) {
super(map);
}
@Override
public int getDatabaseId() {
return getInt(ClientProperty.CLIENT_DATABASE_ID);
}
public String getAvatar() {
return get(ClientProperty.CLIENT_FLAG_AVATAR);
}
public long getMonthlyBytesUploaded() {
return getLong(ClientProperty.CLIENT_MONTH_BYTES_UPLOADED);
}
public long getMonthlyBytesDownloaded() {
return getLong(ClientProperty.CLIENT_MONTH_BYTES_DOWNLOADED);
}
public long getTotalBytesUploaded() {
return getLong(ClientProperty.CLIENT_TOTAL_BYTES_UPLOADED);
}
public long getTotalBytesDownloaded() {
return getLong(ClientProperty.CLIENT_TOTAL_BYTES_DOWNLOADED);
}
public long getIconId() {
return getLong(ClientProperty.CLIENT_ICON_ID);
}
public String getBase64HashClientUID() {
return get("client_base64HashClientUID");
}
}
@@ -0,0 +1,134 @@
package com.github.manevolent.ts3j.api;
/*
* #%L
* TeamSpeak 3 Java API
* %%
* Copyright (C) 2016 Bert De Geyter, Roger Baumgartner
* %%
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
* #L%
*/
import java.util.Date;
import java.util.Map;
public class FileInfo extends Wrapper {
public FileInfo(Map<String, String> map) {
super(map);
}
/**
* Gets the ID of the channel this file is stored on.
*
* @return the ID of the file's channel
*/
public int getChannelId() {
return getInt("cid");
}
/**
* Gets the path to this file or directory, including its name.
* This path can be used in other file transfer commands.
*
* @return the path to the file or directory
*/
public String getPath() {
return get("name");
}
/**
* Gets the name of this file or directory.
*
* @return the name of this file or directory
*/
public String getName() {
String fullPath = getPath();
int slashPos = fullPath.lastIndexOf('/');
if (slashPos < 0) return fullPath;
return fullPath.substring(slashPos + 1);
}
/**
* Gets the path of the directory containing this file or directory.
*
* @return the path to the parent directory
*
* @see #getPath()
*/
public String getParentPath() {
String fullPath = getPath();
int slashPos = fullPath.lastIndexOf('/');
if (slashPos < 0) return "/";
return fullPath.substring(0, slashPos + 1);
}
/**
* Gets the size of the file in bytes.
* Note that this can return wrong values if the file is still being uploaded
* or if the upload has been paused by the uploading client.
*
* @return the file's size
*/
public long getFileSize() {
return getLong("size");
}
/**
* Gets the date of the last modification to this file.
* The date has a one-second resolution.
*
* @return the file's last modification date
*/
public Date getLastModifiedDate() {
return new Date(getLong("datetime") * 1000);
}
/**
* Gets whether this entry is a directory or a file.
* {@code 0} stands for a directory, {@code 1} for a file.
* <p>
* Consider using {@link #isFile} and {@link #isDirectory} instead.
* </p>
*
* @return the type of this file entry
*/
public int getType() {
return 1;
}
/**
* Returns {@code true} if this entry is a file and not a directory.
*
* @return whether this is a file
*/
public boolean isFile() {
return true;
}
/**
* Returns {@code true} if this entry is a directory and not a file.
*
* @return whether this is a directory
*/
public boolean isDirectory() {
return false;
}
}
@@ -0,0 +1,94 @@
package com.github.manevolent.ts3j.api;
/*
* #%L
* TeamSpeak 3 Java API
* %%
* Copyright (C) 2016 Bert De Geyter, Roger Baumgartner
* %%
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
* #L%
*/
import java.util.Map;
public class FileListEntry extends FileInfo {
public FileListEntry(Map<String, String> map) {
super(map);
}
@Override
public String getPath() {
return getParentPath() + getName();
}
@Override
public String getName() {
return get("name");
}
@Override
public String getParentPath() {
return get("path");
}
@Override
public long getFileSize() {
// Present if still uploading and returns
final long finishedSize = getLong("incompletesize");
return (finishedSize > 0) ? finishedSize : super.getFileSize();
}
@Override
public int getType() {
return getInt("type");
}
@Override
public boolean isFile() {
return getType() == 1;
}
@Override
public boolean isDirectory() {
return getType() == 0;
}
/**
* Returns {@code true} if this file was actively being uploaded at the time
* this object was created. Note that this will return {@code false} if a
* client has paused an upload.
*
* @return whether this file is actively being uploaded
*/
public boolean isStillUploading() {
return getLong("incompletesize") > 0;
}
/**
* If this file is still uploading, this method will return how many bytes have already
* been uploaded. Otherwise the normal file size is returned.
*
* @return how many bytes of this file have been uploaded
*/
public long getUploadedBytes() {
return super.getFileSize();
}
}
@@ -0,0 +1,166 @@
package com.github.manevolent.ts3j.api;
/*
* #%L
* TeamSpeak 3 Java API
* %%
* Copyright (C) 2016 Bert De Geyter, Roger Baumgartner
* %%
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
* #L%
*/
import java.util.Map;
public class FileTransfer extends Wrapper {
public FileTransfer(Map<String, String> map) {
super(map);
}
/**
* Gets the ID of the client who started this file transfer.
*
* @return the ID of the involved client
*/
public int getClientId() {
return getInt("clid");
}
/**
* Gets the path of the folder that the file which is being transferred is stored in on disk.
* This path seems to be relative to the folder the TS3 server is installed in.
*
* @return the disk path of the folder containing the transferring file
*/
public String getDiskFilePath() {
return get("path");
}
/**
* Returns the name of the file on the TS3 server without its full path.
*
* @return the file's name
*/
public String getFileName() {
return get("name");
}
/**
* Gets the size in bytes the file will have once it is fully transferred.
*
* @return the final file size in bytes
*/
public long getTotalFileSize() {
return getLong("size");
}
/**
* Gets the amount of bytes that have already been transferred.
*
* @return the amount of transferred bytes
*/
public long getTransferredFileSize() {
return getLong("sizedone");
}
/**
* Returns the key that the client has sent to the server to identify their file transfer.
*
* @return the client's file transfer ID
*/
public int getClientTransferId() {
return getInt("clientftfid");
}
/**
* Returns an internal ID that the server uses to identify their file transfer.
* This is <strong>not</strong> the key that can be used to request a file from the file server.
*
* @return the server's file transfer ID
*/
public int getServerTransferId() {
return getInt("serverftfid");
}
/**
* Returns the current status of the file transfer.
* <p>
* Currently known status codes:
* </p>
* <ul>
* <li>0 - Not started</li>
* <li>1 - Active</li>
* <li>2 - Inactive (paused, stalled or done)</li>
* </ul>
*
* @return the current transfer status
*/
public int getStatus() {
return getInt("status");
}
/**
* Returns {@code true} if the file transfer has started.
*
* @return whether the file transfer has started
*/
public boolean hasStarted() {
return getStatus() > 0;
}
/**
* Returns {@code true} if the file transfer is still active.
* This is the case when the transfer has started and is not done or paused.
*
* @return whether the file transfer is active
*/
public boolean isActive() {
return getStatus() == 1;
}
/**
* Returns the current file transfer speed in bytes per second.
*
* @return the current transfer speed
*/
public double getCurrentSpeed() {
return getDouble("current_speed");
}
/**
* Returns the current file transfer speed in bytes per second.
*
* @return the current transfer speed
*/
public double getAverageSpeed() {
return getDouble("average_speed");
}
/**
* Returns how many milliseconds have elapsed since the file transfer was first announced to
* the server. This value will count up even if the file transfer has not yet been started,
* but will stop if the transfer has been paused or is complete.
*
* @return the transfer runtime in milliseconds
*/
public long getRuntime() {
return getLong("runtime");
}
}
@@ -0,0 +1,127 @@
package com.github.manevolent.ts3j.api;
/*
* #%L
* TeamSpeak 3 Java API
* %%
* Copyright (C) 2016 Bert De Geyter, Roger Baumgartner
* %%
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
* #L%
*/
import java.util.HashMap;
import java.util.Map;
/**
* Represents an internally started file transfer and encapsulates the command response.
*/
public class FileTransferParameters extends Wrapper {
public FileTransferParameters(Map<String, String> map) {
super(map);
}
/**
* Returns the key that the client has sent to the server to identify their file transfer.
*
* @return the client's file transfer ID
*/
public int getClientTransferId() {
return getInt("clientftfid");
}
/**
* Returns an internal ID that the server uses to identify their file transfer.
* This is <strong>not</strong> the key that can be used to request a file from the file server.
*
* @return the server's file transfer ID
*/
public int getServerTransferId() {
return getInt("serverftfid");
}
/**
* Gets the key needed identify ourselves to the file server and to start the file transfer.
*
* @return the file transfer key
*/
public String getFileTransferKey() {
return get("ftkey");
}
/**
* Gets the IP address or hostname of the file server the TS3 instance wants us to send our data to.
*
* @return the IP address of the file server
*/
public String getFileServerHost() {
return get("ip");
}
/**
* Gets the port of the file server the TS3 instance wants us to send our data to.
*
* @return the port of the file server
*/
public int getFileServerPort() {
return getInt("port");
}
/**
* Gets the size of the file being downloaded in bytes.
* Only present if this is a successfully started download.
*
* @return the size of the file being downloaded.
*/
public long getFileSize() {
return getLong("size");
}
/**
* Gets a {@link QueryError} that can be used when throwing an exception.
*
* @return a query error for this command's success value
*/
public QueryError getQueryError() {
Map<String, String> errorMap = new HashMap<>(2);
errorMap.put("id", String.valueOf(getStatus()));
errorMap.put("msg", getMessage());
return new QueryError(errorMap);
}
/**
* Gets the status / error code of this command. Only present if the command failed.
*
* @return the command's status value
*/
public int getStatus() {
final int status = getInt("status");
return status == -1 ? 0 : status;
}
/**
* Gets the message that is provided in case the command fails.
*
* @return the failure message
*/
public String getMessage() {
return get("msg");
}
}
@@ -0,0 +1,45 @@
package com.github.manevolent.ts3j.api;
/*
* #%L
* TeamSpeak 3 Java API
* %%
* Copyright (C) 2014 Bert De Geyter
* %%
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
* #L%
*/
public enum HostBannerMode {
NO_ADJUST(0),
IGNORE_ASPECT(1),
KEEP_ASPECT(2),
UNKNOWN(-1);
private final int i;
HostBannerMode(int i) {
this.i = i;
}
public int getIndex() {
return i;
}
}
@@ -0,0 +1,110 @@
package com.github.manevolent.ts3j.api;
/*
* #%L
* TeamSpeak 3 Java API
* %%
* Copyright (C) 2014 Bert De Geyter
* %%
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
* #L%
*/
import java.util.Date;
import java.util.Map;
public class HostInfo extends Wrapper {
public HostInfo(Map<String, String> map) {
super(map);
}
public long getUptime() {
return getLong(ServerInstanceProperty.INSTANCE_UPTIME);
}
public Date getTimeStamp() {
return new Date(getLong(ServerInstanceProperty.HOST_TIMESTAMP_UTC) * 1000);
}
public int getTotalRunningServers() {
return getInt(ServerInstanceProperty.VIRTUALSERVERS_RUNNING_TOTAL);
}
public int getTotalMaxClients() {
return getInt(ServerInstanceProperty.VIRTUALSERVERS_TOTAL_MAXCLIENTS);
}
public int getTotalClientsOnline() {
return getInt(ServerInstanceProperty.VIRTUALSERVERS_TOTAL_CLIENTS_ONLINE);
}
public int getTotalChannels() {
return getInt(ServerInstanceProperty.VIRTUALSERVERS_TOTAL_CHANNELS_ONLINE);
}
public long getFileTransferBandwidthSent() {
return getLong(ServerInstanceProperty.CONNECTION_FILETRANSFER_BANDWIDTH_SENT);
}
public long getFileTransferBandwidthReceived() {
return getLong(ServerInstanceProperty.CONNECTION_FILETRANSFER_BANDWIDTH_RECEIVED);
}
public long getFileTransferBytesSent() {
return getLong(ServerInstanceProperty.CONNECTION_FILETRANSFER_BYTES_SENT_TOTAL);
}
public long getFileTransferBytesReceived() {
return getLong(ServerInstanceProperty.CONNECTION_FILETRANSFER_BYTES_RECEIVED_TOTAL);
}
public long getPacketsSentTotal() {
return getLong(ServerInstanceProperty.CONNECTION_PACKETS_SENT_TOTAL);
}
public long getBytesSentTotal() {
return getLong(ServerInstanceProperty.CONNECTION_BYTES_SENT_TOTAL);
}
public long getPacketsReceivedTotal() {
return getLong(ServerInstanceProperty.CONNECTION_PACKETS_RECEIVED_TOTAL);
}
public long getBytesReceivedTotal() {
return getLong(ServerInstanceProperty.CONNECTION_BYTES_RECEIVED_TOTAL);
}
public long getBandwidthSentLastSecond() {
return getLong(ServerInstanceProperty.CONNECTION_BANDWIDTH_SENT_LAST_SECOND_TOTAL);
}
public long getBandwidthSentLastMinute() {
return getLong(ServerInstanceProperty.CONNECTION_BANDWIDTH_SENT_LAST_MINUTE_TOTAL);
}
public long getBandwidthReceivedLastSecond() {
return getLong(ServerInstanceProperty.CONNECTION_BANDWIDTH_RECEIVED_LAST_SECOND_TOTAL);
}
public long getBandwidthReceivedLastMinute() {
return getLong(ServerInstanceProperty.CONNECTION_BANDWIDTH_RECEIVED_LAST_MINUTE_TOTAL);
}
}
@@ -0,0 +1,46 @@
package com.github.manevolent.ts3j.api;
/*
* #%L
* TeamSpeak 3 Java API
* %%
* Copyright (C) 2014 Bert De Geyter
* %%
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
* #L%
*/
public enum HostMessageMode {
LOG(1),
MODAL(2),
MODAL_QUIT(3),
UNKNOWN(-1);
private final int i;
HostMessageMode(int i) {
this.i = i;
}
public int getIndex() {
return i;
}
}
@@ -0,0 +1,50 @@
package com.github.manevolent.ts3j.api;
/*
* #%L
* TeamSpeak 3 Java API
* %%
* Copyright (C) 2016 Bert De Geyter, Roger Baumgartner
* %%
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
* #L%
*/
import java.util.Map;
public class IconFile extends FileListEntry {
public IconFile(Map<String, String> map) {
super(map);
}
/**
* Gets the icon ID corresponding to this file, or {@code -1} if the file name
* doesn't follow the standard format.
*
* @return this file's icon ID
*/
public long getIconId() {
String fileName = getName();
if (!fileName.matches("icon_\\d{1,10}")) return -1L; // Doesn't match standard pattern
long id = Long.parseLong(fileName.substring("icon_".length()));
if ((id & 0xFFFF_FFFF_0000_0000L) != 0) return -1L; // CRC32 is 32 bits, so needs to fit into an int
return id;
}
}
@@ -0,0 +1,88 @@
package com.github.manevolent.ts3j.api;
/*
* #%L
* TeamSpeak 3 Java API
* %%
* Copyright (C) 2014 Bert De Geyter
* %%
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
* #L%
*/
import java.util.Map;
public class InstanceInfo extends Wrapper {
public InstanceInfo(Map<String, String> map) {
super(map);
}
public int getDatabaseVersion() {
return getInt(ServerInstanceProperty.SERVERINSTANCE_DATABASE_VERSION);
}
public int getFileTransferPort() {
return getInt(ServerInstanceProperty.SERVERINSTANCE_FILETRANSFER_PORT);
}
public long getMaxDownloadBandwidth() {
return getLong(ServerInstanceProperty.SERVERINSTANCE_MAX_DOWNLOAD_TOTAL_BANDWIDTH);
}
public long getMaxUploadBandwidth() {
return getLong(ServerInstanceProperty.SERVERINSTANCE_MAX_UPLOAD_TOTAL_BANDWIDTH);
}
public int getGuestServerQueryGroup() {
return getInt(ServerInstanceProperty.SERVERINSTANCE_GUEST_SERVERQUERY_GROUP);
}
public int getMaxFloodCommands() {
return getInt(ServerInstanceProperty.SERVERINSTANCE_SERVERQUERY_FLOOD_COMMANDS);
}
public int getMaxFloodTime() { // SECONDS
return getInt(ServerInstanceProperty.SERVERINSTANCE_SERVERQUERY_FLOOD_TIME);
}
public int getFloodBanTime() {// SECONDS
return getInt(ServerInstanceProperty.SERVERINSTANCE_SERVERQUERY_BAN_TIME);
}
public int getServerAdminGroup() {
return getInt(ServerInstanceProperty.SERVERINSTANCE_TEMPLATE_SERVERADMIN_GROUP);
}
public int getDefaultServerGroup() {
return getInt(ServerInstanceProperty.SERVERINSTANCE_TEMPLATE_SERVERDEFAULT_GROUP);
}
public int getChannelAdminGroup() {
return getInt(ServerInstanceProperty.SERVERINSTANCE_TEMPLATE_CHANNELADMIN_GROUP);
}
public int getDefaultChannelGroup() {
return getInt(ServerInstanceProperty.SERVERINSTANCE_TEMPLATE_CHANNELDEFAULT_GROUP);
}
public int getPermissionsVersion() {
return getInt(ServerInstanceProperty.SERVERINSTANCE_PERMISSIONS_VERSION);
}
}
@@ -0,0 +1,57 @@
package com.github.manevolent.ts3j.api;
/*
* #%L
* TeamSpeak 3 Java API
* %%
* Copyright (C) 2014 Bert De Geyter
* %%
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
* #L%
*/
import java.util.Date;
import java.util.Map;
public class Message extends Wrapper {
public Message(Map<String, String> map) {
super(map);
}
public int getId() {
return getInt("msgid");
}
public String getSenderUniqueIdentifier() {
return get("cluid");
}
public String getSubject() {
return get("subject");
}
public Date getReceivedDate() {
return new Date(getLong("timestamp") * 1000);
}
public boolean hasBeenRead() {
return getBoolean("flag_read");
}
}
@@ -0,0 +1,110 @@
package com.github.manevolent.ts3j.api;
/*
* #%L
* TeamSpeak 3 Java API
* %%
* Copyright (C) 2014 Bert De Geyter
* %%
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
* #L%
*/
import java.util.Map;
/**
* Describes a permission that has been assigned to a client,
* a channel group or a server group.
* <p>
* For a complete description of the TS3 permission system, refer to
* <a href="http://forum.teamspeak.com/threads/49581-The-New-Permission-Documentataions">
* this post</a> on the TeamSpeak forums.
* </p>
*/
public class Permission extends Wrapper {
public Permission(Map<String, String> map) {
super(map);
}
/**
* Gets the name of this permission.
* <p>
* Boolean permissions are prefixed with {@code b_}<br>
* Integer permissions are prefixed with {@code i_}
* </p>
*
* @return this permission's name
*/
public String getName() {
return get("permsid");
}
/**
* Gets the value of this permission assignment.
* <p>
* Please note that this value doesn't necessarily have to be
* the effective permission value for a client, as this assignment
* can be overridden by another assignment.
* </p><p>
* Integer permissions usually have values between 0 and 100,
* but any integer value is theoretically valid.
* </p><p>
* Boolean permissions have a value of {@code 0} to represent
* {@code false} and {@code 1} to represent {@code true}.
* </p>
*
* @return the value of this permission assignment
*/
public int getValue() {
return getInt("permvalue");
}
/**
* Returns {@code true} if this permission is negated.
* <p>
* Negated means that instead of the highest value, the lowest
* value will be selected for this permission instead.
* </p>
*
* @return whether this permission is negated or not
*/
public boolean isNegated() {
return getBoolean("permnegated");
}
/**
* Returns {@code true} if this permission is skipped.
* <p>
* Skipped only exists for server group and client permissions,
* therefore this value will always be false for channel group permissions.
* </p><p>
* If a client permission is skipped, it won't be overridden by channel
* group permissions.<br>
* If a server group permission is skipped, it won't be overridden by
* channel group or client permissions.
* </p>
*
* @return whether this permission is negated or not
*/
public boolean isSkipped() {
return getBoolean("permskip");
}
}
@@ -0,0 +1,160 @@
package com.github.manevolent.ts3j.api;
/*
* #%L
* TeamSpeak 3 Java API
* %%
* Copyright (C) 2014 Bert De Geyter
* %%
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
* #L%
*/
import java.util.Map;
/**
* Describes a single permission that is assigned to a varying target.
* <p>
* This class is used when a lot of permissions are sent at once.
* To reduce bandwidth usage, the TS3 server only transmit the numeric
* permission ID and not the permission name.
* </p><p>
* For a complete description of the TS3 permission system, refer to
* <a href="http://forum.teamspeak.com/threads/49581-The-New-Permission-Documentataions">
* this post</a> on the TeamSpeak forums.
* </p>
*/
public class PermissionAssignment extends Wrapper {
public PermissionAssignment(Map<String, String> map) {
super(map);
}
/**
* Where this permission assignment originates from.
*
* @return the type of this permission assignment
*/
public PermissionGroupType getType() {
final int type = getInt("t");
for (final PermissionGroupType p : PermissionGroupType.values()) {
if (p.getIndex() == type) {
return p;
}
}
return null;
}
/**
* Specifies where this permission assignment originates from,
* depending on the {@linkplain #getType() type} of this assignment.
* <p>
* {@code x -> y} := <i>In case {@code type} is {@code x}, {@code majorId} means {@code y}</i>
* </p><p>
* {@linkplain PermissionGroupType#SERVER_GROUP SERVER_GROUP} {@code ->} {@linkplain ServerGroup#getId() Server group ID}<br>
* {@linkplain PermissionGroupType#GLOBAL_CLIENT GLOBAL_CLIENT} {@code ->} {@linkplain Client#getDatabaseId() Client database ID}<br>
* {@linkplain PermissionGroupType#CHANNEL CHANNEL} {@code ->} {@linkplain Channel#getId() Channel ID}<br>
* {@linkplain PermissionGroupType#CHANNEL_GROUP CHANNEL_GROUP} {@code ->} {@linkplain Channel#getId() Channel ID}<br>
* {@linkplain PermissionGroupType#CHANNEL_CLIENT CHANNEL_CLIENT} {@code ->} {@linkplain Channel#getId() Channel ID}
* </p>
*
* @return the major ID of the source of this assignment as described above
*/
public int getMajorId() {
return getInt("id1");
}
/**
* Specifies where this permission assignment originates from,
* depending on the {@linkplain #getType() type} of this assignment.
* <p>
* {@code x -> y} := <i>In case {@code type} is {@code x}, {@code minorId} means {@code y}</i>
* </p><p>
* {@linkplain PermissionGroupType#CHANNEL_GROUP CHANNEL_GROUP} {@code ->} {@linkplain ChannelGroup#getId() Channel group ID}<br>
* {@linkplain PermissionGroupType#CHANNEL_CLIENT CHANNEL_CLIENT} {@code ->} {@linkplain Client#getDatabaseId() Client database ID}
* </p><p>
* Otherwise {@code getMinorId()} is undefined should return {@code 0}.
* </p>
*
* @return the minor ID of the source of this assignment as described above
*/
public int getMinorId() {
return getInt("id2");
}
/**
* Gets the numerical ID of this permission.
*
* @return this permission's numerical ID
*/
public int getId() {
return getInt("p");
}
/**
* Gets the value of this permission assignment.
* <p>
* Please note that this value doesn't necessarily have to be
* the effective permission value for a client, as this assignment
* can be overridden by another assignment.
* </p><p>
* Integer permissions usually have values between 0 and 100,
* but any integer value is theoretically valid.
* </p><p>
* Boolean permissions have a value of {@code 0} to represent
* {@code false} and {@code 1} to represent {@code true}.
* </p>
*
* @return the value of this permission assignment
*/
public int getValue() {
return getInt("v");
}
/**
* Returns {@code true} if this permission is negated.
* <p>
* Negated means that instead of the highest value, the lowest
* value will be selected for this permission instead.
* </p>
*
* @return whether this permission is negated or not
*/
public boolean isNegated() {
return getBoolean("n");
}
/**
* Returns {@code true} if this permission is skipped.
* <p>
* Skipped only exists for server group and client permissions,
* therefore this value will always be false for channel group permissions.
* </p><p>
* If a client permission is skipped, it won't be overridden by channel
* group permissions.<br>
* If a server group permission is skipped, it won't be overridden by
* channel group or client permissions.
* </p>
*
* @return whether this permission is negated or not
*/
public boolean isSkipped() {
return getBoolean("s");
}
}
@@ -0,0 +1,45 @@
package com.github.manevolent.ts3j.api;
/*
* #%L
* TeamSpeak 3 Java API
* %%
* Copyright (C) 2014 Bert De Geyter
* %%
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
* #L%
*/
public enum PermissionGroupDatabaseType {
TEMPLATE(0),
REGULAR(1),
QUERY(2);
private final int i;
PermissionGroupDatabaseType(int i) {
this.i = i;
}
public int getIndex() {
return i;
}
}
@@ -0,0 +1,76 @@
package com.github.manevolent.ts3j.api;
/*
* #%L
* TeamSpeak 3 Java API
* %%
* Copyright (C) 2014 Bert De Geyter
* %%
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
* #L%
*/
/**
* An enum describing where a {@link PermissionAssignment} originates from.
*/
public enum PermissionGroupType {
/**
* A permission assigned to a server group.
*/
SERVER_GROUP(0),
/**
* A permission assigned to a client on a server-wide level.
*/
GLOBAL_CLIENT(1),
/**
* A permission requirement for certain actions in a channel.
* <p>
* Examples: Join, talk, subscribe and file upload permission requirements
* </p>
*/
CHANNEL(2),
/**
* A permission assigned to a channel group.
*/
CHANNEL_GROUP(3),
/**
* A permission assigned to a client in a specific channel.
* <p>
* This is mostly used for the priority speaker feature by granting
* {@code b_client_is_priority_speaker} to a client in a channel.
* </p>
*/
CHANNEL_CLIENT(4);
private final int i;
PermissionGroupType(int i) {
this.i = i;
}
public int getIndex() {
return i;
}
}
@@ -0,0 +1,88 @@
package com.github.manevolent.ts3j.api;
/*
* #%L
* TeamSpeak 3 Java API
* %%
* Copyright (C) 2014 Bert De Geyter
* %%
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
* #L%
*/
import java.util.Map;
/**
* Describes a single permission on the TS3 server.
* <p>
* Includes the numerical ID and the name of the permission, as well
* as an optional short description of this permission. Does not
* include any information about any possible permission assignments.
* </p><p>
* For a complete description of the TS3 permission system, refer to
* <a href="http://forum.teamspeak.com/threads/49581-The-New-Permission-Documentataions">
* this post</a> on the TeamSpeak forums.
* </p>
*/
public class PermissionInfo extends Wrapper {
public PermissionInfo(Map<String, String> map) {
super(map);
}
/**
* Gets the numerical ID of this permission.
* <p>
* In most cases, the name of the permission should be
* preferred over the numerical ID.
* </p>
*
* @return this permission's numerical ID
*/
public int getId() {
return getInt("permid");
}
/**
* Gets the name of this permission.
* <p>
* Boolean permissions are prefixed with {@code b_}<br>
* Integer permissions are prefixed with {@code i_}
* </p>
*
* @return this permission's name
*/
public String getName() {
return get("permname");
}
/**
* A short description about what this permission does.
* <p>
* Does not exist for all permissions. In that case, an
* empty String will be returned instead.
* </p>
*
* @return a short description of this permission
*/
public String getDescription() {
return get("permdesc");
}
}
@@ -0,0 +1,69 @@
package com.github.manevolent.ts3j.api;
/*
* #%L
* TeamSpeak 3 Java API
* %%
* Copyright (C) 2014 Bert De Geyter
* %%
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
* #L%
*/
import java.util.Date;
import java.util.Map;
public class PrivilegeKey extends Wrapper {
public PrivilegeKey(Map<String, String> map) {
super(map);
}
public String getToken() {
return get("token");
}
public int getType() {
return getInt("token_type");
}
public boolean isServerGroupToken() {
return getType() == 0;
}
public boolean isChannelGroupToken() {
return !isServerGroupToken();
}
public int getGroupId() {
return getInt("token_id1");
}
public int getChannelId() {
return getInt("token_id2");
}
public Date getCreated() {
return new Date(getLong("token_created") * 1000);
}
public String getDescription() {
return get("token_description");
}
}
@@ -0,0 +1,44 @@
package com.github.manevolent.ts3j.api;
/*
* #%L
* TeamSpeak 3 Java API
* %%
* Copyright (C) 2014 Bert De Geyter
* %%
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
* #L%
*/
public enum PrivilegeKeyType {
SERVER_GROUP(0),
CHANNEL_GROUP(1);
private final int i;
PrivilegeKeyType(int i) {
this.i = i;
}
public int getIndex() {
return i;
}
}
@@ -0,0 +1,34 @@
package com.github.manevolent.ts3j.api;
/*
* #%L
* TeamSpeak 3 Java API
* %%
* Copyright (C) 2014 Bert De Geyter
* %%
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
* #L%
*/
public interface Property {
String getName();
boolean isChangeable();
}
@@ -0,0 +1,60 @@
package com.github.manevolent.ts3j.api;
/*
* #%L
* TeamSpeak 3 Java API
* %%
* Copyright (C) 2014 Bert De Geyter
* %%
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
* #L%
*/
import java.util.Map;
public class QueryError extends Wrapper {
private static final int ERROR_ID_OK = 0;
private static final int ERROR_ID_EMPTY_RESULT_SET = 1281;
public QueryError(Map<String, String> map) {
super(map);
}
public int getId() {
return getInt("id");
}
public String getMessage() {
return get("msg");
}
public String getExtraMessage() {
return get("extra_msg");
}
public int getFailedPermissionId() {
return getInt("failed_permid");
}
public boolean isSuccessful() {
final int id = getId();
return (id == ERROR_ID_OK || id == ERROR_ID_EMPTY_RESULT_SET);
}
}
@@ -0,0 +1,44 @@
package com.github.manevolent.ts3j.api;
/*
* #%L
* TeamSpeak 3 Java API
* %%
* Copyright (C) 2014 Bert De Geyter
* %%
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
* #L%
*/
public enum ReasonIdentifier {
REASON_KICK_CHANNEL(4),
REASON_KICK_SERVER(5);
private final int i;
ReasonIdentifier(int i) {
this.i = i;
}
public int getIndex() {
return i;
}
}
@@ -0,0 +1,83 @@
package com.github.manevolent.ts3j.api;
/*
* #%L
* TeamSpeak 3 Java API
* %%
* Copyright (C) 2014 Bert De Geyter
* %%
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
* #L%
*/
import java.util.Map;
public class ServerGroup extends Wrapper {
public ServerGroup(Map<String, String> map) {
super(map);
}
public int getId() {
return getInt("sgid");
}
public String getName() {
return get("name");
}
public PermissionGroupDatabaseType getType() {
final int type = getInt("type");
for (final PermissionGroupDatabaseType p : PermissionGroupDatabaseType.values()) {
if (p.getIndex() == type) {
return p;
}
}
return null;
}
public long getIconId() {
return getLong("iconid");
}
public int getSaveDb() {
return getInt("savedb");
}
public int getSortId() {
return getInt("sortid");
}
public int getNameMode() {
return getInt("namemode");
}
public int getModifyPower() {
return getInt("n_modifyp");
}
public int getMemberAddPower() {
return getInt("n_member_addp");
}
public int getMemberRemovePower() {
return getInt("n_member_removep");
}
}
@@ -0,0 +1,49 @@
package com.github.manevolent.ts3j.api;
/*
* #%L
* TeamSpeak 3 Java API
* %%
* Copyright (C) 2014 Bert De Geyter
* %%
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
* #L%
*/
import java.util.Map;
public class ServerGroupClient extends Wrapper {
public ServerGroupClient(Map<String, String> map) {
super(map);
}
public int getClientDatabaseId() {
return getInt("cldbid");
}
public String getNickname() {
return get("client_nickname");
}
public String getUniqueIdentifier() {
return get("client_unique_identifier");
}
}
@@ -0,0 +1,80 @@
package com.github.manevolent.ts3j.api;
/*
* #%L
* TeamSpeak 3 Java API
* %%
* Copyright (C) 2014 Bert De Geyter
* %%
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
* #L%
*/
import java.util.Locale;
public enum ServerInstanceProperty implements Property {
CONNECTION_BANDWIDTH_RECEIVED_LAST_MINUTE_TOTAL(false),
CONNECTION_BANDWIDTH_RECEIVED_LAST_SECOND_TOTAL(false),
CONNECTION_BANDWIDTH_SENT_LAST_MINUTE_TOTAL(false),
CONNECTION_BANDWIDTH_SENT_LAST_SECOND_TOTAL(false),
CONNECTION_BYTES_RECEIVED_TOTAL(false),
CONNECTION_BYTES_SENT_TOTAL(false),
CONNECTION_FILETRANSFER_BANDWIDTH_RECEIVED(false),
CONNECTION_FILETRANSFER_BANDWIDTH_SENT(false),
CONNECTION_FILETRANSFER_BYTES_RECEIVED_TOTAL(false),
CONNECTION_FILETRANSFER_BYTES_SENT_TOTAL(false),
CONNECTION_PACKETS_RECEIVED_TOTAL(false),
CONNECTION_PACKETS_SENT_TOTAL(false),
HOST_TIMESTAMP_UTC(false),
INSTANCE_UPTIME(false),
SERVERINSTANCE_DATABASE_VERSION(false),
SERVERINSTANCE_FILETRANSFER_PORT(true),
SERVERINSTANCE_GUEST_SERVERQUERY_GROUP(true),
SERVERINSTANCE_MAX_DOWNLOAD_TOTAL_BANDWIDTH(true),
SERVERINSTANCE_MAX_UPLOAD_TOTAL_BANDWIDTH(true),
SERVERINSTANCE_PERMISSIONS_VERSION(false),
SERVERINSTANCE_SERVERQUERY_BAN_TIME(true),
SERVERINSTANCE_SERVERQUERY_FLOOD_COMMANDS(true),
SERVERINSTANCE_SERVERQUERY_FLOOD_TIME(true),
SERVERINSTANCE_TEMPLATE_CHANNELADMIN_GROUP(true),
SERVERINSTANCE_TEMPLATE_CHANNELDEFAULT_GROUP(true),
SERVERINSTANCE_TEMPLATE_SERVERADMIN_GROUP(true),
SERVERINSTANCE_TEMPLATE_SERVERDEFAULT_GROUP(true),
VIRTUALSERVERS_RUNNING_TOTAL(false),
VIRTUALSERVERS_TOTAL_CHANNELS_ONLINE(false),
VIRTUALSERVERS_TOTAL_CLIENTS_ONLINE(false),
VIRTUALSERVERS_TOTAL_MAXCLIENTS(false);
private final boolean changeable;
ServerInstanceProperty(boolean changeable) {
this.changeable = changeable;
}
@Override
public String getName() {
return name().toLowerCase(Locale.ROOT);
}
@Override
public boolean isChangeable() {
return changeable;
}
}
@@ -0,0 +1,41 @@
package com.github.manevolent.ts3j.api;
/*
* #%L
* TeamSpeak 3 Java API
* %%
* Copyright (C) 2014 Bert De Geyter
* %%
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
* #L%
*/
public class Snapshot {
private final String snapshot;
public Snapshot(String snapshot) {
this.snapshot = snapshot;
}
public String get() {
return snapshot;
}
}
@@ -0,0 +1,45 @@
package com.github.manevolent.ts3j.api;
/*
* #%L
* TeamSpeak 3 Java API
* %%
* Copyright (C) 2014 Bert De Geyter
* %%
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
* #L%
*/
public enum TextMessageTargetMode {
CLIENT(1),
CHANNEL(2),
SERVER(3);
private final int i;
TextMessageTargetMode(int i) {
this.i = i;
}
public int getIndex() {
return i;
}
}
@@ -0,0 +1,49 @@
package com.github.manevolent.ts3j.api;
/*
* #%L
* TeamSpeak 3 Java API
* %%
* Copyright (C) 2014 Bert De Geyter
* %%
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
* #L%
*/
import java.util.Map;
public class Version extends Wrapper {
public Version(Map<String, String> map) {
super(map);
}
public String getVersion() {
return get("version");
}
public String getBuild() {
return get("build");
}
public String getPlatform() {
return get("platform");
}
}
@@ -0,0 +1,82 @@
package com.github.manevolent.ts3j.api;
/*
* #%L
* TeamSpeak 3 Java API
* %%
* Copyright (C) 2014 Bert De Geyter
* %%
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
* #L%
*/
import java.util.Map;
public class VirtualServer extends Wrapper {
public VirtualServer(Map<String, String> map) {
super(map);
}
public int getId() {
return getInt(VirtualServerProperty.VIRTUALSERVER_ID);
}
public int getPort() {
return getInt(VirtualServerProperty.VIRTUALSERVER_PORT);
}
public VirtualServerStatus getStatus() {
final String status = get(VirtualServerProperty.VIRTUALSERVER_STATUS);
for (final VirtualServerStatus s : VirtualServerStatus.values()) {
if (status.equals(s.getName())) {
return s;
}
}
return VirtualServerStatus.UNKNOWN;
}
public int getClientsOnline() {
return getInt(VirtualServerProperty.VIRTUALSERVER_CLIENTSONLINE);
}
public int getQueryClientsOnline() {
return getInt(VirtualServerProperty.VIRTUALSERVER_QUERYCLIENTSONLINE);
}
public int getMaxClients() {
return getInt(VirtualServerProperty.VIRTUALSERVER_MAXCLIENTS);
}
public String getUniqueIdentifier() {
return get(VirtualServerProperty.VIRTUALSERVER_UNIQUE_IDENTIFIER);
}
public long getUptime() {
return getLong(VirtualServerProperty.VIRTUALSERVER_UPTIME); // in seconds
}
public String getName() {
return get(VirtualServerProperty.VIRTUALSERVER_NAME);
}
public boolean isAutoStart() {
return getBoolean(VirtualServerProperty.VIRTUALSERVER_AUTOSTART);
}
}
@@ -0,0 +1,387 @@
package com.github.manevolent.ts3j.api;
/*
* #%L
* TeamSpeak 3 Java API
* %%
* Copyright (C) 2014 Bert De Geyter
* %%
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
* #L%
*/
import java.util.Date;
import java.util.Map;
public class VirtualServerInfo extends VirtualServer {
public VirtualServerInfo(Map<String, String> map) {
super(map);
}
public int getAntifloodPointsNeededCommandBlock() {
return getInt(VirtualServerProperty.VIRTUALSERVER_ANTIFLOOD_POINTS_NEEDED_COMMAND_BLOCK);
}
public int getAntifloodPointsNeedIpBlock() {
return getInt(VirtualServerProperty.VIRTUALSERVER_ANTIFLOOD_POINTS_NEEDED_IP_BLOCK);
}
public int getAntifloodPointsTickReduce() {
return getInt(VirtualServerProperty.VIRTUALSERVER_ANTIFLOOD_POINTS_TICK_REDUCE);
}
public long getBandwidthReceivedLastMinute() {
return getInt(VirtualServerProperty.CONNECTION_BANDWIDTH_RECEIVED_LAST_MINUTE_TOTAL);
}
public long getBandwidthReceivedLastSecond() {
return getLong(VirtualServerProperty.CONNECTION_BANDWIDTH_RECEIVED_LAST_SECOND_TOTAL);
}
public long getBandwidthSentLastMinute() {
return getLong(VirtualServerProperty.CONNECTION_BANDWIDTH_SENT_LAST_MINUTE_TOTAL);
}
public long getBandwidthSentLastSecond() {
return getLong(VirtualServerProperty.CONNECTION_BANDWIDTH_SENT_LAST_SECOND_TOTAL);
}
public int getChannelsOnline() {
return getInt(VirtualServerProperty.VIRTUALSERVER_CHANNELSONLINE);
}
public CodecEncryptionMode getCodecEncryptionMode() {
final int encryptionMode = getInt(VirtualServerProperty.VIRTUALSERVER_CODEC_ENCRYPTION_MODE);
for (final CodecEncryptionMode m : CodecEncryptionMode.values()) {
if (m.getIndex() == encryptionMode) {
return m;
}
}
return CodecEncryptionMode.UNKNOWN;
}
public int getComplaintAutobanCount() {
return getInt(VirtualServerProperty.VIRTUALSERVER_COMPLAIN_AUTOBAN_COUNT);
}
public long getComplaintAutobanTime() {// SEC
return getLong(VirtualServerProperty.VIRTUALSERVER_COMPLAIN_AUTOBAN_TIME);
}
public long getComplaintRemoveTime() {
return getLong(VirtualServerProperty.VIRTUALSERVER_COMPLAIN_REMOVE_TIME);
}
public long getControlBytesReceived() {
return getLong(VirtualServerProperty.CONNECTION_BYTES_RECEIVED_CONTROL);
}
public long getControlBytesSent() {
return getLong(VirtualServerProperty.CONNECTION_BYTES_SENT_CONTROL);
}
public long getControlPacketsReceived() {
return getLong(VirtualServerProperty.CONNECTION_PACKETS_RECEIVED_CONTROL);
}
public long getControlPacketsSent() {
return getLong(VirtualServerProperty.CONNECTION_PACKETS_SENT_CONTROL);
}
public Date getCreatedDate() {
return new Date(getLong(VirtualServerProperty.VIRTUALSERVER_CREATED) * 1000);
}
public int getDefaultChannelAdminGroup() {
return getInt(VirtualServerProperty.VIRTUALSERVER_DEFAULT_CHANNEL_ADMIN_GROUP);
}
public int getDefaultChannelGroup() {
return getInt(VirtualServerProperty.VIRTUALSERVER_DEFAULT_CHANNEL_GROUP);
}
public int getDefaultServerGroup() {
return getInt(VirtualServerProperty.VIRTUALSERVER_DEFAULT_SERVER_GROUP);
}
public long getDownloadQuota() {
return getLong(VirtualServerProperty.VIRTUALSERVER_DOWNLOAD_QUOTA);
}
public String getFileBase() {
return get(VirtualServerProperty.VIRTUALSERVER_FILEBASE);
}
public long getFiletransferBandwidthReceived() {
return getLong(VirtualServerProperty.CONNECTION_FILETRANSFER_BANDWIDTH_RECEIVED);
}
public long getFiletransferBandwidthSent() {
return getLong(VirtualServerProperty.CONNECTION_FILETRANSFER_BANDWIDTH_SENT);
}
public long getFiletransferBytesReceived() {
return getLong(VirtualServerProperty.CONNECTION_FILETRANSFER_BYTES_RECEIVED_TOTAL);
}
public long getFiletransferBytesSent() {
return getLong(VirtualServerProperty.CONNECTION_FILETRANSFER_BYTES_SENT_TOTAL);
}
public int getHostbannerGfxInterval() {
return getInt(VirtualServerProperty.VIRTUALSERVER_HOSTBANNER_GFX_INTERVAL);
}
public String getHostbannerGfxUrl() {
return get(VirtualServerProperty.VIRTUALSERVER_HOSTBANNER_GFX_URL);
}
public HostBannerMode getHostbannerMode() {
final int hostbannerMode = getInt(VirtualServerProperty.VIRTUALSERVER_HOSTBANNER_MODE);
for (final HostBannerMode m : HostBannerMode.values()) {
if (m.getIndex() == hostbannerMode) {
return m;
}
}
return HostBannerMode.UNKNOWN;
}
public String getHostbannerUrl() {
return get(VirtualServerProperty.VIRTUALSERVER_HOSTBANNER_URL);
}
public String getHostbuttonGfxUrl() {
return get(VirtualServerProperty.VIRTUALSERVER_HOSTBUTTON_GFX_URL);
}
public String getHostbuttonTooltip() {
return get(VirtualServerProperty.VIRTUALSERVER_HOSTBUTTON_TOOLTIP);
}
public String getHostbuttonUrl() {
return get(VirtualServerProperty.VIRTUALSERVER_HOSTBUTTON_URL);
}
public String getHostMessage() {
return get(VirtualServerProperty.VIRTUALSERVER_HOSTMESSAGE);
}
public HostMessageMode getHostMessageMode() {
final int hostmessageMode = getInt(VirtualServerProperty.VIRTUALSERVER_HOSTMESSAGE_MODE);
for (final HostMessageMode m : HostMessageMode.values()) {
if (m.getIndex() == hostmessageMode) {
return m;
}
}
return HostMessageMode.UNKNOWN;
}
public long getIconId() {
return getLong(VirtualServerProperty.VIRTUALSERVER_ICON_ID);
}
public String getIp() {
return get(VirtualServerProperty.VIRTUALSERVER_IP);
}
public long getKeepAliveBytesReceived() {
return getLong(VirtualServerProperty.CONNECTION_BYTES_RECEIVED_KEEPALIVE);
}
public long getKeepAliveBytesSent() {
return getLong(VirtualServerProperty.CONNECTION_BYTES_SENT_KEEPALIVE);
}
public long getKeepAlivePacketsReceived() {
return getLong(VirtualServerProperty.CONNECTION_PACKETS_RECEIVED_KEEPALIVE);
}
public long getKeepAlivePacketsSent() {
return getLong(VirtualServerProperty.CONNECTION_PACKETS_SENT_KEEPALIVE);
}
public String getMachineId() {
return get(VirtualServerProperty.VIRTUALSERVER_MACHINE_ID);
}
public long getMaxDownloadBandwidth() {
return getLong(VirtualServerProperty.VIRTUALSERVER_MAX_DOWNLOAD_TOTAL_BANDWIDTH);
}
public long getMaxUploadBandwidth() {
return getLong(VirtualServerProperty.VIRTUALSERVER_MAX_UPLOAD_TOTAL_BANDWIDTH);
}
public int getMinClientsInChannelBeforeForcedSilence() {
return getInt(VirtualServerProperty.VIRTUALSERVER_MIN_CLIENTS_IN_CHANNEL_BEFORE_FORCED_SILENCE);
}
public int getMinimumClientVersion() {
return getInt(VirtualServerProperty.VIRTUALSERVER_MIN_CLIENT_VERSION);
}
public long getMonthlyBytesDownloaded() {
return getLong(VirtualServerProperty.VIRTUALSERVER_MONTH_BYTES_DOWNLOADED);
}
public long getMonthlyBytesUploaded() {
return getLong(VirtualServerProperty.VIRTUALSERVER_MONTH_BYTES_UPLOADED);
}
public int getNeededIdentitySecurityLevel() {
return getInt(VirtualServerProperty.VIRTUALSERVER_NEEDED_IDENTITY_SECURITY_LEVEL);
}
public String getPassword() {
return get(VirtualServerProperty.VIRTUALSERVER_PASSWORD);
}
public String getPhoneticName() {
return get(VirtualServerProperty.VIRTUALSERVER_NAME_PHONETIC);
}
public double getPing() {
return getDouble(VirtualServerProperty.VIRTUALSERVER_TOTAL_PING);
}
public String getPlatform() {
return get(VirtualServerProperty.VIRTUALSERVER_PLATFORM);
}
public double getPrioritySpeakerDimmModificator() {
return getDouble(VirtualServerProperty.VIRTUALSERVER_PRIORITY_SPEAKER_DIMM_MODIFICATOR);
}
public int getReservedSlots() {
return getInt(VirtualServerProperty.VIRTUALSERVER_RESERVED_SLOTS);
}
public long getSpeechBytesReceived() {
return getLong(VirtualServerProperty.CONNECTION_BYTES_RECEIVED_SPEECH);
}
public long getSpeechBytesSent() {
return getLong(VirtualServerProperty.CONNECTION_BYTES_SENT_SPEECH);
}
public long getSpeechPacketsReceived() {
return getLong(VirtualServerProperty.CONNECTION_PACKETS_RECEIVED_SPEECH);
}
public long getSpeechPacketsSent() {
return getLong(VirtualServerProperty.CONNECTION_PACKETS_SENT_SPEECH);
}
public long getTotalBytesDownloaded() {
return getLong(VirtualServerProperty.VIRTUALSERVER_TOTAL_BYTES_DOWNLOADED);
}
public long getTotalBytesReceived() {
return getLong(VirtualServerProperty.CONNECTION_BYTES_RECEIVED_TOTAL);
}
public long getTotalBytesSent() {
return getLong(VirtualServerProperty.CONNECTION_BYTES_SENT_TOTAL);
}
public long getTotalBytesUploaded() {
return getLong(VirtualServerProperty.VIRTUALSERVER_TOTAL_BYTES_UPLOADED);
}
public int getTotalClientConnections() {
return getInt(VirtualServerProperty.VIRTUALSERVER_CLIENT_CONNECTIONS);
}
public double getTotalControlPacketloss() {
return getDouble(VirtualServerProperty.VIRTUALSERVER_TOTAL_PACKETLOSS_CONTROL);
}
public double getTotalKeepAlivePacketloss() {
return getDouble(VirtualServerProperty.VIRTUALSERVER_TOTAL_PACKETLOSS_KEEPALIVE);
}
public double getTotalPacketloss() {
return getDouble(VirtualServerProperty.VIRTUALSERVER_TOTAL_PACKETLOSS_TOTAL);
}
public long getTotalPacketsReceived() {
return getLong(VirtualServerProperty.CONNECTION_PACKETS_RECEIVED_TOTAL);
}
public long getTotalPacketsSent() {
return getLong(VirtualServerProperty.CONNECTION_PACKETS_SENT_TOTAL);
}
public int getTotalQueryClientConnections() {
return getInt(VirtualServerProperty.VIRTUALSERVER_QUERY_CLIENT_CONNECTIONS);
}
public double getTotalSpeechPacketloss() {
return getDouble(VirtualServerProperty.VIRTUALSERVER_TOTAL_PACKETLOSS_SPEECH);
}
public long getUploadQuota() {
return getLong(VirtualServerProperty.VIRTUALSERVER_UPLOAD_QUOTA);
}
public String getVersion() {
return get(VirtualServerProperty.VIRTUALSERVER_VERSION);
}
public String getWelcomeMessage() {
return get(VirtualServerProperty.VIRTUALSERVER_WELCOMEMESSAGE);
}
public boolean hasPassword() {
return getBoolean(VirtualServerProperty.VIRTUALSERVER_FLAG_PASSWORD);
}
public boolean isAskingPrivilegeKey() {
return getBoolean(VirtualServerProperty.VIRTUALSERVER_ASK_FOR_PRIVILEGEKEY);
}
public boolean isLoggingChannel() {
return getBoolean(VirtualServerProperty.VIRTUALSERVER_LOG_CHANNEL);
}
public boolean isLoggingClient() {
return getBoolean(VirtualServerProperty.VIRTUALSERVER_LOG_CLIENT);
}
public boolean isLoggingFileTransfer() {
return getBoolean(VirtualServerProperty.VIRTUALSERVER_LOG_FILETRANSFER);
}
public boolean isLoggingPermissions() {
return getBoolean(VirtualServerProperty.VIRTUALSERVER_LOG_PERMISSIONS);
}
public boolean isLoggingQuery() {
return getBoolean(VirtualServerProperty.VIRTUALSERVER_LOG_QUERY);
}
public boolean isLoggingServer() {
return getBoolean(VirtualServerProperty.VIRTUALSERVER_LOG_SERVER);
}
public boolean isWeblistEnabled() {
return getBoolean(VirtualServerProperty.VIRTUALSERVER_WEBLIST_ENABLED);
}
}
@@ -0,0 +1,142 @@
package com.github.manevolent.ts3j.api;
/*
* #%L
* TeamSpeak 3 Java API
* %%
* Copyright (C) 2014 Bert De Geyter
* %%
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
* #L%
*/
import java.util.Locale;
public enum VirtualServerProperty implements Property {
CONNECTION_BANDWIDTH_RECEIVED_LAST_MINUTE_TOTAL(false),
CONNECTION_BANDWIDTH_RECEIVED_LAST_SECOND_TOTAL(false),
CONNECTION_BANDWIDTH_SENT_LAST_MINUTE_TOTAL(false),
CONNECTION_BANDWIDTH_SENT_LAST_SECOND_TOTAL(false),
CONNECTION_BYTES_RECEIVED_CONTROL(false),
CONNECTION_BYTES_RECEIVED_KEEPALIVE(false),
CONNECTION_BYTES_RECEIVED_SPEECH(false),
CONNECTION_BYTES_RECEIVED_TOTAL(false),
CONNECTION_BYTES_SENT_CONTROL(false),
CONNECTION_BYTES_SENT_KEEPALIVE(false),
CONNECTION_BYTES_SENT_SPEECH(false),
CONNECTION_BYTES_SENT_TOTAL(false),
CONNECTION_FILETRANSFER_BANDWIDTH_RECEIVED(false),
CONNECTION_FILETRANSFER_BANDWIDTH_SENT(false),
CONNECTION_FILETRANSFER_BYTES_RECEIVED_TOTAL(false),
CONNECTION_FILETRANSFER_BYTES_SENT_TOTAL(false),
CONNECTION_PACKETS_RECEIVED_CONTROL(false),
CONNECTION_PACKETS_RECEIVED_KEEPALIVE(false),
CONNECTION_PACKETS_RECEIVED_SPEECH(false),
CONNECTION_PACKETS_RECEIVED_TOTAL(false),
CONNECTION_PACKETS_SENT_CONTROL(false),
CONNECTION_PACKETS_SENT_KEEPALIVE(false),
CONNECTION_PACKETS_SENT_SPEECH(false),
CONNECTION_PACKETS_SENT_TOTAL(false),
VIRTUALSERVER_ANTIFLOOD_POINTS_NEEDED_COMMAND_BLOCK(true),
VIRTUALSERVER_ANTIFLOOD_POINTS_NEEDED_IP_BLOCK(true),
VIRTUALSERVER_ANTIFLOOD_POINTS_TICK_REDUCE(true),
VIRTUALSERVER_ASK_FOR_PRIVILEGEKEY(false),
VIRTUALSERVER_AUTOSTART(true),
VIRTUALSERVER_CHANNELSONLINE(false),
VIRTUALSERVER_CLIENT_CONNECTIONS(false),
VIRTUALSERVER_CLIENTSONLINE(false),
VIRTUALSERVER_CODEC_ENCRYPTION_MODE(true),
VIRTUALSERVER_COMPLAIN_AUTOBAN_COUNT(true),
VIRTUALSERVER_COMPLAIN_AUTOBAN_TIME(true),
VIRTUALSERVER_COMPLAIN_REMOVE_TIME(true),
VIRTUALSERVER_CREATED(false),
VIRTUALSERVER_DEFAULT_CHANNEL_ADMIN_GROUP(true),
VIRTUALSERVER_DEFAULT_CHANNEL_GROUP(true),
VIRTUALSERVER_DEFAULT_SERVER_GROUP(true),
VIRTUALSERVER_DOWNLOAD_QUOTA(true),
VIRTUALSERVER_FILEBASE(false),
VIRTUALSERVER_FLAG_PASSWORD(false),
VIRTUALSERVER_HOSTBANNER_GFX_INTERVAL(true),
VIRTUALSERVER_HOSTBANNER_GFX_URL(true),
VIRTUALSERVER_HOSTBANNER_MODE(true),
VIRTUALSERVER_HOSTBANNER_URL(true),
VIRTUALSERVER_HOSTBUTTON_GFX_URL(true),
VIRTUALSERVER_HOSTBUTTON_TOOLTIP(true),
VIRTUALSERVER_HOSTBUTTON_URL(true),
VIRTUALSERVER_HOSTMESSAGE(true),
VIRTUALSERVER_HOSTMESSAGE_MODE(true),
VIRTUALSERVER_ICON_ID(true),
VIRTUALSERVER_ID(false),
VIRTUALSERVER_IP(false),
VIRTUALSERVER_LOG_CHANNEL(true),
VIRTUALSERVER_LOG_CLIENT(true),
VIRTUALSERVER_LOG_FILETRANSFER(true),
VIRTUALSERVER_LOG_PERMISSIONS(true),
VIRTUALSERVER_LOG_QUERY(true),
VIRTUALSERVER_LOG_SERVER(true),
VIRTUALSERVER_MACHINE_ID(true),
VIRTUALSERVER_MAX_DOWNLOAD_TOTAL_BANDWIDTH(true),
VIRTUALSERVER_MAX_UPLOAD_TOTAL_BANDWIDTH(true),
VIRTUALSERVER_MAXCLIENTS(true),
VIRTUALSERVER_MIN_CLIENT_VERSION(true),
VIRTUALSERVER_MIN_CLIENTS_IN_CHANNEL_BEFORE_FORCED_SILENCE(true),
VIRTUALSERVER_MONTH_BYTES_DOWNLOADED(false),
VIRTUALSERVER_MONTH_BYTES_UPLOADED(false),
VIRTUALSERVER_NAME(true),
VIRTUALSERVER_NAME_PHONETIC(true),
VIRTUALSERVER_NEEDED_IDENTITY_SECURITY_LEVEL(true),
VIRTUALSERVER_PASSWORD(true),
VIRTUALSERVER_PLATFORM(false),
VIRTUALSERVER_PORT(true),
VIRTUALSERVER_PRIORITY_SPEAKER_DIMM_MODIFICATOR(true),
VIRTUALSERVER_QUERY_CLIENT_CONNECTIONS(false),
VIRTUALSERVER_QUERYCLIENTSONLINE(false),
VIRTUALSERVER_RESERVED_SLOTS(true),
VIRTUALSERVER_STATUS(true),
VIRTUALSERVER_TOTAL_BYTES_DOWNLOADED(false),
VIRTUALSERVER_TOTAL_BYTES_UPLOADED(false),
VIRTUALSERVER_TOTAL_PACKETLOSS_CONTROL(false),
VIRTUALSERVER_TOTAL_PACKETLOSS_KEEPALIVE(false),
VIRTUALSERVER_TOTAL_PACKETLOSS_SPEECH(false),
VIRTUALSERVER_TOTAL_PACKETLOSS_TOTAL(false),
VIRTUALSERVER_TOTAL_PING(false),
VIRTUALSERVER_UNIQUE_IDENTIFIER(false),
VIRTUALSERVER_UPLOAD_QUOTA(true),
VIRTUALSERVER_UPTIME(false),
VIRTUALSERVER_VERSION(false),
VIRTUALSERVER_WEBLIST_ENABLED(true),
VIRTUALSERVER_WELCOMEMESSAGE(true);
private final boolean changeable;
VirtualServerProperty(boolean changeable) {
this.changeable = changeable;
}
@Override
public String getName() {
return name().toLowerCase(Locale.ROOT);
}
@Override
public boolean isChangeable() {
return changeable;
}
}
@@ -0,0 +1,48 @@
package com.github.manevolent.ts3j.api;
/*
* #%L
* TeamSpeak 3 Java API
* %%
* Copyright (C) 2014 Bert De Geyter
* %%
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
* #L%
*/
public enum VirtualServerStatus {
ONLINE("online"),
OFFLINE("offline"),
DEPLOY_RUNNING("deploy running"),
BOOTING_UP("booting up"),
SHUTTING_DOWN("shutting down"),
VIRTUAL_ONLINE("virtual online"),
UNKNOWN("unknown");
private final String name;
VirtualServerStatus(String name) {
this.name = name;
}
public String getName() {
return name;
}
}
@@ -0,0 +1,215 @@
package com.github.manevolent.ts3j.api;
/*
* #%L
* TeamSpeak 3 Java API
* %%
* Copyright (C) 2014 Bert De Geyter
* %%
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
* #L%
*/
import java.util.Collections;
import java.util.Map;
/**
* A wrapper class around a {@link Map}.
* <p>
* We use wrapper classes instead of just passing around plain Maps because
* </p><ul>
* <li>it's more descriptive</li>
* <li>there's no confusion between types (e.g. {@code Client} and {@code Channel})</li>
* <li>we can create getters for the specific use-cases</li>
* <li>we don't have to check for {@code null} each time</li>
* </ul>
*/
public class Wrapper {
public static final Wrapper EMPTY = new Wrapper(Collections.<String, String>emptyMap());
private final Map<String, String> map;
/**
* Creates a new wrapper around the given map.
*
* @param map
* the Map to abstract, cannot be {@code null}
*/
public Wrapper(Map<String, String> map) {
this.map = map;
}
/**
* Gets the map underlying this {@code Wrapper}.
*
* @return the underlying map
*/
public Map<String, String> getMap() {
return map;
}
/**
* Gets a property as a boolean from the underlying map.
* Returns {@code true} if the property exists in the map and its value is {@code "1"}.
*
* @param propertyName
* the name of the property
*
* @return the boolean value of the property or {@code false} if the property doesn't exist
*/
public boolean getBoolean(String propertyName) {
return getInt(propertyName) == 1;
}
/**
* Gets a property as a boolean from the underlying map.
* Returns {@code true} if the property exists in the map and its value is {@code "1"}.
*
* @param property
* the property
*
* @return the boolean value of the property or {@code false} if the property doesn't exist
*/
public boolean getBoolean(Property property) {
return getBoolean(property.getName());
}
/**
* Gets a property as a double from the underlying map.
* If the property doesn't exist in the underlying map, {@code -1.0} is returned.
*
* @param propertyName
* the name of the property
*
* @return the double value of the property or {@code -1.0} if the property doesn't exist
*/
public double getDouble(String propertyName) {
final String value = get(propertyName);
if (value == null || value.isEmpty()) {
return -1D;
}
return Double.valueOf(value);
}
/**
* Gets a property as a double from the underlying map.
* If the property doesn't exist in the underlying map, {@code -1.0} is returned.
*
* @param property
* the property
*
* @return the double value of the property or {@code -1.0} if the property doesn't exist
*/
public double getDouble(Property property) {
return getDouble(property.getName());
}
/**
* Gets a property as a long from the underlying map.
* If the property doesn't exist in the underlying map, {@code -1} is returned.
*
* @param propertyName
* the name of the property
*
* @return the long value of the property or {@code -1} if the property doesn't exist
*/
public long getLong(String propertyName) {
final String value = get(propertyName);
if (value == null || value.isEmpty()) {
return -1L;
}
return Long.parseLong(value);
}
/**
* Gets a property as a long from the underlying map.
* If the property doesn't exist in the underlying map, {@code -1} is returned.
*
* @param property
* the property
*
* @return the long value of the property or {@code -1} if the property doesn't exist
*/
public long getLong(Property property) {
return getLong(property.getName());
}
/**
* Gets a property as an integer from the underlying map.
* If the property doesn't exist in the underlying map, {@code -1} is returned.
*
* @param propertyName
* the name of the property
*
* @return the integer value of the property or {@code -1} if the property doesn't exist
*/
public int getInt(String propertyName) {
final String value = get(propertyName);
if (value == null || value.isEmpty()) {
return -1;
}
return Integer.parseInt(value);
}
/**
* Gets a property as an integer from the underlying map.
* If the property doesn't exist in the underlying map, {@code -1} is returned.
*
* @param property
* the property
*
* @return the integer value of the property or {@code -1} if the property doesn't exist
*/
public int getInt(Property property) {
return getInt(property.getName());
}
/**
* Gets a property as a String from the underlying map.
* If the property doesn't exist in the underlying map, an empty String is returned.
*
* @param propertyName
* the name of the property
*
* @return the String value of the property or an empty String if the property doesn't exist
*/
public String get(String propertyName) {
final String result = map.get(propertyName);
return result != null ? result : "";
}
/**
* Gets a property as a {@code String} from the underlying map.
* If the property doesn't exist in the underlying map, an empty String is returned.
*
* @param property
* the property
*
* @return the String value of the property or an empty String if the property doesn't exist
*/
public String get(Property property) {
return get(property.getName());
}
@Override
public String toString() {
return map.toString();
}
}
@@ -3,6 +3,9 @@ package com.github.manevolent.ts3j.command;
import com.github.manevolent.ts3j.command.parameter.CommandParameter; import com.github.manevolent.ts3j.command.parameter.CommandParameter;
import com.github.manevolent.ts3j.protocol.ProtocolRole; import com.github.manevolent.ts3j.protocol.ProtocolRole;
import java.util.LinkedHashMap;
import java.util.Map;
public interface Command { public interface Command {
/** /**
* Gets the name, or label, of this command. * Gets the name, or label, of this command.
@@ -22,12 +25,14 @@ public interface Command {
*/ */
Iterable<CommandParameter> getParameters(); Iterable<CommandParameter> getParameters();
/** default Map<String, String> toMap() {
* Finds if the command is expected to be responded to with a specific return_code. Map<String, String> map = new LinkedHashMap<>();
* This is handled by supporting protocol handlers, not by the command code itself.
* @return true if the command is expected to support a return_code. for (CommandParameter parameter : getParameters())
*/ map.put(parameter.getName(), parameter.getValue());
default boolean willExpectResponse() { return false; }
return map;
}
void add(CommandParameter parameter); void add(CommandParameter parameter);
@@ -0,0 +1,19 @@
package com.github.manevolent.ts3j.command;
public class CommandException extends Exception {
private final int errorId;
public CommandException(Throwable cause, int errorId) {
super(cause);
this.errorId = errorId;
}
public CommandException(String message, int errorId) {
super(message);
this.errorId = errorId;
}
public int getErrorId() {
return errorId;
}
}
@@ -1,46 +0,0 @@
package com.github.manevolent.ts3j.command;
import com.github.manevolent.ts3j.command.client.ClientChannelListFinishedProcessor;
import com.github.manevolent.ts3j.command.client.ClientChannelListProcessor;
import com.github.manevolent.ts3j.command.client.ClientInitServerProcessor;
import com.github.manevolent.ts3j.command.client.ClientNotifyClientEnterViewProcessor;
import com.github.manevolent.ts3j.protocol.socket.client.AbstractTeamspeakClientSocket;
import com.github.manevolent.ts3j.util.Ts3Debugging;
import java.util.HashMap;
import java.util.Map;
public final class CommandHandler implements CommandProcessor {
private final Map<String, CommandProcessor> commandProcessors = new HashMap<>();
protected CommandHandler() {
}
@Override
public void process(AbstractTeamspeakClientSocket socket, MultiCommand multiCommand)
throws CommandProcessException {
CommandProcessor processor = commandProcessors.get(multiCommand.getName().toLowerCase());
if (processor != null)
processor.process(socket, multiCommand);
}
@Override
public void process(AbstractTeamspeakClientSocket socket, SingleCommand command)
throws CommandProcessException {
CommandProcessor processor = commandProcessors.get(command.getName().toLowerCase());
if (processor != null)
processor.process(socket, command);
}
public static CommandHandler createLocalClientHandler() {
CommandHandler handler = new CommandHandler();
handler.commandProcessors.put("initserver", new ClientInitServerProcessor());
handler.commandProcessors.put("channellist", new ClientChannelListProcessor());
handler.commandProcessors.put("notifycliententerview", new ClientNotifyClientEnterViewProcessor());
handler.commandProcessors.put("channellistfinished", new ClientChannelListFinishedProcessor());
return handler;
}
}
@@ -9,7 +9,6 @@ public interface CommandProcessor {
for (SingleCommand singleCommand : multiCommand.simplify()) process(client, singleCommand); for (SingleCommand singleCommand : multiCommand.simplify()) process(client, singleCommand);
} }
default void process(AbstractTeamspeakClientSocket client, default void process(AbstractTeamspeakClientSocket client,
SingleCommand singleCommand) SingleCommand singleCommand)
throws CommandProcessException { } throws CommandProcessException { }
@@ -68,19 +68,25 @@ public class MultiCommand implements Command {
boolean first = i == 0; boolean first = i == 0;
boolean last = i == singleCommands.size() - 1; boolean last = i == singleCommands.size() - 1;
if (!first) builder.append("\\p"); if (!first) builder.append("|");
for (CommandParameter parameter : singleCommands.get(i).getParameters()) { for (CommandParameter parameter : singleCommands.get(i).getParameters()) {
builder.append(" " + (parameter.toString()).trim()); builder.append(" " + (parameter.toString()).trim());
} }
} }
return builder.toString(); return builder.toString().trim();
} }
public static MultiCommand parse(ProtocolRole role, String text) { public static MultiCommand parse(ProtocolRole role, String text) {
String[] labelAndText = text.split(" ", 2); String[] labelAndText = text.split(" ", 2);
String label = labelAndText[0].toLowerCase(); String label = labelAndText[0].toLowerCase();
if (label.contains("=")) {
label = "";
labelAndText[1] = text; // No command label!
}
String[] commands = labelAndText.length > 1 ? labelAndText[1].split("\\|") : new String[0]; String[] commands = labelAndText.length > 1 ? labelAndText[1].split("\\|") : new String[0];
List<SingleCommand> singleCommands = new LinkedList<>(); List<SingleCommand> singleCommands = new LinkedList<>();
@@ -109,7 +115,15 @@ public class MultiCommand implements Command {
} }
} }
singleCommands.add(new SingleCommand(label, role, parameterList)); // Replace static variables
SingleCommand command = new SingleCommand(label, role, parameterList);
if (singleCommands.size() > 0) {
for (CommandParameter parameter : singleCommands.get(0).getParameters())
if (!command.has(parameter.getName())) command.add(parameter);
}
singleCommands.add(command);
} }
return new MultiCommand(label, role, singleCommands); return new MultiCommand(label, role, singleCommands);
@@ -1,20 +0,0 @@
package com.github.manevolent.ts3j.command.client;
import com.github.manevolent.ts3j.command.CommandProcessException;
import com.github.manevolent.ts3j.command.CommandProcessor;
import com.github.manevolent.ts3j.command.MultiCommand;
import com.github.manevolent.ts3j.protocol.client.ClientConnectionState;
import com.github.manevolent.ts3j.protocol.socket.client.AbstractTeamspeakClientSocket;
public class ClientChannelListFinishedProcessor implements CommandProcessor {
@Override
public void process(AbstractTeamspeakClientSocket client,
MultiCommand command) throws CommandProcessException {
if (client.getState() == ClientConnectionState.RETRIEVING_DATA)
try {
client.setState(ClientConnectionState.CONNECTED);
} catch (Exception e) {
throw new CommandProcessException(e);
}
}
}
@@ -1,45 +0,0 @@
package com.github.manevolent.ts3j.command.client;
import com.github.manevolent.ts3j.command.CommandProcessException;
import com.github.manevolent.ts3j.command.CommandProcessor;
import com.github.manevolent.ts3j.command.SingleCommand;
import com.github.manevolent.ts3j.enums.CodecType;
import com.github.manevolent.ts3j.model.Channel;
import com.github.manevolent.ts3j.protocol.socket.client.AbstractTeamspeakClientSocket;
public class ClientChannelListProcessor implements CommandProcessor {
@Override
public void process(AbstractTeamspeakClientSocket client,
SingleCommand command) throws CommandProcessException {
int cid = Integer.parseInt(command.get("cid").getValue());
Channel channel = client.getVirtualServer().getChannelById(cid);
if (channel == null)
channel = new Channel(
client.getVirtualServer(), Integer.parseInt(command.get("cid").getValue())
);
channel.setName(command.get("channel_name").getValue());
channel.setCodec(CodecType.fromId(Integer.parseInt(command.get("channel_codec").getValue())));
channel.setCodecQuality(Integer.parseInt(command.get("channel_codec_quality").getValue()));
channel.setMaxClients(Integer.parseInt(command.get("channel_maxclients").getValue()));
channel.setMaxFamilyClients(Integer.parseInt(command.get("channel_maxfamilyclients").getValue()));
channel.setOrder(Integer.parseInt(command.get("channel_order").getValue()));
channel.setPermanent(command.get("channel_flag_permanent").getValue().equals("1"));
channel.setSemiPermanent(command.get("channel_flag_semi_permanent").getValue().equals("1"));
channel.setServerDefault(command.get("channel_flag_default").getValue().equals("1"));
channel.setHasPassword(command.get("channel_flag_password").getValue().equals("1"));
channel.setCodecLatencyFactor(command.get("channel_codec_latency_factor").getValue().equals("1"));
channel.setUnencrypted(command.get("channel_codec_is_unencrypted").getValue().equals("1"));
channel.setDeleteDelay(Integer.parseInt(command.get("channel_delete_delay").getValue()));
channel.setUnlimited(command.get("channel_flag_maxclients_unlimited").getValue().equals("1"));
channel.setFamilyUnlimited(command.get("channel_flag_maxfamilyclients_unlimited").getValue().equals("1"));
channel.setInheritingMaxfamilyUnlimited(command.get("channel_flag_maxfamilyclients_inherited").getValue().equals("1"));
channel.setNeededTalkPower(Integer.parseInt(command.get("channel_needed_talk_power").getValue()));
channel.setForcingSilence(command.get("channel_forced_silence").getValue().equals("1"));
channel.setIconId(Integer.parseInt(command.get("channel_icon_id").getValue()));
channel.setPrivated(command.get("channel_flag_private").getValue().equals("1"));
client.getVirtualServer().updateChannel(channel);
}
}
@@ -1,47 +0,0 @@
package com.github.manevolent.ts3j.command.client;
import com.github.manevolent.ts3j.command.CommandProcessException;
import com.github.manevolent.ts3j.command.CommandProcessor;
import com.github.manevolent.ts3j.command.MultiCommand;
import com.github.manevolent.ts3j.command.SingleCommand;
import com.github.manevolent.ts3j.enums.HostBannerMode;
import com.github.manevolent.ts3j.enums.HostMessageMode;
import com.github.manevolent.ts3j.enums.VoiceEncryptionMode;
import com.github.manevolent.ts3j.model.VirtualServer;
import com.github.manevolent.ts3j.protocol.client.ClientConnectionState;
import com.github.manevolent.ts3j.protocol.socket.client.AbstractTeamspeakClientSocket;
public class ClientInitServerProcessor implements CommandProcessor {
@Override
public void process(AbstractTeamspeakClientSocket client,
MultiCommand multiCommand) throws CommandProcessException {
SingleCommand command = multiCommand.simplifyOne();
VirtualServer server = new VirtualServer();
server.setName(command.get("virtualserver_name").getValue());
server.setWelcomeMessage(command.get("virtualserver_welcomemessage").getValue());
server.setPlatform(command.get("virtualserver_platform").getValue());
server.setVersion(command.get("virtualserver_version").getValue());
server.setMaxClients(Integer.parseInt(command.get("virtualserver_maxclients").getValue()));
server.setCreated(Long.parseLong(command.get("virtualserver_created").getValue()));
server.setEncryptionMode(VoiceEncryptionMode.fromId(Integer.parseInt(command.get("virtualserver_codec_encryption_mode").getValue())));
server.setHostMessageMode(HostMessageMode.fromId(Integer.parseInt(command.get("virtualserver_hostmessage_mode").getValue())));
server.setDefaultGroupId(Integer.parseInt(command.get("virtualserver_default_server_group").getValue()));
server.setDefaultChannelGroupId(Integer.parseInt(command.get("virtualserver_default_channel_group").getValue()));
server.setHostbannerUrl(command.get("virtualserver_hostbanner_gfx_url").getValue());
server.setPrioritySpeakerDimmModifier(Double.parseDouble(command.get("virtualserver_priority_speaker_dimm_modificator").getValue()));
server.setId(Integer.parseInt(command.get("virtualserver_id").getValue()));
server.setNamePhonetic(command.get("virtualserver_name_phonetic").getValue());
server.setIconId(Long.parseLong(command.get("virtualserver_icon_id").getValue()));
server.setServerIp(command.get("virtualserver_ip").getValue());
server.setAskForPriviledgeKey(Integer.parseInt(command.get("virtualserver_ask_for_privilegekey").getValue()) == 1);
server.setHostBannerMode(HostBannerMode.fromId(Integer.parseInt(command.get("virtualserver_hostbanner_mode").getValue())));
server.setDefaultTempChannelDeleteDelay(Integer.parseInt(command.get("virtualserver_channel_temp_delete_delay_default").getValue()));
server.setNickname(command.get("virtualserver_nickname").getValue());
client.setVirtualServer(server);
client.setClientId(Integer.parseInt(command.get("aclid").getValue()));
}
}
@@ -1,71 +0,0 @@
package com.github.manevolent.ts3j.command.client;
import com.github.manevolent.ts3j.command.CommandProcessException;
import com.github.manevolent.ts3j.command.CommandProcessor;
import com.github.manevolent.ts3j.command.SingleCommand;
import com.github.manevolent.ts3j.enums.ClientType;
import com.github.manevolent.ts3j.identity.Uid;
import com.github.manevolent.ts3j.model.Client;
import com.github.manevolent.ts3j.protocol.socket.client.AbstractTeamspeakClientSocket;
import java.util.Arrays;
import java.util.stream.Collectors;
public class ClientNotifyClientEnterViewProcessor implements CommandProcessor {
@Override
public void process(AbstractTeamspeakClientSocket client,
SingleCommand command) throws CommandProcessException {
int clientId = Integer.parseInt(command.get("clid").getValue());
Client newClient = client.getVirtualServer().getClientById(clientId);
if (newClient == null)
newClient = new Client(
Integer.parseInt(command.get("clid").getValue()),
Integer.parseInt(command.get("client_database_id").getValue()),
client.getVirtualServer(),
new Uid(command.get("client_unique_identifier").getValue()),
ClientType.fromId(Integer.parseInt(command.get("client_type").getValue())));
newClient.setNickname(command.get("client_nickname").getValue());
newClient.setInputMuted(command.get("client_input_muted").getValue().equals("1"));
newClient.setOutputMuted(command.get("client_output_muted").getValue().equals("1"));
newClient.setInputHardware(command.get("client_input_hardware").getValue().equals("1"));
newClient.setOutputHardware(command.get("client_output_hardware").getValue().equals("1"));
newClient.setRecording(command.get("client_is_recording").getValue().equals("1"));
newClient.setChannelGroupId(Integer.parseInt(command.get("client_channel_group_id").getValue()));
newClient.setServerGroupIds(
Arrays.stream(command.get("client_servergroups").getValue().split(",")).map(
Integer::parseInt
).collect(Collectors.toList())
);
newClient.setAway(command.get("client_away").getValue().equals("1"));
newClient.setTalkPower(Integer.parseInt(command.get("client_talk_power").getValue()));
newClient.setTalkRequested(command.get("client_talk_request").getValue().equals("1"));
newClient.setTalker(command.get("client_is_talker").getValue().equals("1"));
newClient.setPrioritySpeaker(command.get("client_is_priority_speaker").getValue().equals("1"));
newClient.setUnreadMessages(Integer.parseInt(command.get("client_unread_messages").getValue()));
newClient.setNeededServerQueryViewPower(Integer.parseInt(command.get("client_needed_serverquery_view_power").getValue()));
newClient.setIconId(Integer.parseInt(command.get("client_icon_id").getValue()));
newClient.setChannelCommander(command.get("client_is_channel_commander").getValue().equals("1"));
newClient.setCountry(command.get("client_country").getValue());
newClient.setInheritedChannelGroupChannelId(Integer.parseInt(command.get("client_channel_group_inherited_channel_id").getValue()));
client.getVirtualServer().updateConnectedClient(newClient);
}
}
@@ -0,0 +1,59 @@
package com.github.manevolent.ts3j.command.response;
import com.github.manevolent.ts3j.command.MultiCommand;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;
import java.util.function.Function;
public abstract class AbstractCommandResponse<T> implements CommandResponse<T> {
private final Function<Iterable<MultiCommand>, T> processor;
private CompletableFuture<Iterable<MultiCommand>> future =
new CompletableFuture<>();
public AbstractCommandResponse(Function<Iterable<MultiCommand>, T> processor) {
this.processor = processor;
}
/**
* Completes the command without any post-mapping processing, lowering overhead.
*/
@Override
public void complete()
throws ExecutionException, InterruptedException {
future.get();
}
@Override
public T get(long timeoutMillis)
throws TimeoutException, ExecutionException, InterruptedException {
return map(future.get(timeoutMillis, TimeUnit.MILLISECONDS));
}
@Override
public T get()
throws ExecutionException, InterruptedException {
return map(future.get());
}
protected void completeSuccess(Iterable<MultiCommand> commands) {
future.complete(commands);
}
protected void completeFailure(Throwable thrown) {
future.completeExceptionally(thrown);
}
/**
* Maps the result of the command. Executes post-retrieval on the end-user thread, a nifty trick to to increase
* parallel execution speed and handling.
* @param result result to process.
* @return mapped result.
*/
private T map(Iterable<MultiCommand> result) {
return processor.apply(result);
}
}
@@ -1,76 +1,16 @@
package com.github.manevolent.ts3j.command.response; package com.github.manevolent.ts3j.command.response;
import com.github.manevolent.ts3j.command.Command; import java.util.concurrent.ExecutionException;
import com.github.manevolent.ts3j.command.MultiCommand;
import java.util.concurrent.TimeoutException; import java.util.concurrent.TimeoutException;
public class CommandResponse { public interface CommandResponse<T> {
private final Object returnLock = new Object();
private final Command command;
private final int returnCode;
private long dispatchedTime; default void complete()
private MultiCommand returnedCommand; throws ExecutionException, InterruptedException {
get();
public CommandResponse(Command command, int returnCode) {
this.command = command;
this.returnCode = returnCode;
} }
public Command getCommand() { T get(long timeoutMillis) throws TimeoutException, ExecutionException, InterruptedException;
return command; T get() throws ExecutionException, InterruptedException;
}
public int getReturnCode() {
return returnCode;
}
public MultiCommand getResponse()
throws InterruptedException, TimeoutException {
return getResponse(Integer.MAX_VALUE);
}
public MultiCommand getResponse(int millis)
throws InterruptedException, TimeoutException {
if (returnCode < 0) return null;
synchronized (returnLock) {
long waited, toWait;
while (getReturnedCommand() == null) {
waited = System.currentTimeMillis() - getDispatchedTime();
toWait = millis - waited;
if (toWait <= 0) throw new TimeoutException();
returnLock.wait(toWait);
}
return getReturnedCommand();
}
}
public long getDispatchedTime() {
return dispatchedTime;
}
public void setDispatchedTime(long dispatchedTime) {
this.dispatchedTime = dispatchedTime;
}
public MultiCommand getReturnedCommand() {
return returnedCommand;
}
public void setReturnedCommand(MultiCommand returnedCommand) {
synchronized (returnLock) {
if (this.returnCode < 0 ) throw new IllegalArgumentException("not expecting return command");
if (this.returnedCommand != null) throw new IllegalArgumentException("already set return command");
this.returnedCommand = returnedCommand;
returnLock.notifyAll();
}
}
} }
@@ -1,29 +0,0 @@
package com.github.manevolent.ts3j.enums;
public enum ClientListOptions {
UID(1 << 0),
AWAY(1 << 1),
VOICE(1 << 2),
TIMES(1 << 3),
GROUPS(1 << 4),
INFO(1 << 5),
ICON(1 << 6),
COUNTRY(1 << 7);
private final int index;
ClientListOptions(int index) {
this.index = index;
}
public int getIndex() {
return index;
}
public static ClientListOptions fromId(int index) {
for (ClientListOptions value : values())
if (value.getIndex() == index) return value;
throw new IllegalArgumentException("invalid index: " + index);
}
}
@@ -1,23 +0,0 @@
package com.github.manevolent.ts3j.enums;
public enum ClientType {
FULL(0),
QUERY(1);
private final int index;
ClientType(int index) {
this.index = index;
}
public int getIndex() {
return index;
}
public static ClientType fromId(int index) {
for (ClientType value : values())
if (value.getIndex() == index) return value;
throw new IllegalArgumentException("invalid index: " + index);
}
}
@@ -1,7 +0,0 @@
package com.github.manevolent.ts3j.enums;
public enum CommandPartType {
SINGLE_PARAMETER,
MULTI_PAREMTER,
OPTION;
}
@@ -1,35 +0,0 @@
package com.github.manevolent.ts3j.enums;
public enum DisconnectReason {
USER_ACTION(0),
USER_OR_CHANNEL_MOVED(1),
SUBSCRIPTION_CHANGED(2),
TIMEOUT(3),
KICKED_FROM_CHANNEL(4),
KICKED_FROM_SERVER(5),
BANNED(6),
SERVER_STOPPED(7),
LEFT_SERVER(8),
CHANNEL_UPDATED(9),
SERVER_OR_CHANNEL_EDITED(10),
SERVER_SHUTDOWN(11)
;
private final int index;
DisconnectReason(int index) {
this.index = index;
}
public int getIndex() {
return index;
}
public static DisconnectReason fromId(int index) {
for (DisconnectReason value : values())
if (value.getIndex() == index) return value;
throw new IllegalArgumentException("invalid index: " + index);
}
}
@@ -1,29 +0,0 @@
package com.github.manevolent.ts3j.enums;
public enum GroupNamingMode {
UID(1 << 0),
AWAY(1 << 1),
VOICE(1 << 2),
TIMES(1 << 3),
GROUPS(1 << 4),
INFO(1 << 5),
ICON(1 << 6),
COUNTRY(1 << 7);
private final int index;
GroupNamingMode(int index) {
this.index = index;
}
public int getIndex() {
return index;
}
public static GroupNamingMode fromId(int index) {
for (GroupNamingMode value : values())
if (value.getIndex() == index) return value;
throw new IllegalArgumentException("invalid index: " + index);
}
}
@@ -1,26 +0,0 @@
package com.github.manevolent.ts3j.enums;
public enum GroupType {
TEMPLATE(0),
REGULAR(1),
QUERY(2)
;
private final int index;
GroupType(int index) {
this.index = index;
}
public int getIndex() {
return index;
}
public static GroupType fromId(int index) {
for (GroupType value : values())
if (value.getIndex() == index) return value;
throw new IllegalArgumentException("invalid index: " + index);
}
}
@@ -1,29 +0,0 @@
package com.github.manevolent.ts3j.enums;
public enum GroupWhisperType {
ALL_CHANNELS(0),
CURRENT_CHANNEL(1),
ALL_PARENT_CHANNEL(2),
CHANNEL_FAMILY(3),
COMPLETE_CHANNEL_FAMILY(4),
SUBCHANNELS(5)
;
private final int index;
GroupWhisperType(int index) {
this.index = index;
}
public int getIndex() {
return index;
}
public static GroupWhisperType fromId(int index) {
for (GroupWhisperType value : values())
if (value.getIndex() == index) return value;
throw new IllegalArgumentException("invalid index: " + index);
}
}
@@ -1,26 +0,0 @@
package com.github.manevolent.ts3j.enums;
public enum HostBannerMode {
NO_ADJUST(0),
IGNORE_ASPECT_RATIO(1),
KEEP_ASPECT(2)
;
private final int index;
HostBannerMode(int index) {
this.index = index;
}
public int getIndex() {
return index;
}
public static HostBannerMode fromId(int index) {
for (HostBannerMode value : values())
if (value.getIndex() == index) return value;
throw new IllegalArgumentException("invalid index: " + index);
}
}
@@ -1,27 +0,0 @@
package com.github.manevolent.ts3j.enums;
public enum HostMessageMode {
NONE(0),
LOG(1),
MODAL(2),
MODAL_QUIT(3)
;
private final int index;
HostMessageMode(int index) {
this.index = index;
}
public int getIndex() {
return index;
}
public static HostMessageMode fromId(int index) {
for (HostMessageMode value : values())
if (value.getIndex() == index) return value;
throw new IllegalArgumentException("invalid index: " + index);
}
}
@@ -1,25 +0,0 @@
package com.github.manevolent.ts3j.enums;
public enum KickIdentifier {
CHANNEL(4),
SERVER(5)
;
private final int index;
KickIdentifier(int index) {
this.index = index;
}
public int getIndex() {
return index;
}
public static KickIdentifier fromId(int index) {
for (KickIdentifier value : values())
if (value.getIndex() == index) return value;
throw new IllegalArgumentException("invalid index: " + index);
}
}
@@ -1,27 +0,0 @@
package com.github.manevolent.ts3j.enums;
public enum LogLevel {
ERROR(1),
WARNING(2),
DEBUG(3),
INFO(4)
;
private final int index;
LogLevel(int index) {
this.index = index;
}
public int getIndex() {
return index;
}
public static LogLevel fromId(int index) {
for (LogLevel value : values())
if (value.getIndex() == index) return value;
throw new IllegalArgumentException("invalid index: " + index);
}
}
@@ -1,28 +0,0 @@
package com.github.manevolent.ts3j.enums;
public enum PermissionGroupType {
SERVER_GROUP(0),
GLOBAL_CLIENT(1),
CHANNEL(2),
CHANNEL_GROUP(3),
CHANNEL_CLIENT(4)
;
private final int index;
PermissionGroupType(int index) {
this.index = index;
}
public int getIndex() {
return index;
}
public static PermissionGroupType fromId(int index) {
for (PermissionGroupType value : values())
if (value.getIndex() == index) return value;
throw new IllegalArgumentException("invalid index: " + index);
}
}
@@ -1,27 +0,0 @@
package com.github.manevolent.ts3j.enums;
public enum PluginTargetMode {
CURRENT_CHANNEL(0),
SERVER(1),
CLIENT(2),
CURRENT_CHANNEL_SUBSCRIBED_CLIENTS(3)
;
private final int index;
PluginTargetMode(int index) {
this.index = index;
}
public int getIndex() {
return index;
}
public static PluginTargetMode fromId(int index) {
for (PluginTargetMode value : values())
if (value.getIndex() == index) return value;
throw new IllegalArgumentException("invalid index: " + index);
}
}
@@ -1,25 +0,0 @@
package com.github.manevolent.ts3j.enums;
public enum PriviledgeTokenType {
SERVER_GROUP(0),
CHANNEL_GROUP(1)
;
private final int index;
PriviledgeTokenType(int index) {
this.index = index;
}
public int getIndex() {
return index;
}
public static PriviledgeTokenType fromId(int index) {
for (PriviledgeTokenType value : values())
if (value.getIndex() == index) return value;
throw new IllegalArgumentException("invalid index: " + index);
}
}
@@ -1,26 +0,0 @@
package com.github.manevolent.ts3j.enums;
public enum TextMessageTargetMode {
PRIVATE(1),
CHANNEL(2),
SERVER(3)
;
private final int index;
TextMessageTargetMode(int index) {
this.index = index;
}
public int getIndex() {
return index;
}
public static TextMessageTargetMode fromId(int index) {
for (TextMessageTargetMode value : values())
if (value.getIndex() == index) return value;
throw new IllegalArgumentException("invalid index: " + index);
}
}
@@ -1,26 +0,0 @@
package com.github.manevolent.ts3j.enums;
public enum VoiceEncryptionMode {
INDIVIDUAL(0),
DISABLED(1),
ENABLED(2)
;
private final int index;
VoiceEncryptionMode(int index) {
this.index = index;
}
public int getIndex() {
return index;
}
public static VoiceEncryptionMode fromId(int index) {
for (VoiceEncryptionMode value : values())
if (value.getIndex() == index) return value;
throw new IllegalArgumentException("invalid index: " + index);
}
}
@@ -0,0 +1,131 @@
package com.github.manevolent.ts3j.event;
/*
* #%L
* TeamSpeak 3 Java API
* %%
* Copyright (C) 2014 - 2015 Bert De Geyter
* %%
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
* #L%
*/
import com.github.manevolent.ts3j.api.Wrapper;
import java.util.Collections;
import java.util.Map;
public abstract class BaseEvent extends Wrapper implements TS3Event {
protected BaseEvent(Map<String, String> map) {
super(Collections.unmodifiableMap(map));
}
/**
* Gets the ID of the client who caused this event to happen.
* <p>
* Because not all events are caused by clients, not all events have an invoker.<br>
* Most importantly, client events (i.e. {@link ClientJoinEvent}, {@link ClientLeaveEvent}
* {@link ClientMovedEvent}) do <b>not</b> have an invoker if a client joined,
* quit or changed channels themselves. These values are only present if another client
* caused the event to happen by moving, kicking or banning a client.
* </p><p>
* If the event response does not contain an invoker, this method will return {@code -1}.
* </p>
*
* @return the client ID of the invoker or {@code -1} if the event does not contain an invoker
*/
public int getInvokerId() {
return getInt("invokerid");
}
/**
* Gets the nickname of the client who caused this event to happen.
* <p>
* Because not all events are caused by clients, not all events have an invoker.<br>
* Most importantly, client events (i.e. {@link ClientJoinEvent}, {@link ClientLeaveEvent}
* {@link ClientMovedEvent}) do <b>not</b> have an invoker if a client joined,
* quit or changed channels themselves. These values are only present if another client
* caused the event to happen by moving, kicking or banning a client.
* </p><p>
* If the event response does not contain an invoker, this method will return an empty string.
* </p>
*
* @return the nickname of the invoker or an empty string if the event does not contain an invoker
*/
public String getInvokerName() {
return get("invokername");
}
/**
* Gets the unique identifier of the client who caused this event to happen.
* <p>
* Because not all events are caused by clients, not all events have an invoker.<br>
* Most importantly, client events (i.e. {@link ClientJoinEvent}, {@link ClientLeaveEvent}
* {@link ClientMovedEvent}) do <b>not</b> have an invoker if a client joined,
* quit or changed channels themselves. These values are only present if another client
* caused the event to happen by moving, kicking or banning a client.
* </p><p>
* If the event response does not contain an invoker, this method will return an empty string.
* </p>
*
* @return the unique ID the invoker or an empty string if the event does not contain an invoker
*/
public String getInvokerUniqueId() {
return get("invokeruid");
}
/**
* Gets the reason ID of the cause of this event.
* <p>
* Here's an incomplete list of known reason IDs:
* </p>
* <table summary="Incomplete list of known reason IDs">
* <tr><th>ID</th><th>Description</th></tr>
* <tr><td>-1</td><td>No reason present</td></tr>
* <tr><td>0</td><td>No external cause</td></tr>
* <tr><td>1</td><td>Client was moved (by other client / by creating a new channel)</td></tr>
* <tr><td>3</td><td>Client timed out</td></tr>
* <tr><td>4</td><td>Client kicked from a channel or channel deleted</td></tr>
* <tr><td>5</td><td>Client kicked from the server</td></tr>
* <tr><td>6</td><td>Client banned from the server</td></tr>
* <tr><td>8</td><td>Client left the server (no external cause)</td></tr>
* <tr><td>10</td><td>Virtual server or channel edited</td></tr>
* <tr><td>11</td><td>Server shut down</td></tr>
* </table>
*
* @return the reason ID for this event
*/
public int getReasonId() {
return getInt("reasonid");
}
/**
* Gets the reason for this event.
* This field is rarely present, even if the reason ID is non-zero.
* <p>
* In case of a client getting kicked or banned, this will return the user-provided reason.
* </p>
*
* @return the reason for this event or an empty string if no reason message is present
*/
public String getReasonMessage() {
return get("reasonmsg");
}
}
@@ -0,0 +1,47 @@
package com.github.manevolent.ts3j.event;
/*
* #%L
* TeamSpeak 3 Java API
* %%
* Copyright (C) 2014 Bert De Geyter
* %%
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
* #L%
*/
import com.github.manevolent.ts3j.api.ChannelProperty;
import java.util.Map;
public class ChannelCreateEvent extends BaseEvent {
public ChannelCreateEvent(Map<String, String> map) {
super(map);
}
public int getChannelId() {
return getInt(ChannelProperty.CID);
}
@Override
public void fire(TS3Listener listener) {
listener.onChannelCreate(this);
}
}
@@ -0,0 +1,47 @@
package com.github.manevolent.ts3j.event;
/*
* #%L
* TeamSpeak 3 Java API
* %%
* Copyright (C) 2014 Bert De Geyter
* %%
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
* #L%
*/
import com.github.manevolent.ts3j.api.ChannelProperty;
import java.util.Map;
public class ChannelDeletedEvent extends BaseEvent {
public ChannelDeletedEvent(Map<String, String> map) {
super(map);
}
public int getChannelId() {
return getInt(ChannelProperty.CID);
}
@Override
public void fire(TS3Listener listener) {
listener.onChannelDeleted(this);
}
}
@@ -0,0 +1,47 @@
package com.github.manevolent.ts3j.event;
/*
* #%L
* TeamSpeak 3 Java API
* %%
* Copyright (C) 2014 Bert De Geyter
* %%
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
* #L%
*/
import com.github.manevolent.ts3j.api.ChannelProperty;
import java.util.Map;
public class ChannelDescriptionEditedEvent extends BaseEvent {
public ChannelDescriptionEditedEvent(Map<String, String> map) {
super(map);
}
public int getChannelId() {
return getInt(ChannelProperty.CID);
}
@Override
public void fire(TS3Listener listener) {
listener.onChannelDescriptionChanged(this);
}
}
@@ -0,0 +1,47 @@
package com.github.manevolent.ts3j.event;
/*
* #%L
* TeamSpeak 3 Java API
* %%
* Copyright (C) 2014 Bert De Geyter
* %%
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
* #L%
*/
import com.github.manevolent.ts3j.api.ChannelProperty;
import java.util.Map;
public class ChannelEditedEvent extends BaseEvent {
public ChannelEditedEvent(Map<String, String> map) {
super(map);
}
public int getChannelId() {
return getInt(ChannelProperty.CID);
}
@Override
public void fire(TS3Listener listener) {
listener.onChannelEdit(this);
}
}
@@ -0,0 +1,40 @@
package com.github.manevolent.ts3j.event;
/*
* #%L
* TeamSpeak 3 Java API
* %%
* Copyright (C) 2014 Bert De Geyter
* %%
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
* #L%
*/
import java.util.Map;
public class ChannelGroupListEvent extends BaseEvent {
protected ChannelGroupListEvent(Map<String, String> map) {
super(map);
}
@Override
public void fire(TS3Listener listener) {
listener.onChannelGroupList(this);
}
}
@@ -0,0 +1,55 @@
package com.github.manevolent.ts3j.event;
/*
* #%L
* TeamSpeak 3 Java API
* %%
* Copyright (C) 2014 Bert De Geyter
* %%
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
* #L%
*/
import com.github.manevolent.ts3j.api.ChannelProperty;
import java.util.Map;
public class ChannelMovedEvent extends BaseEvent {
public ChannelMovedEvent(Map<String, String> map) {
super(map);
}
public int getChannelId() {
return getInt(ChannelProperty.CID);
}
public int getChannelParentId() {
return getInt(ChannelProperty.CPID);
}
public int getChannelOrder() {
return getInt(ChannelProperty.CHANNEL_ORDER);
}
@Override
public void fire(TS3Listener listener) {
listener.onChannelMoved(this);
}
}
@@ -0,0 +1,47 @@
package com.github.manevolent.ts3j.event;
/*
* #%L
* TeamSpeak 3 Java API
* %%
* Copyright (C) 2014 Bert De Geyter
* %%
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
* #L%
*/
import com.github.manevolent.ts3j.api.ChannelProperty;
import java.util.Map;
public class ChannelPasswordChangedEvent extends BaseEvent {
public ChannelPasswordChangedEvent(Map<String, String> map) {
super(map);
}
public int getChannelId() {
return getInt(ChannelProperty.CID);
}
@Override
public void fire(TS3Listener listener) {
listener.onChannelPasswordChanged(this);
}
}
@@ -0,0 +1,179 @@
package com.github.manevolent.ts3j.event;
/*
* #%L
* TeamSpeak 3 Java API
* %%
* Copyright (C) 2014 Bert De Geyter
* %%
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
* #L%
*/
import com.github.manevolent.ts3j.api.ClientProperty;
import java.util.Map;
public class ClientJoinEvent extends BaseEvent {
public ClientJoinEvent(Map<String, String> map) {
super(map);
}
public int getClientFromId() {
return getInt("cfid");
}
public int getClientTargetId() {
return getInt("ctid");
}
public int getClientId() {
return getInt("clid");
}
public String getUniqueClientIdentifier() {
return get(ClientProperty.CLIENT_UNIQUE_IDENTIFIER);
}
public String getClientNickname() {
return get(ClientProperty.CLIENT_NICKNAME);
}
public boolean isClientInputMuted() {
return getBoolean(ClientProperty.CLIENT_INPUT_MUTED);
}
public boolean isClientOutputMuted() {
return getBoolean(ClientProperty.CLIENT_OUTPUT_MUTED);
}
public boolean isClientOutputOnlyMuted() {
return getBoolean(ClientProperty.CLIENT_OUTPUTONLY_MUTED);
}
public boolean isClientUsingHardwareInput() {
return getBoolean(ClientProperty.CLIENT_INPUT_HARDWARE);
}
public boolean isClientUsingHardwareOutput() {
return getBoolean(ClientProperty.CLIENT_OUTPUT_HARDWARE);
}
public String getClientMetadata() {
return get(ClientProperty.CLIENT_META_DATA);
}
public boolean isClientRecording() {
return getBoolean(ClientProperty.CLIENT_IS_RECORDING);
}
public int getClientDatabaseId() {
return getInt(ClientProperty.CLIENT_DATABASE_ID);
}
public int getClientChannelGroupId() {
return getInt(ClientProperty.CLIENT_CHANNEL_GROUP_ID);
}
public int getAmountOfServerGroups() {
//getInt was turning the String 1,2,3,.. to a int which wasn't right.
//Now it gets the Amount even if the ID is <=10
String[] split = get(ClientProperty.CLIENT_SERVERGROUPS).split(",");
return split.length;
}
public String getClientServerGroups() {
//getClientServerGroups returns a string containing the server group ID for example 1,2,3,...
return get(ClientProperty.CLIENT_SERVERGROUPS);
}
public boolean isClientAway() {
return getBoolean(ClientProperty.CLIENT_AWAY);
}
public String getClientAwayMessage() {
return get(ClientProperty.CLIENT_AWAY_MESSAGE);
}
public int getClientType() {
return getInt(ClientProperty.CLIENT_TYPE);
}
public String getClientFlagAvatarId() {
return get(ClientProperty.CLIENT_FLAG_AVATAR);
}
public int getClientTalkPower() {
return getInt(ClientProperty.CLIENT_TALK_POWER);
}
public boolean isClientRequestingToTalk() {
return getBoolean(ClientProperty.CLIENT_TALK_REQUEST);
}
public String getClientTalkRequestMessage() {
return get(ClientProperty.CLIENT_TALK_REQUEST_MSG);
}
public String getClientDescription() {
return get(ClientProperty.CLIENT_DESCRIPTION);
}
public boolean isClientTalking() {
return getBoolean(ClientProperty.CLIENT_IS_TALKER);
}
public boolean isClientPrioritySpeaker() {
return getBoolean(ClientProperty.CLIENT_IS_PRIORITY_SPEAKER);
}
public int getClientUnreadMessages() {
return getInt(ClientProperty.CLIENT_UNREAD_MESSAGES);
}
public String getClientPhoneticNickname() {
return get(ClientProperty.CLIENT_NICKNAME_PHONETIC);
}
public int getClientNeededServerQueryViewPower() {
return getInt(ClientProperty.CLIENT_NEEDED_SERVERQUERY_VIEW_POWER);
}
public long getClientIconId() {
return getLong(ClientProperty.CLIENT_ICON_ID);
}
public boolean isClientChannelCommander() {
return getBoolean(ClientProperty.CLIENT_IS_CHANNEL_COMMANDER);
}
public String getClientCountry() {
return get(ClientProperty.CLIENT_COUNTRY);
}
public int getClientInheritedChannelGroupId() {
return getInt(ClientProperty.CLIENT_CHANNEL_GROUP_INHERITED_CHANNEL_ID);
}
@Override
public void fire(TS3Listener listener) {
listener.onClientJoin(this);
}
}
@@ -0,0 +1,53 @@
package com.github.manevolent.ts3j.event;
/*
* #%L
* TeamSpeak 3 Java API
* %%
* Copyright (C) 2014 Bert De Geyter
* %%
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
* #L%
*/
import java.util.Map;
public class ClientLeaveEvent extends BaseEvent {
public ClientLeaveEvent(Map<String, String> map) {
super(map);
}
public int getClientFromId() {
return getInt("cfid");
}
public int getClientTargetId() {
return getInt("ctid");
}
public int getClientId() {
return getInt("clid");
}
@Override
public void fire(TS3Listener listener) {
listener.onClientLeave(this);
}
}
@@ -0,0 +1,56 @@
package com.github.manevolent.ts3j.event;
/*
* #%L
* TeamSpeak 3 Java API
* %%
* Copyright (C) 2014 Bert De Geyter
* %%
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
* #L%
*/
import java.util.Map;
public class ClientMovedEvent extends BaseEvent {
public ClientMovedEvent(Map<String, String> map) {
super(map);
}
/**
* Gets the ID of the channel the client has moved to.
*
* @return the ID of the target channel
*
* @see Channel#getId()
*/
public int getTargetChannelId() {
return getInt("ctid");
}
public int getClientId() {
return getInt("clid");
}
@Override
public void fire(TS3Listener listener) {
listener.onClientMoved(this);
}
}
@@ -0,0 +1,40 @@
package com.github.manevolent.ts3j.event;
/*
* #%L
* TeamSpeak 3 Java API
* %%
* Copyright (C) 2014 Bert De Geyter
* %%
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
* #L%
*/
import java.util.Map;
public class ClientNeededPermissionsEvent extends BaseEvent {
protected ClientNeededPermissionsEvent(Map<String, String> map) {
super(map);
}
@Override
public void fire(TS3Listener listener) {
listener.onClientNeededPermissions(this);
}
}
@@ -0,0 +1,75 @@
package com.github.manevolent.ts3j.event;
/*
* #%L
* TeamSpeak 3 Java API
* %%
* Copyright (C) 2016 Bert De Geyter, Roger Baumgartner
* %%
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
* #L%
*/
import com.github.manevolent.ts3j.api.PrivilegeKeyType;
import java.util.Map;
public class PrivilegeKeyUsedEvent extends BaseEvent {
public PrivilegeKeyUsedEvent(Map<String, String> map) {
super(map);
}
public int getClientId() {
return getInt("clid");
}
public int getClientDatabaseId() {
return getInt("cldbid");
}
public String getClientUniqueIdentifier() {
return get("cluid");
}
public String getPrivilegeKey() {
return get("token");
}
public PrivilegeKeyType getPrivilegeKeyType() {
if (getPrivilegeKeyChannelId() == 0) {
return PrivilegeKeyType.SERVER_GROUP;
} else {
return PrivilegeKeyType.CHANNEL_GROUP;
}
}
public int getPrivilegeKeyGroupId() {
return getInt("token1");
}
public int getPrivilegeKeyChannelId() {
return getInt("token2");
}
@Override
public void fire(TS3Listener listener) {
listener.onPrivilegeKeyUsed(this);
}
}
@@ -0,0 +1,41 @@
package com.github.manevolent.ts3j.event;
/*
* #%L
* TeamSpeak 3 Java API
* %%
* Copyright (C) 2014 Bert De Geyter
* %%
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
* #L%
*/
import java.util.Map;
public class ServerEditedEvent extends BaseEvent {
public ServerEditedEvent(Map<String, String> map) {
super(map);
}
@Override
public void fire(TS3Listener listener) {
listener.onServerEdit(this);
}
}
@@ -0,0 +1,41 @@
package com.github.manevolent.ts3j.event;
/*
* #%L
* TeamSpeak 3 Java API
* %%
* Copyright (C) 2014 Bert De Geyter
* %%
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
* #L%
*/
import java.util.Map;
public class ServerGroupListEvent extends BaseEvent {
protected ServerGroupListEvent(Map<String, String> map) {
super(map);
}
@Override
public void fire(TS3Listener listener) {
listener.onServerGroupList(this);
}
}
@@ -0,0 +1,70 @@
package com.github.manevolent.ts3j.event;
/*
* #%L
* TeamSpeak 3 Java API
* %%
* Copyright (C) 2014 Bert De Geyter
* %%
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
* #L%
*/
import com.github.manevolent.ts3j.command.Command;
public interface TS3Event {
void fire(TS3Listener listener);
static TS3Event createEvent(Command command) {
switch (command.getName()) {
case "notifytextmessage":
return new TextMessageEvent(command.toMap());
case "notifycliententerview":
return new ClientJoinEvent(command.toMap());
case "notifyclientleftview":
return new ClientLeaveEvent(command.toMap());
case "notifyserveredited":
return new ServerEditedEvent(command.toMap());
case "notifychanneledited":
return new ChannelEditedEvent(command.toMap());
case "notifychanneldescriptionchanged":
return new ChannelDescriptionEditedEvent(command.toMap());
case "notifyclientmoved":
return new ClientMovedEvent(command.toMap());
case "notifychannelcreated":
return new ChannelCreateEvent(command.toMap());
case "notifychanneldeleted":
return new ChannelDeletedEvent(command.toMap());
case "notifychannelmoved":
return new ChannelMovedEvent(command.toMap());
case "notifychannelpasswordchanged":
return new ChannelPasswordChangedEvent(command.toMap());
case "notifytokenused":
return new PrivilegeKeyUsedEvent(command.toMap());
case "notifyservergrouplist": // CLIENT
return new ServerGroupListEvent(command.toMap());
case "notifychannelgrouplist": // CLIENT
return new ChannelGroupListEvent(command.toMap());
case "notifyclientneededpermissions": // CLIENT
return new ClientNeededPermissionsEvent(command.toMap());
default:
throw new IllegalArgumentException("unknown event: " + command.getName());
}
}
}
@@ -0,0 +1,60 @@
package com.github.manevolent.ts3j.event;
/*
* #%L
* TeamSpeak 3 Java API
* %%
* Copyright (C) 2014 Bert De Geyter
* %%
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
* #L%
*/
public interface TS3Listener {
void onTextMessage(TextMessageEvent e);
void onClientJoin(ClientJoinEvent e);
void onClientLeave(ClientLeaveEvent e);
void onServerEdit(ServerEditedEvent e);
void onChannelEdit(ChannelEditedEvent e);
void onChannelDescriptionChanged(ChannelDescriptionEditedEvent e);
void onClientMoved(ClientMovedEvent e);
void onChannelCreate(ChannelCreateEvent e);
void onChannelDeleted(ChannelDeletedEvent e);
void onChannelMoved(ChannelMovedEvent e);
void onChannelPasswordChanged(ChannelPasswordChangedEvent e);
void onPrivilegeKeyUsed(PrivilegeKeyUsedEvent e);
void onChannelGroupList(ChannelGroupListEvent e);
void onServerGroupList(ServerGroupListEvent e);
void onClientNeededPermissions(ClientNeededPermissionsEvent e);
}
@@ -0,0 +1,29 @@
package com.github.manevolent.ts3j.event;
public interface TeamspeakListener {
void onTextMessage(TextMessageEvent e);
void onClientJoin(ClientJoinEvent e);
void onClientLeave(ClientLeaveEvent e);
void onServerEdit(ServerEditedEvent e);
void onChannelEdit(ChannelEditedEvent e);
void onChannelDescriptionChanged(ChannelDescriptionEditedEvent e);
void onClientMoved(ClientMovedEvent e);
void onChannelCreate(ChannelCreateEvent e);
void onChannelDeleted(ChannelDeletedEvent e);
void onChannelMoved(ChannelMovedEvent e);
void onChannelPasswordChanged(ChannelPasswordChangedEvent e);
void onPrivilegeKeyUsed(PrivilegeKeyUsedEvent e);
}
@@ -0,0 +1,71 @@
package com.github.manevolent.ts3j.event;
/*
* #%L
* TeamSpeak 3 Java API
* %%
* Copyright (C) 2014 Bert De Geyter
* %%
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
* #L%
*/
import com.github.manevolent.ts3j.api.TextMessageTargetMode;
import java.util.Map;
public class TextMessageEvent extends BaseEvent {
public TextMessageEvent(Map<String, String> map) {
super(map);
}
public TextMessageTargetMode getTargetMode() {
int mode = getInt("targetmode");
for (TextMessageTargetMode m : TextMessageTargetMode.values()) {
if (m.getIndex() == mode) {
return m;
}
}
return null;
}
public String getMessage() {
return get("msg");
}
/**
* Gets the client ID of the recipient of a private message.
* <ul>
* <li>If the private message was sent <b>to</b> the query, the target ID will be the query's client ID</li>
* <li>If the private message was sent <b>by</b> the query, the target ID will be the recipient's client ID</li>
* <li>If this is not an event for a private message, this method will return {@code -1}</li>
* </ul>
*
* @return the client ID of the recipient
*/
public int getTargetClientId() {
return getInt("target");
}
@Override
public void fire(TS3Listener listener) {
listener.onTextMessage(this);
}
}
@@ -1,201 +0,0 @@
package com.github.manevolent.ts3j.model;
import com.github.manevolent.ts3j.enums.CodecType;
public class Channel {
private final VirtualServer server;
private final int channelId;
private String name;
private CodecType codec;
private int codecQuality;
private int maxClients;
private int maxFamilyClients;
private int order;
private boolean permanent;
private boolean semiPermanent;
private boolean serverDefault;
private boolean hasPassword;
private boolean codecLatencyFactor;
private boolean unencrypted;
private int deleteDelay;
private boolean unlimited;
private boolean familyUnlimited;
private boolean inheritingMaxfamilyUnlimited;
private int neededTalkPower;
private boolean forcingSilence;
private int iconId;
private boolean privated;
public Channel(VirtualServer server, int channelId) {
this.server = server;
this.channelId = channelId;
}
public int getChannelId() {
return channelId;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public CodecType getCodec() {
return codec;
}
public void setCodec(CodecType codec) {
this.codec = codec;
}
public int getCodecQuality() {
return codecQuality;
}
public void setCodecQuality(int codecQuality) {
this.codecQuality = codecQuality;
}
public int getMaxClients() {
return maxClients;
}
public void setMaxClients(int maxClients) {
this.maxClients = maxClients;
}
public int getMaxFamilyClients() {
return maxFamilyClients;
}
public void setMaxFamilyClients(int maxFamilyClients) {
this.maxFamilyClients = maxFamilyClients;
}
public int getOrder() {
return order;
}
public void setOrder(int order) {
this.order = order;
}
public boolean isPermanent() {
return permanent;
}
public void setPermanent(boolean permanent) {
this.permanent = permanent;
}
public boolean isSemiPermanent() {
return semiPermanent;
}
public void setSemiPermanent(boolean semiPermanent) {
this.semiPermanent = semiPermanent;
}
public boolean isServerDefault() {
return serverDefault;
}
public void setServerDefault(boolean serverDefault) {
this.serverDefault = serverDefault;
}
public boolean hasPassword() {
return hasPassword;
}
public void setHasPassword(boolean hasPassword) {
this.hasPassword = hasPassword;
}
public boolean isCodecLatencyFactor() {
return codecLatencyFactor;
}
public void setCodecLatencyFactor(boolean codecLatencyFactor) {
this.codecLatencyFactor = codecLatencyFactor;
}
public boolean isUnencrypted() {
return unencrypted;
}
public void setUnencrypted(boolean unencrypted) {
this.unencrypted = unencrypted;
}
public int getDeleteDelay() {
return deleteDelay;
}
public void setDeleteDelay(int deleteDelay) {
this.deleteDelay = deleteDelay;
}
public boolean isUnlimited() {
return unlimited;
}
public void setUnlimited(boolean unlimited) {
this.unlimited = unlimited;
}
public boolean isFamilyUnlimited() {
return familyUnlimited;
}
public void setFamilyUnlimited(boolean familyUnlimited) {
this.familyUnlimited = familyUnlimited;
}
public boolean isInheritingMaxfamilyUnlimited() {
return inheritingMaxfamilyUnlimited;
}
public void setInheritingMaxfamilyUnlimited(boolean inheritingMaxfamilyUnlimited) {
this.inheritingMaxfamilyUnlimited = inheritingMaxfamilyUnlimited;
}
public int getNeededTalkPower() {
return neededTalkPower;
}
public void setNeededTalkPower(int neededTalkPower) {
this.neededTalkPower = neededTalkPower;
}
public boolean isForcingSilence() {
return forcingSilence;
}
public void setForcingSilence(boolean forcingSilence) {
this.forcingSilence = forcingSilence;
}
public int getIconId() {
return iconId;
}
public void setIconId(int iconId) {
this.iconId = iconId;
}
public boolean isPrivated() {
return privated;
}
public void setPrivated(boolean privated) {
this.privated = privated;
}
public VirtualServer getServer() {
return server;
}
}
@@ -1,261 +0,0 @@
package com.github.manevolent.ts3j.model;
import com.github.manevolent.ts3j.enums.ClientType;
import com.github.manevolent.ts3j.identity.Uid;
import java.util.*;
public class Client {
private final int id;
private final int databaseId;
private final VirtualServer server;
private final Uid uid;
private final ClientType clientType;
private String nickname;
private int channelId;
private int channelGroupId;
private boolean speaking;
private boolean outputMuted, inputMuted;
private boolean recording;
private boolean inputHardware, outputHardware;
private boolean away;
private int talkPower;
private boolean talkRequested;
private boolean talker;
private boolean prioritySpeaker;
private int unreadMessages;
private int neededServerQueryViewPower;
private int iconId;
private boolean channelCommander;
private String country;
private int inheritedChannelGroupChannelId;
private List<Integer> serverGroupIds = new ArrayList<>();
public Client(int id, int databaseId, VirtualServer server, Uid uid, ClientType clientType) {
this.id = id;
this.databaseId = databaseId;
this.server = server;
this.uid = uid;
this.clientType = clientType;
}
public VirtualServer getServer() {
return server;
}
public Uid getUid() {
return uid;
}
public String getNickname() {
return nickname;
}
public void setNickname(String nickname) {
this.nickname = nickname;
}
/**
* Gets the client's current client connection ID.
* @return client ID.
*/
public int getId() {
return id;
}
/**
* Gets the current connected-to channel.
* @return channel currently connected to by the client.
*/
public Channel getChannel() {
return server.getChannelById(getChannelId());
}
/**
* Gets the channel ID currently connected to.
* @return channel currently connected to by the client.
*/
public int getChannelId() {
return channelId;
}
public void setChannelId(int channelId) {
this.channelId = channelId;
}
public boolean isSpeaking() {
return speaking;
}
public void setSpeaking(boolean speaking) {
this.speaking = speaking;
}
public boolean isInputMuted() {
return inputMuted;
}
public void setInputMuted(boolean inputMuted) {
this.inputMuted = inputMuted;
}
public boolean isOutputMuted() {
return outputMuted;
}
public void setOutputMuted(boolean outputMuted) {
this.outputMuted = outputMuted;
}
public boolean hasOutputHardware() {
return outputHardware;
}
public void setOutputHardware(boolean outputHardware) {
this.outputHardware = outputHardware;
}
public boolean hasInputHardware() {
return inputHardware;
}
public void setInputHardware(boolean inputHardware) {
this.inputHardware = inputHardware;
}
public int getDatabaseId() {
return databaseId;
}
public boolean isRecording() {
return recording;
}
public void setRecording(boolean recording) {
this.recording = recording;
}
public boolean isInServerGroup(int serverGroupId) {
return serverGroupIds.contains(serverGroupId);
}
public void setServerGroupIds(Collection<Integer> serverGroupIds) {
synchronized (serverGroupIds) {
this.serverGroupIds.clear();
this.serverGroupIds.addAll(serverGroupIds);
}
}
public void setServerGroupIds(Integer... serverGroupIds) {
setServerGroupIds(Arrays.asList(serverGroupIds));
}
public Iterable<Integer> getServerGroupIds() {
return Collections.unmodifiableList(serverGroupIds);
}
public int getChannelGroupId() {
return channelGroupId;
}
public void setChannelGroupId(int channelGroupId) {
this.channelGroupId = channelGroupId;
}
public boolean isAway() {
return away;
}
public void setAway(boolean away) {
this.away = away;
}
public int getTalkPower() {
return talkPower;
}
public void setTalkPower(int talkPower) {
this.talkPower = talkPower;
}
public boolean isTalkRequested() {
return talkRequested;
}
public void setTalkRequested(boolean talkRequested) {
this.talkRequested = talkRequested;
}
public boolean isTalker() {
return talker;
}
public void setTalker(boolean talker) {
this.talker = talker;
}
public boolean isPrioritySpeaker() {
return prioritySpeaker;
}
public void setPrioritySpeaker(boolean prioritySpeaker) {
this.prioritySpeaker = prioritySpeaker;
}
public int getUnreadMessages() {
return unreadMessages;
}
public void setUnreadMessages(int unreadMessages) {
this.unreadMessages = unreadMessages;
}
public int getNeededServerQueryViewPower() {
return neededServerQueryViewPower;
}
public void setNeededServerQueryViewPower(int neededServerQueryViewPower) {
this.neededServerQueryViewPower = neededServerQueryViewPower;
}
public int getIconId() {
return iconId;
}
public void setIconId(int iconId) {
this.iconId = iconId;
}
public boolean isChannelCommander() {
return channelCommander;
}
public void setChannelCommander(boolean channelCommander) {
this.channelCommander = channelCommander;
}
public int getInheritedChannelGroupChannelId() {
return inheritedChannelGroupChannelId;
}
public void setInheritedChannelGroupChannelId(int inheritedChannelGroupChannelId) {
this.inheritedChannelGroupChannelId = inheritedChannelGroupChannelId;
}
public ClientType getClientType() {
return clientType;
}
public String getCountry() {
return country;
}
public void setCountry(String country) {
this.country = country;
}
}
@@ -1,322 +0,0 @@
package com.github.manevolent.ts3j.model;
import com.github.manevolent.ts3j.enums.HostBannerMode;
import com.github.manevolent.ts3j.enums.HostMessageMode;
import com.github.manevolent.ts3j.enums.VoiceEncryptionMode;
import com.github.manevolent.ts3j.identity.Uid;
import java.util.*;
import java.util.stream.Collectors;
public class VirtualServer {
private int id;
private String name;
private String nickname;
private String welcomeMessage;
private String platform;
private String version;
private int maxClients;
private long created;
private VoiceEncryptionMode encryptionMode;
private HostMessageMode hostMessageMode;
private int defaultGroupId;
private int defaultChannelGroupId;
private String hostbannerUrl;
private int hostBannerInterval;
private double prioritySpeakerDimmModifier;
private String namePhonetic;
private long iconId;
private String serverIp;
private boolean askForPriviledgeKey;
private HostBannerMode hostBannerMode;
private int defaultTempChannelDeleteDelay;
/**
* Connected clients
*/
private final Map<Integer, Client> clients = new HashMap<>();
/**
* Server channels
*/
private final Map<Integer, Channel> channels = new HashMap<>();
public VirtualServer() {
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getNickname() {
return nickname;
}
public void setNickname(String nickname) {
this.nickname = nickname;
}
public String getWelcomeMessage() {
return welcomeMessage;
}
public void setWelcomeMessage(String welcomeMessage) {
this.welcomeMessage = welcomeMessage;
}
public String getPlatform() {
return platform;
}
public void setPlatform(String platform) {
this.platform = platform;
}
public String getVersion() {
return version;
}
public void setVersion(String version) {
this.version = version;
}
public int getMaxClients() {
return maxClients;
}
public void setMaxClients(int maxClients) {
this.maxClients = maxClients;
}
public long getCreated() {
return created;
}
public void setCreated(long created) {
this.created = created;
}
public VoiceEncryptionMode getEncryptionMode() {
return encryptionMode;
}
public void setEncryptionMode(VoiceEncryptionMode encryptionMode) {
this.encryptionMode = encryptionMode;
}
public HostMessageMode getHostMessageMode() {
return hostMessageMode;
}
public void setHostMessageMode(HostMessageMode hostMessageMode) {
this.hostMessageMode = hostMessageMode;
}
/**
* Gets the default server group ID users are assigned to when connecting to the server for the first time.
* @return default server group ID.
*/
public int getDefaultGroupId() {
return defaultGroupId;
}
public void setDefaultGroupId(int defaultGroupId) {
this.defaultGroupId = defaultGroupId;
}
public int getDefaultChannelGroupId() {
return defaultChannelGroupId;
}
public void setDefaultChannelGroupId(int defaultChannelGroupId) {
this.defaultChannelGroupId = defaultChannelGroupId;
}
public String getHostbannerUrl() {
return hostbannerUrl;
}
public void setHostbannerUrl(String hostbannerUrl) {
this.hostbannerUrl = hostbannerUrl;
}
public int getHostBannerInterval() {
return hostBannerInterval;
}
public void setHostBannerInterval(int hostBannerInterval) {
this.hostBannerInterval = hostBannerInterval;
}
public double getPrioritySpeakerDimmModifier() {
return prioritySpeakerDimmModifier;
}
public void setPrioritySpeakerDimmModifier(double prioritySpeakerDimmModifier) {
this.prioritySpeakerDimmModifier = prioritySpeakerDimmModifier;
}
public String getNamePhonetic() {
return namePhonetic;
}
public void setNamePhonetic(String namePhonetic) {
this.namePhonetic = namePhonetic;
}
public long getIconId() {
return iconId;
}
public void setIconId(long iconId) {
this.iconId = iconId;
}
public String getServerIp() {
return serverIp;
}
public void setServerIp(String serverIp) {
this.serverIp = serverIp;
}
public boolean isAskForPriviledgeKey() {
return askForPriviledgeKey;
}
public void setAskForPriviledgeKey(boolean askForPriviledgeKey) {
this.askForPriviledgeKey = askForPriviledgeKey;
}
public HostBannerMode getHostBannerMode() {
return hostBannerMode;
}
public void setHostBannerMode(HostBannerMode hostBannerMode) {
this.hostBannerMode = hostBannerMode;
}
public int getDefaultTempChannelDeleteDelay() {
return defaultTempChannelDeleteDelay;
}
public void setDefaultTempChannelDeleteDelay(int defaultTempChannelDeleteDelay) {
this.defaultTempChannelDeleteDelay = defaultTempChannelDeleteDelay;
}
/**
* Gets a channel by its numeric ID.
* @param id channel ID.
* @return the corresponding channel, if such a channel exists, null otherwise.
*/
public Channel getChannelById(int id) {
return channels.get(id);
}
/**
* Tries to add a new channel to the server. If the channel ID is already in use, IllegalStateException is thrown.
* @param channel channel to add.
*/
public void updateChannel(Channel channel) {
synchronized (channels) {
this.channels.put(channel.getChannelId(), channel);
}
}
/**
* Gets all channels by a specific name.
* @param name Name to search for.
* @return List of channels with the specified name.
*/
public List<Channel> getChannelsByName(String name) {
return this.channels.values()
.stream()
.filter(x -> x.getName().equalsIgnoreCase(name))
.collect(Collectors.toList());
}
/**
* Gets the first channel by a specific name.
* @param name Name to search for.
* @return List of channels with the specified name.
*/
public Channel getChannelByName(String name) throws IllegalArgumentException {
return getChannelsOrderd()
.stream()
.filter(x -> x.getName().equalsIgnoreCase(name))
.findFirst()
.orElseThrow(() -> new IllegalArgumentException("channel not found"));
}
/**
* Gets a real channel list, potentially unordered.
* @return Unordered channel list.
*/
public Collection<Channel> getChannels() {
return Collections.unmodifiableCollection(channels.values());
}
/**
* Gets the channel list as ordered by the server.
* @return Iterable list of ordered channels.
*/
public Collection<Channel> getChannelsOrderd() {
return Collections.unmodifiableCollection(channels.values()
.stream()
.sorted(Comparator.comparingInt(Channel::getOrder))
.collect(Collectors.toList())
);
}
/**
* Gets a list of known clients to the server.
* @return clients
*/
public Collection<Client> getClients() {
throw new UnsupportedOperationException(); // TODO
}
/**
* Gets a list of connected clients.
* @return connected clients.
*/
public Collection<Client> getConnectedClients() {
return Collections.unmodifiableCollection(clients.values());
}
public List<Client> getClientsByUid(Uid uid) {
return getConnectedClients().stream().filter(x -> x.getUid().equals(uid)).collect(Collectors.toList());
}
public void updateConnectedClient(Client client) {
synchronized (clients) {
this.clients.put(client.getId(), client);
}
}
public void removeConnectedClient(Client client) {
synchronized (clients) {
if (this.clients.containsKey(client.getId()))
this.clients.remove(client.getId());
else
throw new IllegalStateException("client ID doesn't exist");
}
}
public Client getClientById(int clientId) {
return this.clients.get(clientId);
}
}
@@ -119,7 +119,7 @@ public final class Packet {
} }
} }
getBody().read(buffer); getBody().read(getHeader(), buffer);
return buffer; return buffer;
} }
@@ -2,7 +2,7 @@
package com.github.manevolent.ts3j.protocol.client; package com.github.manevolent.ts3j.protocol.client;
import com.github.manevolent.ts3j.protocol.packet.handler.PacketHandler; import com.github.manevolent.ts3j.protocol.packet.handler.PacketHandler;
import com.github.manevolent.ts3j.protocol.packet.handler.local.*; import com.github.manevolent.ts3j.protocol.packet.handler.client.*;
import com.github.manevolent.ts3j.protocol.socket.client.TeamspeakClientSocket; import com.github.manevolent.ts3j.protocol.socket.client.TeamspeakClientSocket;
import org.apache.commons.lang.reflect.ConstructorUtils; import org.apache.commons.lang.reflect.ConstructorUtils;

Some files were not shown because too many files have changed in this diff Show More