GTAMulti - GTA Türkiye

San Andreas Multiplayer => PAWN Kodlama => Anlatımlar => Konuyu başlatan: jensen - 23 Temmuz 2018, 04:39:37

Başlık: MySQL R41 İle Kayıt Sistemi Oluşturmak
Gönderen: jensen - 23 Temmuz 2018, 04:39:37
SAMP MySQL Kayıt Sistemi Yapma


Selamlar, bu anlatımda son sürüm mysql ile cache mantığını kullanarak kayıt sistemi oluşturacağız.

MySQL nedir?
Açık kaynak kodlu, hızlı ve güvenilir veritabanı yönetim sistemidir.

Gerekli Dosyalar
MySQL R41-4 (https://github.com/p#4180e2G/SA-MP-MySQL/releases/download/R41-4/mysql-R41-4-win32.zip)

Kurulum
1. Yukarıdaki dosyayı indirip içerisindeki herşeyi sunucunuzun ana dizinine atın.

2. Modun include'ları arasına mysql include'ını tanıtalım.

  • #include    <a_mysql>



3. MySQL bağlantı ayarlarını yapalım.

  • #define      MYSQL_HOST                "127.0.0.1"

  • #define      MYSQL_USER                "root"

  • #define      MYSQL_PASSWORD         "123"

  • #define      MYSQL_DATABASE         "sampturk"



4. MySQL bağlantısını tutacak değişkeni tanımlayalım;

  • new MySQL: g_SQL;



5. Oyuncu verilerini tutacak enum'u tanımlayalım;

  • enum OyuncuVerileri

  • {

  •       SQLID,

  •       Isim[MAX_PLAYER_NAME],

  •       Sifre[65],

  •       SifreSakla[17],

  •       Float: Pos[3],

  •       Interior,

  •       Silah,

  •       Cache: Cache_ID

  • };

  • new Oyuncu[MAX_PLAYERS][OyuncuVerileri];



6. Dialog verilerini tutacak enum'u tanımlayalım.

  • enum

  • {

  •       DIALOG_GECERSIZ,

  •       DIALOG_GIRIS,

  •       DIALOG_KAYIT,

  • };



6. OnGameModeInit MySQL bağlantısını yapmayı sağlayacak kodları ekleyelim.

  • new MySQLOpt: option_id = mysql_init_options();

  • mysql_set_option(option_id, AUTO_RECONNECT, true); // MySQL bağlantısında kopma gibi durumlar olduğu zaman otomatik tekrar bağlanır.

  • g_SQL = mysql_connect(MYSQL_HOST, MYSQL_USER, MYSQL_PASSWORD, MYSQL_DATABASE, option_id);

  • if(g_SQL == MYSQL_INVALID_HANDLE || mysql_errno(g_SQL) != 0)

  • {

  •       print("MySQL bağlantısı başarısız, server.exe kapanıyor.");

  •       SendRconCommand("exit");

  •       return 1;

  • }

  • print("MySQL bağlantısı başarılı.");



7. OnGameModeExit oyuncu verilerinin kayıt etmesini sağlayacak kodları ekleyelim.

  • for(new i = 0, j = GetPlayerPoolSize(); i <= j; i++)

  • {

  •       if(IsPlayerConnected(i))

  •       {

  •             OnPlayerDisconnect(i, 1);

  •       }

  • }

  • mysql_close(g_SQL); // MySQL bağlantısını kapatıyoruz.



8. OnPlayerConnect oyuncu verilerinin yüklenmesini sağlayacak kodları ekleyelim.

  • static const empty_player[OyuncuVerileri];

  • Oyuncu[playerid] = empty_player;

  • GetPlayerName(playerid, Oyuncu[playerid][Isim], MAX_PLAYER_NAME);

  • new sorgu[120]; // Aşağıda oyuncunun kayıtlı olup olmadığını kontrol edecek sorguyu gönderiyoruz.

  • mysql_format(g_SQL, sorgu, sizeof(sorgu), "SELECT * FROM `oyuncular` WHERE `isim` = '%s' LIMIT 1", Oyuncu[playerid][Isim]);

  • mysql_tquery(g_SQL, sorgu, "OyuncuVeriYukle", "d", playerid);



9. OnPlayerDisconnect oyuncu çıkış yaptığında verilerinin kayıt olmasını sağlayacak kodları ekleyelim.

  • OyuncuGuncelle(playerid);

  • if(cache_is_valid(Oyuncu[playerid][Cache_ID]))

  • {

  •       cache_delete(Oyuncu[playerid][Cache_ID]); // Önbellekte ki verileri siliyoruz.

  •       Oyuncu[playerid][Cache_ID] = MYSQL_INVALID_CACHE;

  • }



10. OnPlayerSpawn oyuncu spawn olduğunda son kaydedilen konumda spawn olmasını sağlayacak kodları ekleyelim.

  • SetPlayerInterior(playerid, Oyuncu[playerid][Interior]);

  • SetPlayerPos(playerid, Oyuncu[playerid][Pos][0], Oyuncu[playerid][Pos][1], Oyuncu[playerid][Pos][2]);

  • SetCameraBehindPlayer(playerid);

  • GivePlayerWeapon(playerid, Oyuncu[playerid][Silah], 30);



11. OnDialogResponse oyuncunun giriş ve kayıt işlemlerini diyalog üzerinden yapılmasını sağlayacak kodları ekleyelim.

  • switch(dialogid)

  • {

  •       case DIALOG_GECERSIZ: return 1;

  •       case DIALOG_GIRIS:

  •       {

  •             if(!response) return Kick(playerid);

  •             new sifresakla[65];

  •             SHA256_PassHash(inputtext, Oyuncu[playerid][SifreSakla], sifresakla, 65);

  •             if(strcmp(sifresakla, Oyuncu[playerid][Sifre]) == 0)

  •             {

  •                   SendClientMessage(playerid, -1, "Başarıyla giriş yaptınız.");

  •                   cache_set_active(Oyuncu[playerid][Cache_ID]); // Verileri çekmek için önbelleği aktif ediyoruz.

  •                   cache_get_value_int(0, "id", Oyuncu[playerid][SQLID]);

  •                   cache_get_value_float(0, "x", Oyuncu[playerid][Pos][0]);

  •                   cache_get_value_float(0, "y", Oyuncu[playerid][Pos][1]);

  •                   cache_get_value_float(0, "z", Oyuncu[playerid][Pos][2]);

  •                   cache_get_value_int(0, "interior", Oyuncu[playerid][Interior]);

  •                   cache_get_value_int(0, "silah", Oyuncu[playerid][Silah]);

  •                   cache_delete(Oyuncu[playerid][Cache_ID]); // Verileri çektikten sonra önbelleği siliyoruz.

  •                   Oyuncu[playerid][Cache_ID] = MYSQL_INVALID_CACHE;

  •                   SetSpawnInfo(playerid, NO_TEAM, 0, Oyuncu[playerid][Pos][0], Oyuncu[playerid][Pos][1], Oyuncu[playerid][Pos][2], 0, 0, 0, 0, 0, 0, 0);

  •                   SpawnPlayer(playerid);

  •             }

  •             else

  •             {

  •                   ShowPlayerDialog(playerid, DIALOG_GIRIS, DIALOG_STYLE_PASSWORD, "Giriş", "Hatalı şifre!\nGiriş yapmak için lütfen şifrenizi girin:", "Giriş", "Çıkış");

  •             }

  •       }

  •       case DIALOG_KAYIT:

  •       {

  •             if(!response) return Kick(playerid);

  •             if(strlen(inputtext) <= 5) return ShowPlayerDialog(playerid, DIALOG_KAYIT, DIALOG_STYLE_PASSWORD, "Kayıt", "Şifrenizin uzunluğu 5 karakterden fazla olmalıdır.\nKayıt olmak için lütfen şifrenizi girin:", "Kayıt", "Çıkış");

  •             for(new i = 0; i < 16; i++) Oyuncu[playerid][SifreSakla] = random(94) + 33; // Şifreyi hashliyoruz yani karmaşık bir düzene sokuyoruz.

  •             SHA256_PassHash(inputtext, Oyuncu[playerid][SifreSakla], Oyuncu[playerid][Sifre], 65);

  •             new sorgu[250]; // Aşağıda oyuncunun veritabanına kayıt olması için bir sorgu gönderiyoruz.

  •             mysql_format(g_SQL, sorgu, sizeof(sorgu), "INSERT INTO `oyuncular` (`isim`, `sifre`, `sifresakla`) VALUES ('%s', '%s', '%e')", Oyuncu[playerid][Isim], Oyuncu[playerid][Sifre], Oyuncu[playerid][SifreSakla]);

  •             mysql_tquery(g_SQL, sorgu, "OyuncuKaydet", "d", playerid);

  •       }

  • }



12. OyuncuVeriYukle oyuncu verilerinin yüklenmesini sağlayacak publici oluşturalım.

  • forward OyuncuVeriYukle(playerid);

  • public OyuncuVeriYukle(playerid)

  • {

  •       new mesaj[150];

  •       if(cache_num_rows() > 0) // Sorgudan gelen verinin var olup olmadığını kontrol ediyoruz, var ise oyuncunun kayıtlı olduğu dialogu göstereceğiz.

  •       {

  •             cache_get_value(0, "sifre", Oyuncu[playerid][Sifre], 65);

  •             cache_get_value(0, "sifresakla", Oyuncu[playerid][SifreSakla], 17);

  •             Oyuncu[playerid][Cache_ID] = cache_save(); // Önbelleği kayıt ediyoruz, tekrar kullanmak için.

  •             format(mesaj, sizeof(mesaj), "%s adlı oyuncu kayıtlı. Giriş için lütfen şifrenizi girin:", Oyuncu[playerid][Isim]);

  •             ShowPlayerDialog(playerid, DIALOG_GIRIS, DIALOG_STYLE_PASSWORD, "Giriş", mesaj, "Giriş", "Çıkış");

  •       }

  •       else

  •       {

  •             format(mesaj, sizeof(mesaj), "Hoşgeldin %s, şifreni girerek kayıt olabilirsin:", Oyuncu[playerid][Isim]);

  •             ShowPlayerDialog(playerid, DIALOG_KAYIT, DIALOG_STYLE_PASSWORD, "Kayıt", mesaj, "Kayıt", "Çıkış");

  •       }

  •       return 1;

  • }



13. OyuncuKaydet oyuncu verilerinin yüklenmesini sağlayacak publici oluşturalım.

  • forward OyuncuKaydet(playerid);

  • public OyuncuKaydet(playerid)

  • {

  •       Oyuncu[playerid][SQLID] = cache_insert_id(); // Oyuncu yeni kayıt olduğu zaman AUTO_INCREMENT ile sıradaki ID'yi SQLID'değişkenine atıyoruz.

  •       SendClientMessage(playerid, -1, "Başarıyla kayıt oldunuz, otomatik giriş yapıldı.");

  •       Oyuncu[playerid][Pos][0] = 1510.3158;

  •       Oyuncu[playerid][Pos][1] = -1668.4236;

  •       Oyuncu[playerid][Pos][2] = 14.0469;

  •       SetSpawnInfo(playerid, NO_TEAM, 0, Oyuncu[playerid][Pos][0], Oyuncu[playerid][Pos][1], Oyuncu[playerid][Pos][2], 0, 0, 0, 0, 0, 0, 0);

  •       SpawnPlayer(playerid);

  •       return 1;

  • }



14. OyuncuGuncelle oyuncu verilerinin güncellenmesini sağlayacak fonksiyonu oluşturalım.

  • OyuncuGuncelle(playerid)

  • {

  •       Oyuncu[playerid][Silah] = GetPlayerWeapon(playerid);

  •       GetPlayerPos(playerid, Oyuncu[playerid][Pos][0], Oyuncu[playerid][Pos][1], Oyuncu[playerid][Pos][2]);

  •       new sorgu[190];

  •       mysql_format(g_SQL, sorgu, sizeof(sorgu), "UPDATE `oyuncular` SET `x` = %f, `y` = %f, `z` = %f, `interior` = %d, `silah` = %d WHERE `id` = %d LIMIT 1", Oyuncu[playerid][Pos][0], Oyuncu[playerid][Pos][1], Oyuncu[playerid][Pos][2], GetPlayerInterior(playerid), Oyuncu[playerid][Silah], Oyuncu[playerid][SQLID]);

  •       mysql_tquery(g_SQL, sorgu);

  •       return 1;

  • }



15. Şimdi phpMyAdmin üzerinden veritabanı ve sütunları oluşturalım.


Son
Anlatımda kafanıza takılan soruları veya hataları konu altından belirtebilirsiniz, adımları takip ederseniz sorunsuz bir şekilde yapabilirsiniz. İyi kullanımlar.


İçerik kodlarının kullanıldığı ve eklemeler yapıldığı kaynak; https://goo.gl/5KUSuX
Başlık: Ynt: MySQL R41 İle Kayıt Sistemi Oluşturmak
Gönderen: pag - 23 Temmuz 2018, 09:56:41
Anlatım için teşekkürler, kod içeren kısımları [/pawn] içerisine alırsan daha iyi olabilir.
Başlık: Ynt: MySQL R41 İle Kayıt Sistemi Oluşturmak
Gönderen: jensen - 23 Temmuz 2018, 09:59:18
Alıntı yapılan: ReDDooM - 23 Temmuz 2018, 09:56:41

Anlatım için teşekkürler, kod içeren kısımları [/pawn] içerisine alırsan daha iyi olabilir.

Bu şekilde daha sade bir görünüm veriyor, konu zaten add-on konusu değil.
Başlık: Ynt: MySQL R41 İle Kayıt Sistemi Oluşturmak
Gönderen: ace - 23 Temmuz 2018, 11:35:38
Alıntı yapılan: jensen - 23 Temmuz 2018, 09:59:18

Alıntı yapılan: ReDDooM - 23 Temmuz 2018, 09:56:41

Anlatım için teşekkürler, kod içeren kısımları [/pawn] içerisine alırsan daha iyi olabilir.

Bu şekilde daha sade bir görünüm veriyor, konu zaten add-on konusu değil.

Bencede [/pawn ] veya [ /code] görünümünden daha güzel görünüyor.
Ellerine sağlık ÖM bakarmısın?
Başlık: Ynt: MySQL R41 İle Kayıt Sistemi Oluşturmak
Gönderen: Matite - 23 Temmuz 2018, 11:54:39
Eline sağlık.
Başlık: Ynt: MySQL R41 İle Kayıt Sistemi Oluşturmak
Gönderen: starhan01 - 07 Ağustos 2018, 12:59:18
Anlatım için Teşekkürler.
Başlık: Ynt: MySQL R41 İle Kayıt Sistemi Oluşturmak
Gönderen: Akro - 09 Ağustos 2018, 15:36:51
Eline, emeğine sağlık güzel anlatım olmuş. :)
Başlık: Ynt: MySQL R41 İle Kayıt Sistemi Oluşturmak
Gönderen: [R]ussell_Savrinn - 09 Ağustos 2018, 15:47:55
Eline sağlık! Çok yararlı bir konu olmuş  :helal:
Başlık: Ynt: MySQL R41 İle Kayıt Sistemi Oluşturmak
Gönderen: SpooK - 23 Ağustos 2018, 00:22:52
Paylaşım için teşekkürler

Oyundan çıkarken çıktığımız yeri kaydetmiyor x y z olarak
Başlık: Ynt: MySQL R41 İle Kayıt Sistemi Oluşturmak
Gönderen: _Code - 24 Ağustos 2018, 00:40:52
Hoş bir anlatım olmuş, eline sağlık.
Başlık: Ynt: MySQL R41 İle Kayıt Sistemi Oluşturmak
Gönderen: Zoxy - 24 Ağustos 2018, 10:51:33
Anlatım için teşekkürler.
Başlık: Ynt: MySQL R41 İle Kayıt Sistemi Oluşturmak
Gönderen: Mehmet! - 26 Ağustos 2018, 18:33:51
Alıntı yapılan: Matite - 23 Temmuz 2018, 11:54:39

Eline sağlık.
Başlık: Ynt: MySQL R41 İle Kayıt Sistemi Oluşturmak
Gönderen: jensen - 26 Ağustos 2018, 20:55:45
Teşekkürler.
Başlık: Ynt: MySQL R41 İle Kayıt Sistemi Oluşturmak
Gönderen: Codes. - 08 Ekim 2018, 20:13:31
Böyle bir hata alıyorum ama anlamadım

PAWN Kodu: Seç
D:\BordoBereli Gaming - Hırsız Polis\gamemodes\BordoBereliHP.pwn(91) : warning 217: loose indentation
D:\BordoBereli Gaming - Hırsız Polis\gamemodes\BordoBereliHP.pwn(92) : warning 217: loose indentation
D:\BordoBereli Gaming - Hırsız Polis\gamemodes\BordoBereliHP.pwn(115) : warning 217: loose indentation
D:\BordoBereli Gaming - Hırsız Polis\gamemodes\BordoBereliHP.pwn(168) : warning 217: loose indentation
D:\BordoBereli Gaming - Hırsız Polis\gamemodes\BordoBereliHP.pwn(169) : warning 217: loose indentation
D:\BordoBereli Gaming - Hırsız Polis\gamemodes\BordoBereliHP.pwn(171) : warning 219: local variable "sorgu" shadows a variable at a preceding level
D:\BordoBereli Gaming - Hırsız Polis\gamemodes\BordoBereliHP.pwn(182) : warning 217: loose indentation
D:\BordoBereli Gaming - Hırsız Polis\gamemodes\BordoBereliHP.pwn(183) : warning 217: loose indentation
D:\BordoBereli Gaming - Hırsız Polis\gamemodes\BordoBereliHP.pwn(390) : error 010: invalid function or declaration
D:\BordoBereli Gaming - Hırsız Polis\gamemodes\BordoBereliHP.pwn(392) : error 010: invalid function or declaration
D:\BordoBereli Gaming - Hırsız Polis\gamemodes\BordoBereliHP.pwn(393) : error 010: invalid function or declaration
D:\BordoBereli Gaming - Hırsız Polis\gamemodes\BordoBereliHP.pwn(395) : error 010: invalid function or declaration
D:\BordoBereli Gaming - Hırsız Polis\gamemodes\BordoBereliHP.pwn(397) : error 021: symbol already defined: "SHA256_PassHash"
D:\BordoBereli Gaming - Hırsız Polis\gamemodes\BordoBereliHP.pwn(398) : error 010: invalid function or declaration
D:\BordoBereli Gaming - Hırsız Polis\gamemodes\BordoBereliHP.pwn(413) : error 010: invalid function or declaration
D:\BordoBereli Gaming - Hırsız Polis\gamemodes\BordoBereliHP.pwn(418) : error 010: invalid function or declaration
D:\BordoBereli Gaming - Hırsız Polis\gamemodes\BordoBereliHP.pwn(420) : error 010: invalid function or declaration
D:\BordoBereli Gaming - Hırsız Polis\gamemodes\BordoBereliHP.pwn(421) : error 010: invalid function or declaration
D:\BordoBereli Gaming - Hırsız Polis\gamemodes\BordoBereliHP.pwn(422) : error 010: invalid function or declaration
D:\BordoBereli Gaming - Hırsız Polis\gamemodes\BordoBereliHP.pwn(425) : error 021: symbol already defined: "mysql_format"
D:\BordoBereli Gaming - Hırsız Polis\gamemodes\BordoBereliHP.pwn(464) : warning 219: local variable "sorgu" shadows a variable at a preceding level
D:\BordoBereli Gaming - Hırsız Polis\gamemodes\BordoBereliHP.pwn(396) : warning 203: symbol is never used: "sifresakla"
D:\BordoBereli Gaming - Hırsız Polis\gamemodes\BordoBereliHP.pwn(424) : warning 203: symbol is never used: "sorgu"
Pawn compiler 3.10.9 Copyright (c) 1997-2006, ITB CompuPhase


