Advertisement
iCasTiel

cBan v0.1

Jan 17th, 2014
212
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 15.72 KB | None | 0 0
  1. #include a_samp
  2. #include zcmd
  3. #include sscanf2
  4.  
  5. #define Kick(%0) SetTimerEx("Kicka", 100, false, "i", %0)
  6. #define Ban(%0) SetTimerEx("Bana", 100, false, "i", %0)
  7.  
  8. new DB:cBan;
  9.  
  10. new Query[512];
  11.  
  12. public OnFilterScriptInit() {
  13.  
  14.     print("\n--------------------------------------");
  15.     print("      cBan carregado com sucesso!");
  16.     print("--------------------------------------\n");
  17.    
  18.     cBan = db_open("cBan.db");
  19.  
  20.     db_free_result(db_query(cBan, "CREATE TABLE IF NOT EXISTS usuarios_banidos (id INTEGER PRIMARY KEY, nome TEXT, admin TEXT, motivo TEXT, tempo NUMERIC)"));
  21.     db_free_result(db_query(cBan, "CREATE TABLE IF NOT EXISTS ips_banidos (id INTEGER PRIMARY KEY, ip TEXT, admin TEXT, motivo TEXT, tempo NUMERIC)"));
  22.  
  23.     return 1;
  24. }
  25.  
  26. public OnFilterScriptExit() {
  27.  
  28.     db_close(cBan);
  29.     return 1;
  30. }
  31.  
  32. public OnPlayerConnect(playerid) {
  33.  
  34.     new meuNome[MAX_PLAYER_NAME], DBResult:Consulta, meuIP[16];
  35.  
  36.     GetPlayerName(playerid, meuNome, MAX_PLAYER_NAME);
  37.     GetPlayerIp(playerid, meuIP, 16);
  38.    
  39.     format (Query, 512, "SELECT * FROM usuarios_banidos WHERE nome = '%s'", meuNome);
  40.     Consulta = db_query(cBan, Query);
  41.    
  42.     if ( db_num_rows(Consulta) > 0 ) {
  43.    
  44.         new Admin[MAX_PLAYER_NAME], Motivo[64], Tempo;
  45.        
  46.         db_get_field_assoc(Consulta, "admin", Admin, MAX_PLAYER_NAME);
  47.         db_get_field_assoc(Consulta, "motivo", Motivo, 64);
  48.         db_get_field_assoc(Consulta, "tempo", Query, 512);
  49.         Tempo = strval(Query);
  50.        
  51.         if ( Tempo != -1 ) {
  52.        
  53.             if ( gettime() >= Tempo ) {
  54.            
  55.                 format (Query, 512, "DELETE FROM usuarios_banidos WHERE nome = '%s'", meuNome);
  56.                 db_free_result(db_query(cBan, Query));
  57.                 SendClientMessage(playerid, 0xD40000FF, "Sua conta foi desbanida! Não cometa os mesmos erros!");
  58.             }
  59.             else {
  60.            
  61.                 format (Query, 512, "{FFFFFF}Sua conta esta banida!\n{FF0000}Informações de banimento:\n{FFFFFF}Nome da conta: {FF0000}%s\n{FFFFFF}Administrador responsável: {FF0000}%s\n{FFFFFF}Motivo do banimento:{FF0000}%s\n{FFFFFF}Data de desbanimento: {FF0000}%s", meuNome, Admin, Motivo, timestampToDate(Tempo) );
  62.                 ShowPlayerDialog(playerid, 9999, DIALOG_STYLE_MSGBOX, "{FF0000}Você esta banido!", Query, "Fechar", #);
  63.                 Kick(playerid);
  64.             }
  65.         }
  66.         else {
  67.        
  68.             format (Query, 512, "{FFFFFF}Sua conta esta banida!\n{FF0000}Informações de banimento:\n{FFFFFF}Nome da conta: {FF0000}%s\n{FFFFFF}Administrador responsável: {FF0000}%s\n{FFFFFF}Motivo do banimento:{FF0000}%s\n{FFFFFF}Data de desbanimento: {FF0000}Nunca", meuNome, Admin, Motivo );
  69.             ShowPlayerDialog(playerid, 9999, DIALOG_STYLE_MSGBOX, "{FF0000}Você esta banido!", Query, "Fechar", #);
  70.             Kick(playerid);
  71.        
  72.         }
  73.     }
  74.     db_free_result(Consulta);
  75.    
  76.     format (Query, 512, "SELECT * FROM ips_banidos WHERE ip = '%s'", meuIP);
  77.     Consulta = db_query(cBan, Query);
  78.  
  79.     if ( db_num_rows(Consulta) > 0 ) {
  80.  
  81.         new Admin[MAX_PLAYER_NAME], Motivo[64], Tempo;
  82.  
  83.         db_get_field_assoc(Consulta, "admin", Admin, MAX_PLAYER_NAME);
  84.         db_get_field_assoc(Consulta, "motivo", Motivo, 64);
  85.         db_get_field_assoc(Consulta, "tempo", Query, 512);
  86.         Tempo = strval(Query);
  87.  
  88.         if ( Tempo != -1 ) {
  89.  
  90.             if ( gettime() >= Tempo ) {
  91.  
  92.                 format (Query, 512, "DELETE FROM ips_banidos WHERE ip = '%s'", meuIP);
  93.                 db_free_result(db_query(cBan, Query));
  94.                 SendClientMessage(playerid, 0xD40000FF, "Seu IP foi desbanido! Não cometa os mesmos erros!");
  95.             }
  96.             else {
  97.  
  98.                 format (Query, 512, "{FFFFFF}Seu IP esta banido!\n{FF0000}Informações de banimento:\n{FFFFFF}IP: {FF0000}%s\n{FFFFFF}Administrador responsável: {FF0000}%s\n{FFFFFF}Motivo do banimento:{FF0000}%s\n{FFFFFF}Data de desbanimento: {FF0000}%s", meuIP, Admin, Motivo, timestampToDate(Tempo) );
  99.                 ShowPlayerDialog(playerid, 9999, DIALOG_STYLE_MSGBOX, "{FF0000}Você esta banido!", Query, "Fechar", #);
  100.                 Kick(playerid);
  101.             }
  102.         }
  103.         else {
  104.  
  105.             format (Query, 512, "{FFFFFF}Seu IP esta banido!\n{FF0000}Informações de banimento:\n{FFFFFF}IP: {FF0000}%s\n{FFFFFF}Administrador responsável: {FF0000}%s\n{FFFFFF}Motivo do banimento:{FF0000}%s\n{FFFFFF}Data de desbanimento: {FF0000}Nunca", meuIP, Admin, Motivo );
  106.             ShowPlayerDialog(playerid, 9999, DIALOG_STYLE_MSGBOX, "{FF0000}Você esta banido!", Query, "Fechar", #);
  107.             Kick(playerid);
  108.  
  109.         }
  110.     }
  111.     db_free_result(Consulta);
  112.     return 1;
  113. }
  114.  
  115. public OnPlayerSpawn(playerid) {
  116.  
  117.     SendClientMessage(playerid, 0x00B655FF, "Este servidor utiliza o sistema cBan, desenvolvido por CasTiel!");
  118.     SendClientMessage(playerid, 0x00B655FF, "Você pode ver todos os comandos disníveis do sistema utilizando /ajudaban!");
  119.     return 1;
  120. }
  121.  
  122. /* Funções */
  123.  
  124. stock banirConta(nome[], admin[], motivo[], tempo = -1 ) {
  125.  
  126.     format (Query, 512, "INSERT INTO usuarios_banidos (nome, admin, motivo, tempo) VALUES ('%s', '%s', '%s', '%d')", nome, admin, motivo, tempo);
  127.     db_free_result(db_query(cBan, Query));
  128.  
  129.     return 1;
  130. }
  131.  
  132. stock banirIP(ip[], admin[], motivo[], tempo = -1) {
  133.  
  134.     format (Query, 512, "INSERT INTO ips_banidos (ip, admin, motivo, tempo) VALUES ('%s', '%s', '%s', '%d')", ip, admin, motivo, tempo);
  135.     db_free_result(db_query(cBan, Query));
  136.  
  137.     return 1;
  138. }
  139.  
  140. stock desbanirConta(conta[]) {
  141.  
  142.     format (Query, 512, "DELETE FROM usuarios_banidos WHERE nome = '%s'", conta);
  143.     db_free_result(db_query(cBan, Query));
  144.     return 1;
  145. }
  146.  
  147. stock desbanirIP(ip[]) {
  148.  
  149.     format (Query, 512, "DELETE FROM ips_banidos WHERE ip = '%s'", ip);
  150.     db_free_result(db_query(cBan, Query));
  151.     return 1;
  152. }
  153.  
  154. stock timestampToDate(time) {
  155.  
  156.     new date[20], DBResult:Data, str[55];
  157.    
  158.     format (str, 55, "SELECT datetime(%d, 'unixepoch', 'localtime')" ,time);
  159.     Data = db_query(cBan, str);
  160.     db_get_field(Data, 0, date, 20);
  161.     db_free_result(Data);
  162.     return date;
  163. }
  164.  
  165. /* Fim funções */
  166.  
  167. /* Comandos */
  168. CMD:ban(playerid, params[]) {
  169.  
  170.     if (!IsPlayerAdmin(playerid))
  171.         return SendClientMessage(playerid, 0xFF0000FF, "Comando restrito a administradores RCON!");
  172.  
  173.     new id_, motivo_[64];
  174.  
  175.     if (sscanf(params, "us[64]", id_, motivo_))
  176.         return SendClientMessage(playerid, 0xFF0000FF, "Uso correto: /ban [ID/NOME] [MOTIVO]");
  177.  
  178.     if (!IsPlayerConnected(id_))
  179.         return SendClientMessage(playerid, 0xFF0000FF, "Jogador offline!");
  180.  
  181.     new nome_[MAX_PLAYER_NAME], meuNome[MAX_PLAYER_NAME];
  182.     GetPlayerName(id_, nome_, MAX_PLAYER_NAME);
  183.     GetPlayerName(playerid, meuNome, MAX_PLAYER_NAME);
  184.  
  185.     new DBResult:verificarConta;
  186.  
  187.     format (Query, 512, "SELECT * FROM usuarios_banidos WHERE nome = '%s'", nome_);
  188.     verificarConta = db_query(cBan, Query);
  189.  
  190.     if ( db_num_rows(verificarConta) > 0 )
  191.         return SendClientMessage(playerid, 0xFF0000FF, "Esta conta ja se encontra BANIDO!");
  192.  
  193.     db_free_result(verificarConta);
  194.  
  195.     banirConta(nome_, meuNome, motivo_);
  196.  
  197.     format (Query, 512, "AdmCmd: %s[ID: %d] foi banido por %s[ID: %d] motivo: %s", nome_, id_, meuNome, playerid, motivo_);
  198.     SendClientMessageToAll(0xFF6347AA, Query);
  199.     Kick(id_);
  200.  
  201.     return 1;
  202. }
  203.  
  204. CMD:bantemp(playerid, params[]) {
  205.  
  206.     if (!IsPlayerAdmin(playerid))
  207.         return SendClientMessage(playerid, 0xFF0000FF, "Comando restrito a administradores RCON!");
  208.  
  209.     new id_, motivo_[64], dias_;
  210.  
  211.     if (sscanf(params, "uds[64]", id_, dias_, motivo_))
  212.         return SendClientMessage(playerid, 0xFF0000FF, "Uso correto: /bantemp [ID/NOME] [DIAS] [MOTIVO]");
  213.  
  214.     if (dias_ <= 0)
  215.         return SendClientMessage(playerid, 0xFF0000FF, "Número de dias inválido!");
  216.  
  217.     if (!IsPlayerConnected(id_))
  218.         return SendClientMessage(playerid, 0xFF0000FF, "Jogador offline!");
  219.  
  220.     new nome_[MAX_PLAYER_NAME], meuNome[MAX_PLAYER_NAME];
  221.     GetPlayerName(id_, nome_, MAX_PLAYER_NAME);
  222.     GetPlayerName(playerid, meuNome, MAX_PLAYER_NAME);
  223.  
  224.     new DBResult:verificarConta;
  225.  
  226.     format (Query, 512, "SELECT * FROM usuarios_banidos WHERE nome = '%s'", nome_);
  227.     verificarConta = db_query(cBan, Query);
  228.  
  229.     if ( db_num_rows(verificarConta) > 0 )
  230.         return SendClientMessage(playerid, 0xFF0000FF, "Esta conta ja se encontra BANIDO!");
  231.  
  232.     db_free_result(verificarConta);
  233.  
  234.     banirConta(nome_, meuNome, motivo_, (gettime() + (dias_ * 86400)));
  235.  
  236.     format (Query, 512, "AdmCmd: %s[ID: %d] foi banido temporariamente (%d dia(s)) por %s[ID: %d] motivo: %s", nome_, id_, dias_, meuNome, playerid, motivo_);
  237.     SendClientMessageToAll(0xFF6347AA, Query);
  238.     Kick(id_);
  239.  
  240.     return 1;
  241. }
  242.  
  243. CMD:banconta(playerid, params[]) {
  244.  
  245.     if (!IsPlayerAdmin(playerid))
  246.         return SendClientMessage(playerid, 0xFF0000FF, "Comando restrito a administradores RCON!");
  247.  
  248.     new conta_[MAX_PLAYER_NAME], motivo_[64];
  249.  
  250.     if (sscanf(params, "s[24]s[64]", conta_, motivo_))
  251.         return SendClientMessage(playerid, 0xFF0000FF, "Uso correto: /banconta [NOME DA CONTA] [MOTIVO]");
  252.  
  253.     new DBResult:verificarConta;
  254.  
  255.     format (Query, 512, "SELECT * FROM usuarios_banidos WHERE nome = '%s'", conta_);
  256.     verificarConta = db_query(cBan, Query);
  257.  
  258.     if ( db_num_rows(verificarConta) > 0 )
  259.         return SendClientMessage(playerid, 0xFF0000FF, "Esta conta ja se encontra BANIDO!");
  260.  
  261.     db_free_result(verificarConta);
  262.  
  263.     new meuNome[MAX_PLAYER_NAME];
  264.     GetPlayerName(playerid, meuNome, MAX_PLAYER_NAME);
  265.  
  266.     banirConta(conta_, meuNome, motivo_);
  267.  
  268.     format (Query, 512, "AdmCmd: %s foi banido por %s[ID: %d] motivo: %s", conta_, meuNome, playerid, motivo_);
  269.     SendClientMessageToAll(0xFF6347AA, Query);
  270.  
  271.     new i, NOME2_[MAX_PLAYER_NAME];
  272.  
  273.     for ( i = 0; i < MAX_PLAYERS; ++i) {
  274.  
  275.         if (IsPlayerConnected(i)) {
  276.  
  277.             GetPlayerName(i, NOME2_, MAX_PLAYER_NAME);
  278.             if (!strcmp(conta_, NOME2_))
  279.                 Kick(i);
  280.         }
  281.     }
  282.  
  283.     return 1;
  284. }
  285.  
  286. CMD:bantempconta(playerid, params[]) {
  287.  
  288.     if (!IsPlayerAdmin(playerid))
  289.         return SendClientMessage(playerid, 0xFF0000FF, "Comando restrito a administradores RCON!");
  290.  
  291.     new conta_[MAX_PLAYER_NAME], motivo_[64], dias_;
  292.  
  293.     if (sscanf(params, "s[24]ds[64]", conta_, dias_, motivo_))
  294.         return SendClientMessage(playerid, 0xFF0000FF, "Uso correto: /bantempconta [NOME DA CONTA] [DIAS] [MOTIVO]");
  295.  
  296.     if (dias_ <= 0)
  297.         return SendClientMessage(playerid, 0xFF0000FF, "Número de dias inválido!");
  298.  
  299.     new DBResult:verificarConta;
  300.  
  301.     format (Query, 512, "SELECT * FROM usuarios_banidos WHERE nome = '%s'", conta_);
  302.     verificarConta = db_query(cBan, Query);
  303.  
  304.     if ( db_num_rows(verificarConta) > 0 )
  305.         return SendClientMessage(playerid, 0xFF0000FF, "Esta conta ja se encontra BANIDO!");
  306.  
  307.     db_free_result(verificarConta);
  308.  
  309.     new meuNome[MAX_PLAYER_NAME];
  310.     GetPlayerName(playerid, meuNome, MAX_PLAYER_NAME);
  311.  
  312.     banirConta(conta_, meuNome, motivo_, (gettime() + (dias_ * 86400)));
  313.  
  314.     format (Query, 512, "AdmCmd: %s foi banido temporariamente (%d dia(s)) por %s[ID: %d] motivo: %s", conta_, dias_, meuNome, playerid, motivo_);
  315.     SendClientMessageToAll(0xFF6347AA, Query);
  316.  
  317.     new i, NOME2_[MAX_PLAYER_NAME];
  318.  
  319.     for ( i = 0; i < MAX_PLAYERS; ++i) {
  320.  
  321.         if (IsPlayerConnected(i)) {
  322.  
  323.             GetPlayerName(i, NOME2_, MAX_PLAYER_NAME);
  324.             if (!strcmp(conta_, NOME2_))
  325.                 Kick(i);
  326.         }
  327.     }
  328.  
  329.     return 1;
  330. }
  331.  
  332. CMD:banip(playerid, params[]) {
  333.  
  334.     if (!IsPlayerAdmin(playerid))
  335.         return SendClientMessage(playerid, 0xFF0000FF, "Comando restrito a administradores RCON!");
  336.  
  337.     new ip_[16], motivo_[64];
  338.  
  339.     if (sscanf(params, "s[16]s[64]", ip_, motivo_))
  340.         return SendClientMessage(playerid, 0xFF0000FF, "Uso correto: /banip [IP] [MOTIVO]");
  341.  
  342.     new DBResult:verificarIP;
  343.  
  344.     format (Query, 512, "SELECT * FROM ips_banidos WHERE ip = '%s'", ip_);
  345.     verificarIP = db_query(cBan, Query);
  346.  
  347.     if ( db_num_rows(verificarIP) > 0 )
  348.         return SendClientMessage(playerid, 0xFF0000FF, "Este IP ja se encontra BANIDO!");
  349.  
  350.     db_free_result(verificarIP);
  351.  
  352.     new meuNome[MAX_PLAYER_NAME];
  353.     GetPlayerName(playerid, meuNome, MAX_PLAYER_NAME);
  354.  
  355.     banirIP(ip_, meuNome, motivo_);
  356.  
  357.     format (Query, 512, "AdmCmd: O IP %s foi banido por %s[ID: %d] motivo: %s", ip_, meuNome, playerid, motivo_);
  358.     SendClientMessageToAll(0xFF6347AA, Query);
  359.  
  360.     new i, IP2_[16];
  361.  
  362.     for ( i = 0; i < MAX_PLAYERS; ++i) {
  363.  
  364.         if (IsPlayerConnected(i)) {
  365.  
  366.             GetPlayerIp(i, IP2_, 16);
  367.             if (!strcmp(ip_, IP2_))
  368.                 Kick(i);
  369.         }
  370.     }
  371.  
  372.     return 1;
  373. }
  374.  
  375. CMD:baniptemp(playerid, params[]) {
  376.  
  377.     if (!IsPlayerAdmin(playerid))
  378.         return SendClientMessage(playerid, 0xFF0000FF, "Comando restrito a administradores RCON!");
  379.  
  380.     new ip_[16], motivo_[64], dias_;
  381.  
  382.     if (sscanf(params, "s[16]ds[64]", ip_, dias_, motivo_))
  383.         return SendClientMessage(playerid, 0xFF0000FF, "Uso correto: /banip [IP] [DIAS] [MOTIVO]");
  384.  
  385.     if (dias_ <= 0)
  386.         return SendClientMessage(playerid, 0xFF0000FF, "Número de dias inválido!");
  387.  
  388.     new DBResult:verificarIP;
  389.  
  390.     format (Query, 512, "SELECT * FROM ips_banidos WHERE ip = '%s'", ip_);
  391.     verificarIP = db_query(cBan, Query);
  392.  
  393.     if ( db_num_rows(verificarIP) > 0 )
  394.         return SendClientMessage(playerid, 0xFF0000FF, "Este IP ja se encontra BANIDO!");
  395.  
  396.     db_free_result(verificarIP);
  397.  
  398.     new meuNome[MAX_PLAYER_NAME];
  399.     GetPlayerName(playerid, meuNome, MAX_PLAYER_NAME);
  400.  
  401.     banirIP(ip_, meuNome, motivo_, (gettime() + (dias_ * 86400)));
  402.  
  403.     format (Query, 512, "AdmCmd: O IP %s foi banido temporariamente( %d dia(s) ) por %s[ID: %d] motivo: %s", ip_, dias_, meuNome, playerid, motivo_);
  404.     SendClientMessageToAll(0xFF6347AA, Query);
  405.  
  406.     new i, IP2_[16];
  407.  
  408.     for ( i = 0; i < MAX_PLAYERS; ++i) {
  409.  
  410.         if (IsPlayerConnected(i)) {
  411.  
  412.             GetPlayerIp(i, IP2_, 16);
  413.             if (!strcmp(ip_, IP2_))
  414.                 Kick(i);
  415.         }
  416.     }
  417.  
  418.     return 1;
  419. }
  420.  
  421. CMD:desbanconta(playerid, params[]) {
  422.  
  423.     if (!IsPlayerAdmin(playerid))
  424.         return SendClientMessage(playerid, 0xFF0000FF, "Comando restrito a administradores RCON!");
  425.  
  426.     if (isnull(params))
  427.         return SendClientMessage(playerid, 0xFF0000FF, "Uso correto: /desbanconta [CONTA]");
  428.  
  429.     new DBResult:verificarConta;
  430.  
  431.     format (Query, 512, "SELECT * FROM usuarios_banidos WHERE nome = '%s'", params);
  432.     verificarConta = db_query(cBan, Query);
  433.  
  434.     if ( db_num_rows(verificarConta) > 0 ) {
  435.  
  436.         desbanirConta(params);
  437.         format (Query, 512, "AdmCmd: A conta %s foi desbanida com sucesso!", params);
  438.         SendClientMessage(playerid, 0xFF6347AA, Query);
  439.     }
  440.     else
  441.         SendClientMessage(playerid, 0xFF0000FF, "Nenhum usuário com este nome esta banido!");
  442.  
  443.     db_free_result(verificarConta);
  444.  
  445.     return 1;
  446. }
  447.  
  448. CMD:desbanip(playerid, params[]) {
  449.  
  450.     if (!IsPlayerAdmin(playerid))
  451.         return SendClientMessage(playerid, 0xFF0000FF, "Comando restrito a administradores RCON!");
  452.  
  453.     if (isnull(params))
  454.         return SendClientMessage(playerid, 0xFF0000FF, "Uso correto: /desbanip [IP]");
  455.  
  456.     new DBResult:verificarIP;
  457.  
  458.     format (Query, 512, "SELECT * FROM ips_banidos WHERE ip = '%s'", params);
  459.     verificarIP = db_query(cBan, Query);
  460.  
  461.     if ( db_num_rows(verificarIP) > 0 ) {
  462.  
  463.         desbanirIP(params);
  464.         format (Query, 512, "AdmCmd: O IP %s foi desbanido com sucesso!", params);
  465.         SendClientMessage(playerid, 0xFF6347AA, Query);
  466.     }
  467.     else
  468.         SendClientMessage(playerid, 0xFF0000FF, "IP informado não esta banido!");
  469.  
  470.     db_free_result(verificarIP);
  471.  
  472.     return 1;
  473. }
  474.  
  475. CMD:ajudaban(playerid) {
  476.  
  477.     if (!IsPlayerAdmin(playerid))
  478.         return SendClientMessage(playerid, 0xFF0000FF, "Comando restrito a administradores RCON!");
  479.  
  480.     ShowPlayerDialog(playerid, 9999, DIALOG_STYLE_MSGBOX, "Menu de ajuda do cBan!", "\t{FF0000}Comandos disponíveis!\n{FFFFFF}/ban\n{FFFFFF}/bantemp\n{FFFFFF}/banconta\n{FFFFFF}/bantempconta\n{FFFFFF}/banip\n{FFFFFF}/baniptemp\n{FFFFFF}/desbanconta\n{FFFFFF}/desbanip", "Fechar", #);
  481.  
  482.     return 1;
  483. }
  484.  
  485. forward Kicka(p); public Kicka(p) {
  486.     #undef Kick
  487.     Kick(p);
  488.     #define Kick(%0) SetTimerEx("Kicka", 100, false, "i", %0)
  489.     return 1;
  490. }
  491.  
  492. forward Bana(p); public Bana(p) {
  493.     #undef Ban
  494.     Ban(p);
  495.     #define Ban(%0) SetTimerEx("Bana", 100, false, "i", %0)
  496.     return 1;
  497. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement