minecrafttr aramıza katil!
batihost minecraft server kirala
Satın Al
MinecraftTR Reklam Alanı
Satın Al
Satın Al
Satın Al

Paylaşım Siteden Kayıt Alan Sunucular İçin İşe Yarar Plugin (Source Code)

Seçkin madenci.
Katılım
4 Nisan 2019
Mesajlar
135
Tepki puanı
44
Puanları
1,205
Discord
hyperion#8040

Selam!

Ben Efe, Hyperion olandan.

Bu gün siteden oyuncu kabul eden sunucular için çakmalobi gerektirmeyecek şekilde nasıl antibot eklentisi yapabilirsiniz onu anlatacağım.

Neden kullanalım?

Sadece siteden kayıt ile oyuncu kabul eden sunuculara yüksek trafik ile bot atıldığı zaman sunucu online sayısı 400-500 kadar yükselip çakma lobileri çöküyor.

Bunun nedeni çok yüksek trafik ile saldırı geldiği zaman botların havuzda kalıp çakma lobiye aktarılmayı beklemesinden dolayı. Bu tür saldırılar da da çakmalobi çok dayanmadan çöküyor. Kısaca olası bir bot saldırısında hem bungeecord sunucunuz hem de spigot sunucunuz aşırı yükleniyor. Fakat spigot sunucunuzun aşırı yüklenmesini basit bir şekilde engelleyebilirsiniz. Oyuncu kontrolünü çakma lobide değil bungeecord üzerinde yaparak.

Bunu atlatmanın en basit yolu kullanıcının kayıt olup olmadığını çakma lobide değil de bungeecord üzerinde kontrol edilmesi.
Her yönden kaynak kazanıyorsunuz yani.

Çakma lobide kontrol olduğu zaman olay akışı:​

- Bot bungeecord a girer.
- Bungeecord çakma lobiye yönlendirir.
- Çakma lobi Kontrol için sql sunucusuna sorgu gönderir.
- Kullanıcı kayıtlı değil ise sunucudan atar.


Eğer bunu kullanırsanız;
- Bot bungeecord sunucunuza girer.
- Bungeecord memory den kullanıcının kayıtlı olup olmadığını kontrol eder.
- Gelen cevaba göre oyuncu sunucudan atılır.

Kısaca sistemin mantığı:

- Bungeecord sunucusu kayıtlı kullanıcıların listesini HashMap a aktarır, Ve bu listeyi 15 saniye de bir günceller. dolayısıyla siteden kayıt olan birisi 15 saniye sonra sunucuya giriş yapabilir.
- Oyuncu sunucuya girdiği zaman bungeecord plugini kullanıcının HashMap de olup olmadığını kontrol eder. Eğer yok ise sunucudan atar.

Kaynak kodlara geçelim:

Java:
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;


import com.mysql.jdbc.Connection;

public class MySQL {

    public Connection conn = null;
    public String user;
    public String password;
    public String ip;
    public String db;
    public String url;
    public boolean isConnect=false;

    public MySQL(String ip, String user, String password, String db) {
        this.ip = ip;
        this.user = user;
        this.password = password;
        this.db = db;
        this.url = "jdbc:mysql://" + ip + ":3306/" + db+"?autoReconnect=true";
        try {
            conn = (Connection) DriverManager.getConnection(this.url,this.user, this.password);
            isConnect=true;
        } catch (SQLException e) {
        }
    }


    public String sqlConnectionTest(){
        String returnstring="";
        try {
            ResultSet rs = this.getConn().createStatement().executeQuery("select id from ghostdb limit 1"); // kendi authme tablonunza göre düzenleyiniz
            rs.beforeFirst();
            rs.next();
            returnstring=returnstring+"-SQL Test Success";
        } catch (Exception e1) {
            returnstring=returnstring+"-SQL Test Error";
            try {
                try {
                    conn.close();
                    returnstring=returnstring+"-Close Success";
                } catch (Exception e) {
                    returnstring=returnstring+"-Close Error";
                }
                this.conn=null;
                this.conn = (Connection) DriverManager.getConnection(this.url,this.user, this.password);
                isConnect=true;
                returnstring=    returnstring+"-New Conection Success";
            } catch (Exception e23) {
                returnstring=    returnstring+"-Error !!!!!!!";
            }
        }
        return returnstring;
    }

    public Connection getConn() {
        return this.conn;
    }

    public ResultSet getResultSet(String query) {
        try {
            ResultSet rs = this.getConn().createStatement().executeQuery(query);
            return rs;
        } catch (SQLException e) {
            this.sqlConnectionTest();
            return null;
        }
    }

    public boolean ExecuteSql(String query) {
        try {
            this.getConn().createStatement().executeUpdate(query);
            return true;
        } catch (SQLException e) {
            this.sqlConnectionTest();
            return false;
        }
    }
}


Java:
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.concurrent.TimeUnit;

import net.md_5.bungee.api.ChatColor;
import net.md_5.bungee.api.CommandSender;
import net.md_5.bungee.api.ProxyServer;
import net.md_5.bungee.api.config.ServerInfo;
import net.md_5.bungee.api.connection.ProxiedPlayer;
import net.md_5.bungee.api.plugin.Plugin;

