/* Sistema de mensagens privadas - básico em MySQL Necessário alterar os dados de conexão para que funcione corretamente - v1.0 - Início Comandos /mp e /minhasmp (enviadas, recebidas, e não lidas); Comando /ativarmp, /desativarmp (/mps) para desativar/ativar o recebimento e envio de mensagens privadas Informação ao se conectar se tem novas mensagens; */ #include a_samp #include sscanf2 #include a_mysql #include zcmd /******************************************************************************/ /************************ Dados de conexão ************************************/ /******************************************************************************/ #define MYSQL_HOST "localhost" // Seu host MySQL #define MYSQL_USER "root" // Usuário MySQL #define MYSQL_PASS "" // Senha #define MYSQL_DB "bmt_teste" // Database /******************************************************************************/ /******************************************************************************/ new con_mysql; // Armazena o ID da conexão #define DialogOpMsg 15240 #define DialogMsgEnviada 15241 #define DialogMsgRecebida 15242 #define DialogMsgNaoLidas 15243 #define DialogMsgRetorno 15244 public OnFilterScriptInit() { print("Sistema de mensagens privadas: CARREGADO"); con_mysql = mysql_connect(MYSQL_HOST, MYSQL_USER, MYSQL_DB, MYSQL_PASS); if(mysql_errno(con_mysql)) return print("OCORREU UM ERRO DURANTE A TENTATIVA DE CONEXÃO COM A DB!"); // Criar as tabelas mysql_query(con_mysql, "CREATE TABLE IF NOT EXISTS `mp_contas` (`id` int(11) NOT NULL AUTO_INCREMENT,`user` varchar(24) NOT NULL,`novas_mensagens` int(11) NOT NULL,PRIMARY KEY (`id`)) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1;", false); mysql_query(con_mysql, "CREATE TABLE IF NOT EXISTS `mp_msgs` (`id` int(11) NOT NULL AUTO_INCREMENT,`de_contaid` int(11) NOT NULL,`para_contaid` int(11) NOT NULL,`horario` int(11) NOT NULL,`data` varchar(20) NOT NULL,`lida` int(11) NOT NULL,`Mensagem` varchar(128) NOT NULL,PRIMARY KEY (`id`)) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;", false); return 1; } public OnFilterScriptExit() { print("Sistema de mensagens privadas: DESCARREGADO"); mysql_close(con_mysql); return 1; } public OnPlayerConnect(playerid) { new Cache:n, str[128], Nome[24]; GetPlayerName(playerid, Nome, 24); mysql_format(con_mysql, str, sizeof(str), "SELECT id,novas_mensagens FROM mp_contas WHERE user='%s' LIMIT 1", Nome); n = mysql_query(con_mysql, str, true); if(cache_num_rows(con_mysql) > 0) { SetPVarInt(playerid, "mp_system_contaid", cache_get_field_content_int(0, "id", con_mysql)); if(cache_get_field_content_int(0, "novas_mensagens", con_mysql) > 0) { format(str, sizeof(str), "** Você tem %i novas mensagens privadas",cache_get_field_content_int(0, "novas_mensagens", con_mysql)); SendClientMessage(playerid,-1,str); SetPVarInt(playerid, "mp_system_novas",cache_get_field_content_int(0, "novas_mensagens", con_mysql)); } } else { new Cache:rn; mysql_format(con_mysql, str, sizeof(str), "INSERT INTO mp_contas (user) VALUES ('%s')", Nome); rn = mysql_query(con_mysql, str, true); SetPVarInt(playerid, "mp_system_contaid", cache_insert_id(con_mysql)); cache_delete(rn, con_mysql); } cache_delete(n, con_mysql); SetPVarInt(playerid, "mp_system_bloqueado", 0); return 1; } public OnPlayerDisconnect(playerid, reason) { DeletePVar(playerid, "mp_system_contaid"); DeletePVar(playerid, "mp_system_novas"); DeletePVar(playerid, "mp_system_bloqueado"); return 1; } // Dialogs public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[]) { switch(dialogid) { case DialogOpMsg: { if(!response) return 1; switch(listitem) { case 0: { // Recebidas SetPVarInt(playerid, "mp_system_paglist", 0); carregar_MsgRecebidas(playerid, false); } case 1: { // Enviadas SetPVarInt(playerid, "mp_system_paglist", 0); carregar_MsgEnviadas(playerid); } case 2: { // Não lidas SetPVarInt(playerid, "mp_system_paglist", 0); carregar_MsgRecebidas(playerid, true); } } } case DialogMsgEnviada: { if(!response) return cmd_minhasmp(playerid,""); if(listitem >= 21) return SetPVarInt(playerid, "mp_system_paglist", GetPVarInt(playerid, "mp_system_paglist")+20), carregar_MsgEnviadas(playerid); new query[220], Cache:info, Dialog[180], Nome[24], Mensagem[128], Data[20]; mysql_format(con_mysql, query, sizeof(query), "SELECT `mp_msgs`.*,`mp_contas`.`user` FROM `mp_msgs` INNER JOIN `mp_contas` ON `mp_msgs`.`para_contaid` = `mp_contas`.`id` WHERE `mp_msgs`.`de_contaid` = %i ORDER BY `mp_msgs`.`id` DESC LIMIT %i,20",GetPVarInt(playerid, "mp_system_contaid"), GetPVarInt(playerid, "mp_system_paglist")); info = mysql_query(con_mysql, query, true); if(cache_num_rows(con_mysql) > 0 && listitem < cache_num_rows(con_mysql)) { cache_get_field_content(listitem, "Mensagem", Mensagem, con_mysql); cache_get_field_content(listitem, "user", Nome, con_mysql, 24); cache_get_field_content(listitem, "data", Data, con_mysql, 20); format(Dialog, sizeof(Dialog), "Mensagem enviada para %s em %s\nMensagem: %s", Nome, Data, Mensagem); ShowPlayerDialog(playerid, DialogMsgRetorno, DIALOG_STYLE_MSGBOX, "{FFFF00}# {FFFFFF}Visualizando mensagem enviada:", Dialog, "Ok", ""); } else SendClientMessage(playerid, -1, "{FF0000}Ocorreu um erro!"); cache_delete(info, con_mysql); } case DialogMsgRecebida: { if(!response) return cmd_minhasmp(playerid, ""); if(listitem >= 21) return SetPVarInt(playerid, "mp_system_paglist", GetPVarInt(playerid, "mp_system_paglist")+20), carregar_MsgRecebidas(playerid, false); new query[220], Cache:info, Dialog[180], Nome[24], Mensagem[128], Data[20]; mysql_format(con_mysql, query, sizeof(query), "SELECT `mp_msgs`.*,`mp_contas`.`user` FROM `mp_msgs` INNER JOIN `mp_contas` ON `mp_msgs`.`de_contaid` = `mp_contas`.`id` WHERE `mp_msgs`.`para_contaid` = %i ORDER BY `mp_msgs`.`id` DESC LIMIT %i,20",GetPVarInt(playerid, "mp_system_contaid"), GetPVarInt(playerid, "mp_system_paglist")); info = mysql_query(con_mysql, query, true); if(cache_num_rows(con_mysql) > 0 && listitem < cache_num_rows(con_mysql)) { cache_get_field_content(listitem, "Mensagem", Mensagem, con_mysql); cache_get_field_content(listitem, "user", Nome, con_mysql, 24); cache_get_field_content(listitem, "data", Data, con_mysql, 20); format(Dialog, sizeof(Dialog), "Mensagem recebida de %s em %s\nMensagem: %s", Nome, Data, Mensagem); ShowPlayerDialog(playerid, DialogMsgRetorno, DIALOG_STYLE_MSGBOX, "{FFFF00}# {FFFFFF}Visualizando mensagem recebida:", Dialog, "Ok", ""); if(cache_get_field_content_int(listitem, "lida", con_mysql) == 0) { mysql_format(con_mysql, query, sizeof(query), "UPDATE mp_msgs SET lida=1 WHERE id=%i", cache_get_field_content_int(listitem, "id", con_mysql)); mysql_query(con_mysql, query, false); if(GetPVarInt(playerid, "mp_system_novas") > 0) { SetPVarInt(playerid,"mp_system_novas", GetPVarInt(playerid, "mp_system_novas") - 1); mysql_format(con_mysql, query, sizeof(query), "UPDATE mp_contas SET novas_mensagens=%i WHERE id=%i",GetPVarInt(playerid, "mp_system_novas"), GetPVarInt(playerid, "mp_system_contaid")); mysql_query(con_mysql, query, false); } } } else SendClientMessage(playerid, -1, "{FF0000}Ocorreu um erro!"); cache_delete(info, con_mysql); } case DialogMsgNaoLidas: { if(!response) return cmd_minhasmp(playerid, ""); if(listitem >= 21) return SetPVarInt(playerid, "mp_system_paglist", GetPVarInt(playerid, "mp_system_paglist")+20), carregar_MsgRecebidas(playerid, true); new query[250], Cache:info, Dialog[180], Nome[24], Mensagem[128], Data[20]; mysql_format(con_mysql, query, sizeof(query), "SELECT `mp_msgs`.*,`mp_contas`.`user` FROM `mp_msgs` INNER JOIN `mp_contas` ON `mp_msgs`.`de_contaid` = `mp_contas`.`id` WHERE `mp_msgs`.`para_contaid` = %i AND `mp_msgs`.`lida`=0 ORDER BY `mp_msgs`.`id` DESC LIMIT %i,20",GetPVarInt(playerid, "mp_system_contaid"), GetPVarInt(playerid, "mp_system_paglist")); info = mysql_query(con_mysql, query, true); if(cache_num_rows(con_mysql) > 0 && listitem < cache_num_rows(con_mysql)) { cache_get_field_content(listitem, "Mensagem", Mensagem, con_mysql); cache_get_field_content(listitem, "user", Nome, con_mysql, 24); cache_get_field_content(listitem, "data", Data, con_mysql, 20); format(Dialog, sizeof(Dialog), "Mensagem recebida de %s em %s\nMensagem: %s", Nome, Data, Mensagem); ShowPlayerDialog(playerid, DialogMsgRetorno, DIALOG_STYLE_MSGBOX, "{FFFF00}# {FFFFFF}Visualizando mensagem recebida:", Dialog, "Ok", ""); if(cache_get_field_content_int(listitem, "lida", con_mysql) == 0) { mysql_format(con_mysql, query, sizeof(query), "UPDATE mp_msgs SET lida=1 WHERE id=%i", cache_get_field_content_int(listitem, "id", con_mysql)); mysql_query(con_mysql, query, false); if(GetPVarInt(playerid, "mp_system_novas") > 0) { SetPVarInt(playerid,"mp_system_novas", GetPVarInt(playerid, "mp_system_novas") - 1); mysql_format(con_mysql, query, sizeof(query), "UPDATE mp_contas SET novas_mensagens=%i WHERE id=%i",GetPVarInt(playerid, "mp_system_novas"), GetPVarInt(playerid, "mp_system_contaid")); mysql_query(con_mysql, query, false); } } } else SendClientMessage(playerid, -1, "{FF0000}Ocorreu um erro!"); cache_delete(info, con_mysql); } case DialogMsgRetorno: return cmd_minhasmp(playerid, ""); } return 0; } // Stocks carregar_MsgRecebidas(playerid, bool:apenasnaolidas = false) { new str[250], Cache:re; mysql_format(con_mysql, str, sizeof(str), "SELECT `mp_msgs`.`Mensagem`,`mp_contas`.`user` FROM `mp_msgs` INNER JOIN `mp_contas` ON `mp_msgs`.`de_contaid` = `mp_contas`.`id` WHERE `mp_msgs`.`para_contaid` = %i %s ORDER BY `mp_msgs`.`id` DESC LIMIT %i,20", GetPVarInt(playerid, "mp_system_contaid"), (apenasnaolidas == true) ? ("AND `mp_msgs`.`lida`=0") : (""), GetPVarInt(playerid, "mp_system_paglist")); re = mysql_query(con_mysql, str, true); if(cache_num_rows(con_mysql) > 0) { // Se há mensagens new Nome[24], Mensagem[64], Dialog[1500]; for(new i; i < cache_num_rows(con_mysql); i++) { cache_get_field_content(i, "user", Nome, con_mysql, 24); cache_get_field_content(i, "Mensagem", Mensagem, con_mysql, 64); format(Dialog, sizeof(Dialog), "%s%s: %s%s\r\n",Dialog,Nome,Mensagem,(strlen(Mensagem) >= 63) ? ("...") : ("")); } if(cache_num_rows(con_mysql) >= 20) strcat(Dialog, "\r\n{FFFF00}Próxima Página"); ShowPlayerDialog(playerid, (apenasnaolidas == false) ? (DialogMsgRecebida) : (DialogMsgNaoLidas), DIALOG_STYLE_LIST, "{FF0000}# {FFFFFF}Mensagens recebidas", Dialog, "Selecionar", "Cancelar"); } else SendClientMessage(playerid, -1, "{FF0000}[MP] Não há mensagens!"); cache_delete(re, con_mysql); return 1; } carregar_MsgEnviadas(playerid) { new str[250], Cache:en; mysql_format(con_mysql, str, sizeof(str), "SELECT `mp_msgs`.`Mensagem`,`mp_contas`.`user` FROM `mp_msgs` INNER JOIN `mp_contas` ON `mp_msgs`.`para_contaid` = `mp_contas`.`id` WHERE `mp_msgs`.`de_contaid` = %i ORDER BY `mp_msgs`.`id` DESC LIMIT %i,20", GetPVarInt(playerid, "mp_system_contaid"), GetPVarInt(playerid, "mp_system_paglist")); en = mysql_query(con_mysql, str, true); if(cache_num_rows(con_mysql) > 0) { new Nome[24], Mensagem[64], Dialog[1500]; for(new i; i < cache_num_rows(con_mysql); i++) { cache_get_field_content(i, "user", Nome, con_mysql, 24); cache_get_field_content(i, "Mensagem", Mensagem, con_mysql, 64); format(Dialog, sizeof(Dialog), "%s%s: %s%s\r\n", Dialog,Nome,Mensagem,(strlen(Mensagem) >= 63) ? ("...") : ("")); } if(cache_num_rows(con_mysql) >= 20) strcat(Dialog, "\r\n{FFFF00}Próxima Página"); ShowPlayerDialog(playerid, DialogMsgEnviada, DIALOG_STYLE_LIST, "{FF0000}# {FFFFFF}Mensagens enviadas", Dialog, "Selecionar", "Cancelar"); } else SendClientMessage(playerid, -1, "{FF0000}[MP] Não há mensagens!"); cache_delete(en, con_mysql); return 1; } // Comandos CMD:mp(playerid, params[]) { new Msg[144], id, Mensagem[128]; if(GetPVarInt(playerid, "mp_sytem_bloqueado") == 1) return SendClientMessage(playerid, -1, "{FF0000}Você bloqueou as mensagens privadas."); if(sscanf(params, "us[128]", id, Mensagem)) return SendClientMessage(playerid, -1, "{FF0000}* Use: /mp [id/nome] [mensagem]"); if(playerid == id) return SendClientMessage(playerid, -1, "{FF0000}Você não pode enviar mensagem para si mesmo."); if(strlen(Mensagem) >= 127) return SendClientMessage(playerid, -1, "{FF0000}Mensagem grande demais!"); if(!IsPlayerConnected(id)) { // Caso o jogador não esteja 'online', ele irá receber a mensagem assim que se conectar new Nome[24], Cache:ec, q1[250], Data[6]; sscanf(params, "s[24]s[128]", Nome, Mensagem); getdate(Data[2], Data[1], Data[0]); gettime(Data[3], Data[4], Data[5]); mysql_format(con_mysql, q1, sizeof(q1), "SELECT id,novas_mensagens FROM mp_contas WHERE user='%e' LIMIT 1", Nome); ec = mysql_query(con_mysql, q1, true); if(cache_num_rows(con_mysql) > 0) { new pid = cache_get_field_content_int(0, "id", con_mysql), novas = cache_get_field_content_int(0, "novas_mensagens", con_mysql); mysql_format(con_mysql, q1, sizeof(q1), "INSERT INTO mp_msgs (de_contaid,para_contaid,Mensagem,lida,horario,data) VALUES (%i,%i,'%e',0,%i,'%02d/%02d/%d %02d:%02d')", GetPVarInt(playerid, "mp_system_contaid"), pid, Mensagem, gettime(), Data[0], Data[1], Data[2], Data[3], Data[4]); mysql_query(con_mysql, q1, false); mysql_format(con_mysql, q1, sizeof(q1), "UPDATE mp_contas SET novas_mensagens=%i WHERE id=%i", novas+1, pid); mysql_query(con_mysql, q1, false); format(Msg, sizeof(Msg), "{FFFF00}[MP ENVIADO] %s: %s",Nome,Mensagem); SendClientMessage(playerid, -1, Msg); } else SendClientMessage(playerid,-1, "{FF0000}Ocorreu um erro ao enviar uma mensagem privada a este jogador."); cache_delete(ec, con_mysql); return 1; } if(GetPVarInt(id, "mp_system_bloqueado") == 1) return SendClientMessage(playerid, -1, "{FF0000}Este jogador desabilitou o recebimento de mensagens privadas!"); new MyNome[24], OtNome[24]; GetPlayerName(playerid, MyNome, 24); GetPlayerName(id, OtNome, 24); format(Msg, 144, "{FFFF00}*[MP RECEBIDO] %s [%i]: %s", MyNome, playerid, Mensagem); SendClientMessage(id, -1, Msg); format(Msg, 144, "{FFFF00}*[MP ENVIADO] %s [%i]: %s", OtNome, id, Mensagem); SendClientMessage(playerid, -1, Msg); // Efetuar Query new query[200], Data[6]; getdate(Data[2], Data[1], Data[0]); gettime(Data[3], Data[4], Data[5]); mysql_format(con_mysql, query, sizeof(query), "INSERT INTO mp_msgs (de_contaid,para_contaid,Mensagem,lida,horario,data) VALUES (%i,%i,'%e',1,%i,'%02d/%02d/%d %02d:%02d')", GetPVarInt(playerid, "mp_system_contaid"), GetPVarInt(id, "mp_system_contaid"), Mensagem, gettime(), Data[0], Data[1], Data[2], Data[3], Data[4]); mysql_query(con_mysql, query, false); return 1; } CMD:minhasmp(playerid, params[]) return ShowPlayerDialog(playerid, DialogOpMsg, DIALOG_STYLE_LIST, "{FFFF00}# {FFFFFF}Mensagens privadas:", "Recebidas\r\nEnviadas\r\nApenas não lidas", "Selecionar", "Cancelar"); CMD:ativarmp(playerid, params[]) { if(GetPVarInt(playerid, "mp_system_bloqueado") == 0) return SendClientMessage(playerid, -1, "{FF0000}As mensagens privadas já estão ativadas!"); SetPVarInt(playerid, "mp_system_bloqueado", 0); SendClientMessage(playerid, -1, "{FFFF00}Mensagens privadas ativadas!"); return 1; } CMD:desativarmp(playerid, params[]) { if(GetPVarInt(playerid, "mp_system_bloqueado") == 1) return SendClientMessage(playerid, -1, "{FF0000}As mensagens privadas já estão desativadas!"); SetPVarInt(playerid, "mp_system_bloqueado", 1); SendClientMessage(playerid, -1, "{FFFF00}Mensagens privadas desativadas!"); return 1; } CMD:mps(playerid, params[]) return (GetPVarInt(playerid, "mp_system_bloqueado") == 0) ? (cmd_desativarmp(playerid, params)) : (cmd_ativarmp(playerid, params)); /* www.brasilmegatrucker.com Sistema criado por Nícolas Corrêa */