Metin2'de oyuncu şifresi sıfırlama, hesap açma, ban ve ban kaldırma, GM yetkisi verme işlemlerinin SQL komutları ve şifreleme yöntemleri.
Sunucunuz büyüdükçe hesapla ilgili istekler gelmeye başlar: şifresini unutan oyuncu, kural ihlali sebebiyle engellenmesi gereken hesap, ekibe alınan yeni GM. Bunların hepsi account veritabanı üzerinden yürütülür.
Bu rehberde günlük yönetimde ihtiyaç duyacağınız SQL komutlarını topladık.
account Tablosunu Tanıyalım
Oyuncu hesapları account veritabanındaki account tablosunda tutulur. Yönetim açısından önemli sütunlar:
| Sütun | Ne işe yarar |
|---|---|
id | Hesabın benzersiz numarası. |
login | Oyuncunun giriş yaptığı kullanıcı adı. |
password | Şifrenin karma (hash) hâli. Düz metin değildir. |
social_id | Depo şifresi olarak kullanılır. |
email | Kayıt e-posta adresi. |
status | Hesabın durumu. OK normal, BLOCK engelli. |
availDt | Hesabın erişilebilir olduğu tarih. Süreli banlarda kullanılır. |
create_time | Kayıt tarihi. |
last_play | Son giriş zamanı. |
Bu tabloya müdahale etmeden önce yedek alın. Tek bir yanlış UPDATE ile bütün oyuncuların şifresini aynı yapabilirsiniz. Yedekleme adımlarını Metin2 sunucu yedekleme rehberimizde anlattık.
Metin2 Şifreleri Nasıl Saklar?
Metin2 server files sürümlerinin çoğu şifreyi MySQL'in kendi PASSWORD() fonksiyonuyla saklar. Bazı derlemeler ise SHA1 ya da MD5 kullanır.
Hangisini kullandığınızı anlamanın en pratik yolu mevcut bir kayda bakmaktır:
SELECT login, password FROM account.account LIMIT 3;
*ile başlayan 41 karakterlik değer →PASSWORD()- 40 karakterlik, yıldızsız değer →
SHA1 - 32 karakterlik değer →
MD5
Yanlış fonksiyonla şifre yazarsanız hesap oluşur ama oyuncu giriş yapamaz. Bu yüzden ilk iş şifreleme yöntemini tespit etmektir.
MySQL 8.0 ile birlikte
PASSWORD()fonksiyonu kaldırıldı. Sunucunuz MySQL 8 üzerinde çalışıyor ama server filesPASSWORD()bekliyorsa, ya sürümü düşürmeniz ya da kimlik doğrulama kodunu güncellemeniz gerekir.
Oyuncu Şifresi Değiştirme
PASSWORD() kullanan sunucularda
UPDATE account.account
SET password = PASSWORD('yeni_sifre')
WHERE login = 'oyuncu_adi';
SHA1 kullanan sunucularda
UPDATE account.account
SET password = SHA1('yeni_sifre')
WHERE login = 'oyuncu_adi';
MD5 kullanan sunucularda
UPDATE account.account
SET password = MD5('yeni_sifre')
WHERE login = 'oyuncu_adi';
WHERE satırını yazmayı unutmayın. Onsuz çalıştırılan bir UPDATE tablodaki bütün satırları günceller ve sunucunuzdaki herkesin şifresi aynı olur. Bunu yaşayan sunucu sayısı sandığınızdan fazla.
Güvenli çalışma alışkanlığı
Bir UPDATE yazmadan önce aynı WHERE koşuluyla bir SELECT çalıştırın:
SELECT login, email FROM account.account WHERE login = 'oyuncu_adi';
Tek satır dönüyorsa güncellemeyi yapabilirsiniz. Üç satır dönüyorsa koşulunuz hatalıdır ve bunu öğrenmek için doğru an, güncellemeden öncesidir.
Depo Şifresini Sıfırlama
Depo şifresi social_id sütununda tutulur ve genellikle 7 haneli bir sayıdır:
UPDATE account.account
SET social_id = '1234567'
WHERE login = 'oyuncu_adi';
Oyuncular "depo şifremi unuttum" derken çoğunlukla bunu kastediyor. Hesap şifresiyle karıştırmayın.
Elle Hesap Oluşturma
Test için ya da bir oyuncunun hesabını yeniden oluşturmak için:
INSERT INTO account.account (login, password, social_id, email, status, create_time)
VALUES ('test01', PASSWORD('test1234'), '1234567', 'test@ornek.com', 'OK', NOW());
Aynı login değeriyle ikinci bir kayıt eklemeye çalışırsanız hata alırsınız; bu sütun benzersizdir ve öyle kalmalıdır.
Hesap Engelleme ve Engel Kaldırma
Süresiz engelleme
UPDATE account.account
SET status = 'BLOCK'
WHERE login = 'kural_ihlali_yapan';
Süreli engelleme
7 günlük engel için:
UPDATE account.account
SET availDt = DATE_ADD(NOW(), INTERVAL 7 DAY)
WHERE login = 'oyuncu_adi';
Bu tarih gelene kadar hesap giriş yapamaz, sonra kendiliğinden açılır. Elle takip etmenize gerek kalmaz.
Engeli kaldırma
UPDATE account.account
SET status = 'OK', availDt = NOW()
WHERE login = 'oyuncu_adi';
Engelli hesapları listeleme
SELECT login, email, status, availDt
FROM account.account
WHERE status = 'BLOCK' OR availDt > NOW();
Engellemeleri neden yaptığınızı ayrı bir yerde kayıt altına alın. Altı ay sonra "bu hesap neden banlı" sorusuna cevap veremezseniz, haksız bir engeli kaldırmak yerine tartışmayla uğraşırsınız.
GM Yetkisi Verme
GM yetkisi account tablosunda değil, common veritabanındaki gmlist tablosunda tutulur:
INSERT INTO common.gmlist (mID, mAccount, mName, mContactIP, mServerIP, mAuthority)
VALUES (2, 'hesap_adi', 'karakter_adi', 'ALL', 'ALL', 'LOW_WIZARD');
Yetki seviyeleri: IMPLEMENTOR, GOD, HIGH_WIZARD, LOW_WIZARD, PLAYER. Destek ekibinize en düşük yetkiyi verin; ihtiyaç oldukça yükseltirsiniz.
Tablo değişikliğinin geçerli olması için oyun sunucusunu yeniden başlatmanız gerekir. Yetki verdikten sonra kullanılabilecek komutların tam listesi Metin2 GM kodları yazımızda.
GM yetkisini geri alma
DELETE FROM common.gmlist WHERE mAccount = 'hesap_adi';
Ekipten ayrılan birinin yetkisini aynı gün kaldırın. Bu, teknik bir öneri değil, yaşanmış olaylardan çıkarılmış bir ders.
Karakter İşlemleri
Bir hesabın karakterlerini görmek
SELECT p.name, p.level, p.job, p.playtime
FROM player.player p
JOIN account.account a ON p.account_id = a.id
WHERE a.login = 'oyuncu_adi';
Karakter adı değiştirme
UPDATE player.player
SET name = 'YeniIsim'
WHERE name = 'EskiIsim';
Karakter adları benzersizdir. Kullanımdaki bir isimle değiştirmeye çalışırsanız sorgu hata verir.
Silinmiş karakteri geri getirme
Silinen karakterler çoğu sürümde hemen kaldırılmaz; işaretlenir. Sunucunuzda böyle bir alan varsa geri döndürmek mümkündür. Yoksa tek yol yedekten kurtarmaktır — ki bu da yedeğiniz varsa mümkündür.
Sorgu Çalıştırmadan Önce
Kısa bir kontrol listesi:
- Yedek aldınız mı?
WHEREkoşulunu yazdınız mı?- Aynı koşulla önce
SELECTçalıştırıp kaç satır etkileneceğini gördünüz mü? - Doğru veritabanındasınız değil mi? (
accountileplayerkarışır) - Oyuncu çevrimiçi mi? Çevrimiçi bir oyuncunun verisini değiştirirseniz, çıkışta bellekteki eski veri üzerine yazılabilir.
Son madde özellikle önemli. Karakter verisi üzerinde çalışacaksanız oyuncunun çıkmasını bekleyin ya da /dc ile bağlantısını kesin.
Özet
Hesap yönetimi tekrarlayan ama hata affetmeyen bir iş. Komutların kendisi basit; işi riskli yapan, yanlış WHERE koşulunun bütün oyuncu tabanını etkileyebilmesi.
Veritabanına Navicat ile bağlanırken sorun yaşarsanız Navicat şifre değiştirme rehberimize, sunucuya SSH ile bağlanmayı öğrenmek için PuTTY ile SSH bağlantısı yazımıza bakabilirsiniz. Altyapı ihtiyacınız için Metin2 sunucu paketlerimiz hazır.
