77import net .md_5 .bungee .config .ConfigurationProvider ;
88import net .md_5 .bungee .config .Configuration ;
99import net .md_5 .bungee .config .YamlConfiguration ;
10+ import net .md_5 .bungee .api .ChatColor ;
11+ import net .md_5 .bungee .api .chat .ComponentBuilder ;
1012import net .md_5 .bungee .api .connection .ProxiedPlayer ;
1113
1214import com .fasterxml .jackson .databind .ObjectMapper ;
@@ -97,7 +99,8 @@ public void reload() {
9799 port = getConfig ().getInt ("config.port" );
98100 serverKey = getConfig ().getString ("config.server-key" );
99101
100- isConnected = connect (true );
102+ if (getConfig ().getBoolean ("config.auto-reconnect" ))
103+ isConnected = reconnect (true );
101104
102105 int positionTaskInterval = getConfig ().getInt ("config.voice.position-task-interval" , 1 );
103106 taskRunner .cancel ();
@@ -112,26 +115,52 @@ public void reload() {
112115 updateSettings (proximityDistance , proximityToggle , voiceEffects );
113116 }
114117
118+ /**
119+ * Connects to a new server.
120+ *
121+ * @param host The host to connect to.
122+ * @param port The port to connect to.
123+ * @param serverKey The server key.
124+ * @return True if connected successfully, otherwise false.
125+ */
126+ public Boolean connect (String host , int port , String serverKey ) {
127+ if (Objects .nonNull (host ) && Objects .nonNull (serverKey )) {
128+ getConfig ().set ("config.host" , host );
129+ getConfig ().set ("config.port" , port );
130+ getConfig ().set ("config.server-key" , serverKey );
131+ saveConfig ();
132+ reloadConfig ();
133+ reload ();
134+
135+ return isConnected ;
136+ } else {
137+ Logger .warn (Language .getMessage (lang , "plugin-connect-invalid-data" ));
138+ return false ;
139+ }
140+ }
141+
115142 /**
116143 * Connects to the server.
117144 *
118145 * @param force Indicates whether to force a connection.
119146 * @return True if connected successfully, otherwise false.
120147 */
121- public Boolean connect (Boolean force ) {
148+ public Boolean reconnect (Boolean force ) {
122149 if (isConnected && !force )
123150 return true ;
124- isConnected = false ;
151+ if (isConnected ) {
152+ disconnect ("Reconnecting to another server." );
153+ }
125154
126155 if (Objects .nonNull (host ) && Objects .nonNull (serverKey )) {
127156 String link = "http://" + host + ":" + port ;
128157 String Token = network .sendLoginRequest (link , serverKey );
129158 if (Objects .nonNull (Token )) {
130- Logger .info (Language .getMessage (lang , "plugin-connect-connect " ));
159+ Logger .info (Language .getMessage (lang , "plugin-connect-connected " ));
131160 isConnected = true ;
132161 token = Token ;
133162 } else {
134- Logger .warn (Language .getMessage (lang , "plugin-connect-disconnect " ));
163+ Logger .warn (Language .getMessage (lang , "plugin-connect-failed " ));
135164 }
136165 return isConnected ;
137166 } else {
@@ -140,6 +169,39 @@ public Boolean connect(Boolean force) {
140169 }
141170 }
142171
172+ /**
173+ * Disconnects from the server.
174+ *
175+ * @param reason The reason why we disconnected
176+ */
177+ public void disconnect (String reason ) {
178+ if (!isConnected )
179+ return ;
180+
181+ if (Objects .nonNull (host ) && Objects .nonNull (serverKey )) {
182+ String link = "http://" + host + ":" + port ;
183+ network .sendLogoutRequest (link , token );
184+ isConnected = false ;
185+
186+ String disconnectMessage = Language .getMessage (lang , "plugin-connection-disconnect" ).replace ("$reason" , reason );
187+ Logger .info (disconnectMessage );
188+
189+ boolean sendVoipDisconnectMessage = getConfig ().getBoolean ("config.voice.send-voip-disconnect-message" );
190+ if (sendVoipDisconnectMessage ) {
191+ getProxy ().broadcast (new ComponentBuilder (disconnectMessage ).color (ChatColor .YELLOW ).create ());
192+ }
193+ } else {
194+ Logger .warn (Language .getMessage (lang , "plugin-connect-invalid-data" ));
195+ }
196+ }
197+
198+ /**
199+ * Disconnects from the server.
200+ */
201+ public void disconnect () {
202+ disconnect ("N.A." );
203+ }
204+
143205 /**
144206 * Binds a player to the voice chat server.
145207 *
@@ -150,6 +212,11 @@ public Boolean connect(Boolean force) {
150212 public Boolean bind (int playerKey , ProxiedPlayer player , int tries ) {
151213 if (!isConnected || Objects .isNull (host ) || Objects .isNull (serverKey ))
152214 return false ;
215+
216+ if (playerBinds .containsKey (player .getName ()) && playerBinds .get (player .getName ())) {
217+ return true ;
218+ }
219+
153220 String link = "http://" + host + ":" + port ;
154221
155222 getConfig ().set ("config.players." + player .getName (), playerKey );
@@ -162,13 +229,28 @@ public Boolean bind(int playerKey, ProxiedPlayer player, int tries) {
162229 if (result == "SUCCESS" ) {
163230 playerBinds .put (player .getName (), true );
164231 messageHandler .sendPlayerBindSync (player );
165- return true ;
166- } else {
167- if (result == "Invalid Token!" && tries == 0 ) {
168- Logger .info ("Invalid Token detected, reconnecting..." );
169- isConnected = connect (true );
170- return bind (playerKey , player , 1 );
232+
233+ Logger .info (Language .getMessage (lang , "player-binded" ).replace ("$player" ,player .getName ()));
234+
235+ boolean sendBindedMessage = getConfig ().getBoolean ("config.voice.send-binded-message" );
236+ if (sendBindedMessage ) {
237+ getProxy ().broadcast (
238+ new ComponentBuilder (player .getName ()).bold (true )
239+ .append (
240+ new ComponentBuilder (
241+ Language .getMessage (lang , "player-binded" )
242+ .replace ("$player" , "" )
243+ )
244+ .color (ChatColor .DARK_GREEN )
245+ .create ()
246+ ).create ()
247+ );
171248 }
249+ return true ;
250+ } else if (result == "Invalid Token!" && tries == 0 ) {
251+ Logger .info ("Invalid Token detected, reconnecting..." );
252+ isConnected = reconnect (true );
253+ return bind (playerKey , player , 1 );
172254 }
173255 }
174256 messageHandler .sendPlayerBindSync (player );
@@ -179,6 +261,60 @@ public Boolean bind(int playerKey, ProxiedPlayer player) {
179261 return bind (playerKey , player , 0 );
180262 }
181263
264+ /**
265+ * Bind a fake player
266+ * @param bindKey
267+ * @param name
268+ * @return
269+ */
270+ public Boolean bindFake (int playerKey , String name , int tries ) {
271+ if (!isConnected || Objects .isNull (host ) || Objects .isNull (serverKey ))
272+ return false ;
273+
274+ if (playerBinds .containsKey (name ) && playerBinds .get (name )) {
275+ return true ;
276+ }
277+
278+ String link = "http://" + host + ":" + port ;
279+
280+ String result = network .sendBindRequest (link , token , playerKey , String .format ("%0" , playerKey ), name );
281+ playerBinds .put (name , false );
282+ if (result != null ) {
283+ if (result == "SUCCESS" ) {
284+ playerBinds .put (name , true );
285+ // messageHandler.sendPlayerBindSync(player);
286+
287+ Logger .info (Language .getMessage (lang , "player-binded" ).replace ("$player" , name ));
288+
289+ boolean sendBindedMessage = getConfig ().getBoolean ("config.voice.send-binded-message" );
290+ if (sendBindedMessage ) {
291+ getProxy ().broadcast (
292+ new ComponentBuilder (name ).bold (true )
293+ .append (
294+ new ComponentBuilder (
295+ Language .getMessage (lang , "player-binded" )
296+ .replace ("$player" , "" )
297+ )
298+ .color (ChatColor .DARK_GREEN )
299+ .create ()
300+ ).create ()
301+ );
302+ }
303+ return true ;
304+ } else if (result == "Invalid Token!" && tries == 0 ) {
305+ Logger .info ("Invalid Token detected, reconnecting..." );
306+ isConnected = reconnect (true );
307+ return bindFake (playerKey , name , 1 );
308+ }
309+ }
310+ // messageHandler.sendPlayerBindSync(player);
311+ return false ;
312+ }
313+
314+ public Boolean bindFake (int playerKey , String name ) {
315+ return bindFake (playerKey , name , 0 );
316+ }
317+
182318 /**
183319 * Disconnects a player from the voice chat server.
184320 *
@@ -198,7 +334,7 @@ public Boolean disconnectPlayer(ProxiedPlayer player, int tries) {
198334 return true ;
199335 } else if (result == "Invalid Token!" && tries == 0 ) {
200336 Logger .info ("Invalid Token detected, reconnecting..." );
201- isConnected = connect (true );
337+ isConnected = reconnect (true );
202338 return disconnectPlayer (player , 1 );
203339 }
204340 }
0 commit comments