12 Errors.
Başlık: Ynt: MySQL R41 İle Kayıt Sistemi Oluşturmak
Gönderen: hex - 08 Ekim 2018, 23:54:14
Alıntı yapılan: RECEP - 24 Ağustos 2018, 00:40:52

Hoş bir anlatım olmuş, eline sağlık.
Başlık: Ynt: MySQL R41 İle Kayıt Sistemi Oluşturmak
Gönderen: DracDonix - 09 Ekim 2018, 01:07:47
ANlatımın için teşekür ederim
Başlık: Ynt: MySQL R41 İle Kayıt Sistemi Oluşturmak
Gönderen: hellquards - 02 Aralık 2018, 14:27:50
Güzel bir anlatım olmuş eline sağlık 🙏
Başlık: Ynt: MySQL R41 İle Kayıt Sistemi Oluşturmak
Gönderen: ReaptioS - 02 Aralık 2018, 14:45:59
Güzel anlatım  :helal:
Başlık: Ynt: MySQL R41 İle Kayıt Sistemi Oluşturmak
Gönderen: Albert Einstein. - 08 Aralık 2018, 13:31:22
Teşekkürler.
Başlık: Ynt: MySQL R41 İle Kayıt Sistemi Oluşturmak
Gönderen: Cruza - 10 Mayıs 2019, 10:31:30
Güzel anlatım, teşekkürler.
Başlık: Ynt: MySQL R41 İle Kayıt Sistemi Oluşturmak
Gönderen: TheLeaK - 21 Haziran 2019, 13:49:15
Anlatımın çok iyiymiş, yararlı. Başarılarının devamını dilerim.   ;)
Başlık: Ynt: MySQL R41 İle Kayıt Sistemi Oluşturmak
Gönderen: QrzR - 21 Haziran 2019, 17:46:28
Teşekkürler.
Başlık: Ynt: MySQL R41 İle Kayıt Sistemi Oluşturmak
Gönderen: Ryroz - 22 Haziran 2019, 02:37:02
Anlatım için teşekkürler. :helal:
Başlık: Ynt: MySQL R41 İle Kayıt Sistemi Oluşturmak
Gönderen: Unknown - 22 Haziran 2019, 11:37:01
Anlatım için teşekkürler.
Başlık: Ynt: MySQL R41 İle Kayıt Sistemi Oluşturmak
Gönderen: oxygenz - 22 Haziran 2019, 11:38:37
Anlatım çok iyi olmuş teşekkürler.
Başlık: Ynt: MySQL R41 İle Kayıt Sistemi Oluşturmak
Gönderen: FelleR - 27 Haziran 2019, 01:16:14
Yararlı.
Başlık: Ynt: MySQL R41 İle Kayıt Sistemi Oluşturmak
Gönderen: smalark - 18 Aralık 2019, 19:28:36
Konuyu hortlatıyorum fakat bu hatayı alıyorum.
[19:25:53] --- Server Shutting Down.
[19:25:53] plugin.mysql: Unloading plugin...
[19:25:53] plugin.mysql: Plugin unloaded.
Başlık: Ynt: MySQL R41 İle Kayıt Sistemi Oluşturmak
Gönderen: Radless - 18 Aralık 2019, 19:30:47
Alıntı yapılan: smalark - 18 Aralık 2019, 19:28:36
Konuyu hortlatıyorum fakat bu hatayı alıyorum.
[19:25:53] --- Server Shutting Down.
[19:25:53] plugin.mysql: Unloading plugin...
[19:25:53] plugin.mysql: Plugin unloaded.
MySQL Bağlantısını yap.
Başlık: Ynt: MySQL R41 İle Kayıt Sistemi Oluşturmak
Gönderen: smalark - 18 Aralık 2019, 20:04:05
MySQL bağlantısını yaptım fakat bunu diyor, kesin yine bir şeyleri gözden kaçırıyorum.
Başlık: Ynt: MySQL R41 İle Kayıt Sistemi Oluşturmak
Gönderen: furkaen - 08 Mayıs 2020, 01:54:42
admin, skor, para öldürme, ölüm gibi şeylerin eklenmiş hali olan var mıdır?
Başlık: Ynt: MySQL R41 İle Kayıt Sistemi Oluşturmak
Gönderen: oppai - 21 Mayıs 2022, 11:13:01
15. adım olan phpmyadmin kısmı anlatımında sanırsam resim eklediğin için gözükmüyor resimler olmaması dolayısıyla hiçbirşey anlayamadım..
konuyu güncellemeni veya alıntılayarak anlatmanı rica edebilir miyim ?
Başlık: Ynt: MySQL R41 İle Kayıt Sistemi Oluşturmak
Gönderen: Wendiassa - 21 Mayıs 2022, 19:57:34
eyv
Başlık: Ynt: MySQL R41 İle Kayıt Sistemi Oluşturmak
Gönderen: BuRMiLLaT - 30 Temmuz 2022, 20:30:56
Hoş iyi bir anlatım sağol :)
Başlık: Ynt: MySQL R41 İle Kayıt Sistemi Oluşturmak
Gönderen: Aspyrow - 09 Ekim 2022, 01:01:56
sağol
Başlık: Ynt: MySQL R41 İle Kayıt Sistemi Oluşturmak
Gönderen: Synopith - 10 Aralık 2022, 13:52:45
Eyv jensen abi :helal: