Metin2 Fısıltı Konuşmalarının Log Kaydını Tutma Whisper Log System (C++)

Whistle

Ruhsuz Filozof
Kurucu
Kurumsal Üye
Geliştirici
Yardımsever Üye
Mesaj
11.536
Çözümler
549
Beğeni
12.176
Puan
5.915
Ticaret Puanı
2
Merhaba arkadaşlar,
Çoğu metin2 server sahiplerinin başına bu olay gelmiştir. Birisinin küfür ettiği konusunda GM'ye şikayette bulunurlar. Resimleri montajlayıp attıklarında haksız yere birisini banlamış olursunuz. Buna benzer tuzaklara düşmemek için Fısıltı konuşmalarının log kaydını tutacaz.

Bildiğiniz gibi oyunda !bağırma ile yazılanların log kayıtı tutuluyor fısıltı tutulmuyor. Sebebi ise kişilerin özel yaşantısı. Bana soracaksanız bu sistemi ekleyin önemli olan sizin serverinizin hayatı. Oyuncular bunu istedi bence. ;)

Şimdi nasıl yapıldığına bakalım? :)

Server/game/src/log.cpp açılır ve aratılır;

C++:
void LogManager::ShoutLog(BYTE bChannel, BYTE bEmpire, const char * pszText)
{
    if(log_level < 2)
        return;
    m_sql.EscapeString(__escape_hint, sizeof(__escape_hint), pszText, strlen(pszText));

    Query("INSERT INTO shout_log%s VALUES(NOW(), %d, %d,'%s')", get_table_postfix(), bChannel, bEmpire, __escape_hint);
}
Altına şu kodlar eklenir:
C++:
//MMO Tutkunları - Fısıltı log fonksiyonu
void LogManager::FisiltiLog(const char * from, const char * to, const char * message)
{
    m_sql.EscapeString(__escape_hint, sizeof(__escape_hint), message, strlen(message));

    Query("INSERT INTO fisilti_log (mesaji_gonderen, mesaji_alan, mesaj_icerigi) VALUES ('%s', '%s', '%s')", from, to, __escape_hint);
}

Server/game/src/log.h açılır ve aratılır;
C++:
void        ShoutLog(BYTE bChannel, BYTE bEmpire, const char * pszText);
Altına şu kodlar eklenir:
C++:
//MMO Tutkunları - Fısıltı log fonksiyonu
        void        FisiltiLog(const char * from, const char * to, const char * message);

Server/game/src/input_main.cpp açılır ve aratılır;
C++:
if (LC_IsEurope() != true)
                {
                    sys_log(0, "WHISPER: %s -> %s : %s", ch->GetName(), pinfo->szNameTo, buf);
                }
altına şu kodlar eklenir:
Kod:
LogManager::instance().FisiltiLog(ch->GetName(), pinfo->szNameTo, buf);

Bu işlemleri yaptıktan sonra Navicat programı ile serverimizin Mysql sunucusuna bağlanıp "log" veritabanına giriyoruz. Program ile aşağıda verdiğim sql kodlarını query çalıştırarak "fisilti_log" tablosunu oluşturuyoruz.

Kod:
DROP TABLE IF EXISTS `fisilti_log`;
CREATE TABLE `fisilti_log` (
  `id` int(20) NOT NULL AUTO_INCREMENT,
  `time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `mesaji_gonderen` varchar(24) NOT NULL DEFAULT 'error',
  `mesaji_alan` varchar(24) NOT NULL DEFAULT 'error',
  `mesaj_icerigi` varchar(250) NOT NULL DEFAULT 'empty_msg_error',
  PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;
 
Son düzenleme:
Paylaşırsan çok iyi olur :D
Normalde böyle birşey eklediğimizde Avrupa İnsan Hakları yasasının gizlilik, özel hayatın korunması ilkelerini ihlal etmiş oluyoruz. Bir oyuncu dava açarsa davayı kazanma ihtimali yüksek. Bana soracaksanız ben kendim ekledim hatta diğer chat türlerininde kayıtlarını alıyorum. Sonuçta yönetimi kandırmaya çalışan insan çok.

Zaten Metin2'nin kaynak kodlarını incelerseniz Avrupa hariç diğer bölgelerde özel konuşmalar kayıt altına alınıyor. :)
 
Normalde böyle birşey eklediğimizde Avrupa İnsan Hakları yasasının gizlilik, özel hayatın korunması ilkelerini ihlal etmiş oluyoruz. Bir oyuncu dava açarsa davayı kazanma ihtimali yüksek. Bana soracaksanız ben kendim ekledim hatta diğer chat türlerininde kayıtlarını alıyorum. Sonuçta yönetimi kandırmaya çalışan insan çok.

Zaten Metin2'nin kaynak kodlarını incelerseniz Avrupa hariç diğer bölgelerde özel konuşmalar kayıt altına alınıyor. :)

Doğru söyledin riskli iş.
 
Konu içeriği yeni kod editörüne uygun olarak düzenlenmiştir.
Artık kodları daha detaylı ve düzgün bir şekilde görebileceksiniz. :)
 
Sizin dediginiz kod bende mevcut degildi bende verdigim şu kodun altında ekledim @Whistle bi kontrol edermisiniz yanlış birşey yapmayalım :D
Kod:
if (LC_IsEurope() != true)
                {
                    sys_log(0, "WHISPER: %s -> %s : %s", ch->GetName(), pinfo->szNameTo, buf);

C++:
            if (ch->IsGM())
                bType = (bType & 0xF0) | WHISPER_TYPE_GM;

            if (buflen > 0)
            {
                TPacketGCWhisper pack;

                pack.bHeader = HEADER_GC_WHISPER;
                pack.wSize = sizeof(TPacketGCWhisper) + buflen;
                pack.bType = bType;
                strlcpy(pack.szNameFrom, ch->GetName(), sizeof(pack.szNameFrom));

                // desc->BufferedPacketÀ» ÇÏÁö ¾Ê°í ¹öÆÛ¿¡ ½á¾ßÇÏ´Â ÀÌÀ¯´Â
                // P2P relayµÇ¾î ÆĞŶÀÌ Ä¸½¶È µÉ ¼ö Àֱ⠶§¹®ÀÌ´Ù.
                TEMP_BUFFER tmpbuf;

                tmpbuf.write(&pack, sizeof(pack));
                tmpbuf.write(buf, buflen);

                pkDesc->Packet(tmpbuf.read_peek(), tmpbuf.size());

                // @warme006
                // sys_log(0, "WHISPER: %s -> %s : %s", ch->GetName(), pinfo->szNameTo, buf);
                LogManager::instance().FisiltiLog(ch->GetName(), pinfo->szNameTo, buf);

birde

C++:
                // @warme006
                // sys_log(0, "WHISPER: %s -> %s : %s", ch->GetName(), pinfo->szNameTo, buf);

bu kod neden iptal edilmiş ?
 
Sys_Log kaydı tutmasın diye iptal edilmiş olabilir
 
Tamamdır peki ekledigim yerde herhangi bir problem varmı ? sistem sorunsuz çalışıyor yinede bilgi almak isterim.
 
Ben hala kullanıyorum :)
Test zamanında binlerce satır sohbet kaydı tuttu ve sıkıntı çıkmadı.
 
Merhaba,

Bu sistem oyuncu sayısı çok olan sunucularda fazla veri kaydına sebep olabilir. Oyunda gecikme, kasma veya farklı durumlara sebep olur mu?
 
Merhaba,

Sunucunun işlemci güçlü olduğu sürece sorun olmaz. Fakat güçlü bir işlemci de maliyet demektir. İyileştirme yapılabilir, kullanışlı. Teşekkür ederim @Whistle .
 
Teşekkür ederiz şimdi yönetimi kandırmaya çalışanlar düşünsün :D
 
Geri
Üst