Hoş Geldin!

MinecraftTR.COM - Türkiye'nin en büyük minecraft platformu.

MinecraftTR.COM minecraftla alakalı araçları kullanıma sunuyor. Her şey burada; skript, plugin, doku paketleri, shaderlar, modlar, mcpe, minecraft sunucu kurulumu ve sunucularınızla alakalı yaşadığınız sorunları çözmenize yardımcı olabilecek rehberler ve tüm minecraft haberleri.

Sitemize kayıt olarak topluluğumuzun diğer üyeleriyle tartışabilir, paylaşabilir ve özel mesaj gönderebilirsiniz.

Giriş Yap veya Kayıt Ol!
batihost minecraft server kirala
Minecraft Sunucu Kiralama
MinecraftTR Reklam Alanı
MinecraftTR Reklam Alanı
MinecraftTR Reklam Alanı
MinecraftTR Reklam Alanı
Reklam satın al!

Rehber ÖNERİ: Sadece siteden kayıt ile oyuncu kabul eden sunucular için BungeeCord eklentisi (source code)

Yeni bir Steve doğdu!
Katılım
1 Ekim 2018
Mesajlar
46
Tepki puanı
28
Puanları
0
Discord
ÖNEMLİ: Konu içerisindekiler giriş seviyesinde java bilenler içindir. Java bilginiz yok ise dikkate almayınız.

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 çakama 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ı. Ve bu tür saldırılar da da çakma lobi çok dayanmadan çöküyor. Kısaca olası bir bot saldırısında hem bungeecord sunucunuz hem de minecraft(spigot) sunucunuz aşırı yükleniyor. fakat minecraft 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.

Ek olarak tavsiyem kullanıcı bungeecord a girdiği zaman sql sorgusu çalıştırmamanız yönünde. onun yerine kayıtlı kullanıcıların listesini bungeecord üzerinden memory e kaydetmeniz ve kullanıcı giriş yaptığı zaman memory de kullanıcının olup olmadığını kontrol etmeniz. Böylece sql sunucusu kullanmadan kullanıcının kayıt olup olmadığını hızlı bir şekilde anlayıp sunucudan atabilrisiniz. 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.

Dediğim sisteme göre:
Bot bungeecord a girer.
Bungeecord memory den kullanıcının kayıtlı olup olmadığını kontrol eder.
Gelen cevaba göre oyuncu sunucudan atılır.

Sonuç olarak hem çakma lobi kullanmadan hem de sürekli olarak sql kullanmadan kullanıcı kontrolü yapıp kaynak kazanabilirsiniz.

Kendi sunucumda kullandığım kaynak kodları sizlere atıyorum, Compile edip kullanabilirsiniz. Bu yazdıklarım java bilgisi olanlar için. Java bilginiz yok ise yapmaya çalışıp zaman kaybetmeyin derim.

Kısaca sistemin mantığı şu şekilde:
- 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 sunucdan atar.

Kaynak kodları da şu şekilde;

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 {
    @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.ghostmc.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.
 
Son düzenleme:
Elite madenci.
Katılım
21 Ağustos 2018
Mesajlar
6
Tepki puanı
1
Puanları
960
Discord
Yapmaya çalıştım fakat tam beceremedim yakından anlatma şansın varmı?
 
Yeni bir Steve doğdu!
Katılım
1 Ekim 2018
Mesajlar
46
Tepki puanı
28
Puanları
0
Discord
yapamadığın kısmı söylersen buradan cevaplarım, aynı problemi yaşayanlar için de bir yol olur. Tam olarak yaşadığın problem nedir ?
 
Elite madenci.
Katılım
21 Ağustos 2018
Mesajlar
6
Tepki puanı
1
Puanları
960
Discord
Full Kurulumda yardım edebilme şansın varmı?
 
Yeni bir Steve doğdu!
Katılım
1 Ekim 2018
Mesajlar
46
Tepki puanı
28
Puanları
0
Discord
Full Kurulumda yardım edebilme şansın varmı?
hocam konuyu öneri olarak açtım. Başlıkta ve konunun girişinde de belirttim, giriş seviyesinde java bilgisi gerektiğini. tek yapmanız gereken şey sınıflar içerisindeki mysql kısımlarını kendi sunucunuza göre değiştirmek. Ardından eclipse veya başka bir ide ile bir proje oluşturup kaynak kodları içine aktarmanız ve compile etmeniz. işlem bu kadar.
bunları da anlatmak ne yazık ki çok fazla zamanımı alır. o yüzden giriş seviyesine java bilgisinin gerektiğini belirttim. özet olarak kurulumda pek bir yardımda bulunamam. ama takıldığın ufak tefek şeyler olursa elimden geldiğince yardımcı olurum.
 

Üst