public class Main extends Plugin {
    public String db = "sql db";
    public String host = "sql ip";
    public String user = "sql kullanıcı adı";
    public String password = "sql şifresi";
    public static MySQL SqlServer;
    public static Main plugin;
    public static int lastSqlId = 0;
    public static HashMap<String, Integer> userWhiteLists = new HashMap<String, Integer>();

    @Override
    public void onEnable() {
        plugin = this;
        SqlServer = new MySQL(host, user, password, db); // sql server
        getLogger().info("Naaber Müdüür");
        getProxy().getPluginManager().registerListener(this, new AntiBot()); // anti bot sınıfını listener olarak kaydediyoruz

        getProxy().getScheduler().schedule(this, new Runnable() {
            @Override
            public void run() {
                getLogger().info(SqlServer.sqlConnectionTest());
            }
        }, 1, 300, TimeUnit.SECONDS);

        getProxy().getScheduler().schedule(this, new Runnable() {
            @Override
            public void run() {
                updateWhiteList.update();
            }
        }, 1, 15, TimeUnit.SECONDS);
    }
}


Java:
public class AntiBot implements Listener {
    @SuppressWarnings("deprecation")
    @EventHandler(priority=Byte.MIN_VALUE)
    public void onServwereeConnect(LoginEvent e) {
        if (Main.userWhiteLists.get(e.getConnection().getName().toLowerCase())==null) {
            e.setCancelReason("Giriş yapabilmek için\n\nwww.HyperionMC.com Adresinden kayıt olmalısın.\n\nKayıt olduysan 30 saniye bekleyip tekrar giriş yap.");
            e.setCancelled(true);
            Main.plugin.getLogger().info(e.getConnection().getName()+" §cAtıldı.");
        }
    }
}


Java:
public class updateWhiteList {
    public static void update() {
        ResultSet rs = Main.SqlServer.getResultSet("select id,user from ghostdb where id > " + Main.lastSqlId+" ORDER BY id ASC LIMIT 25000"); // kendinize göre düzenleyiniz. Tek seferde 25 bin kayıtlı kişinin ismini çeker.
        try {
            while (rs.next()) {
                int playerID=rs.getInt("id"); // id = uniq user id stünü
                String playerName=rs.getString("user").toLowerCase(); // user = kullanıcı adı stünü
                if (playerID>Main.lastSqlId) {
                    Main.lastSqlId=playerID;
                }
                Main.userWhiteLists.put(playerName, playerID);
                Main.plugin.getLogger().info("§eEklendi: "+playerName+ " - "+playerID);
            }
        } catch (Exception e) {
        }
    }

}


Ek olarak:

Bu şekilde bir sistem kullandığınız zaman bot sunucuya girdiği zaman bot un skinini çekmek için bungeecord kaynak kullanmaz. öbür türlü sadece skin verilerini çekmeye çalıştığı için bile bungeecord çökebiliyor.

Yapamayan veya bilmeyenler için videolu anlatım!



Kaynak kodları alıntıdır, aldığım konu:
Selçuk namı diğer Janjel'in konusu için TIKLA!
 
Moderatörün son düzenlenenleri:
Seçkin madenci.
Katılım
4 Nisan 2019
Mesajlar
135
Tepki puanı
44
Puanları
1,205
Discord
hyperion#8040
Videoda belirtmeyi unutmuşum, sadece CTRL + S yetmiyor, CTRL + SHIFT + O yapıp CTRL + S yapmanız gerek, eclipse veya diğer ide'lerde bu kısayol otomatik import ekler, import etmeden ve yaptıklarımı yapmazsanız hata verecektir.
 
Risk almazsan, risk alanlar için çalışırsın.
Katılım
26 Ekim 2019
Mesajlar
65
En iyi cevaplar
1
Tepki puanı
2
Puanları
1,215
Discord
Moonshine#0001
Yararlı konu.
 
Seçkin madenci.
Katılım
4 Nisan 2019
Mesajlar
135
Tepki puanı
44
Puanları
1,205
Discord
hyperion#8040
Test 1 2 3
Katılım
27 Aralık 2019
Mesajlar
362
En iyi cevaplar
11
Tepki puanı
133
Puanları
1,390
Discord
362Sefa#0362
Yararlı Konu Başarılar
 
Seçkin madenci.
Katılım
4 Nisan 2019
Mesajlar
135
Tepki puanı
44
Puanları
1,205
Discord
hyperion#8040
Seçkin madenci.
Katılım
27 Ekim 2019
Mesajlar
617
Tepki puanı
212
Puanları
1,205
Discord
ChefEternal#1780
Güzel konuya değinmişsiniz. Elinize sağlık.
 
Seçkin madenci.
Katılım
4 Nisan 2019
Mesajlar
135
Tepki puanı
44
Puanları
1,205
Discord
hyperion#8040
Elite madenci.
Katılım
13 Nisan 2019
Mesajlar
1
Tepki puanı
0
Puanları
950
Discord
Eklenti çok başarılı ve güzel düşünülmüş tek kötü yanı kayıt olduktan sonra 30 40sn gibi bekletme süresi var bu da oyuncu kaybına yol açabiliyor "Bu nasıl sunucu lan kayıt oldum hala giremiyorum" gibi bunu düşürme veyahut kapatma gibi bir şansımız var mı ? zira Authme anlık çekiyor da
 

Üst