Sistema de mensajería privada
#1
Sistema de mensajería privada


. Descripción

Con este sencillo plugin podremos comunicarnos con alguna persona de forma privada

. Comando(s)

Escribiendo /mp o /mensajeria en say & say team se abrirá un menú, una vez abierto se podrá seleccionar un jugador para escribirle un mensaje a través de un messagemode

. Cvar(s)

1) amx_cvar_mensajeria < 1 (Default)|0 >

. Changelog


Código:
versión 1.0
     - Publicación del plugin
versión 1.1
     - Optimización: Obtención del nombre de los jugadores
     - Optimización: Cambio de g_data[ 33 ] -> g_data[ 33 char ]
versión 1.2
     - Agregado: Sistema para bloquear players
versión 1.3
     - Agregado: Anti spam (Los números, ".com", ".ar", "www", serán representados por '*')

. Forma de configurar el anti spam

Código:
Simplemente buscamos la linea
Código PHP:
new const BlockCaracters[ ][ ] = { "1""2""3""4""5""6""7""8""9""0""www"".com"".ar" }; 
Código:
Agregamos o borramos lo que queremos que se represente con un '*'

. Créditos

Código:
- Gonza.-* (Idea sobre no permitir que X player te envié mensajes privados )
      - Neeeeeeeeel.- (Observación de la variable g_data)
      - [R]ak (Stock de MensajeValido)

Saludos,
cLAANS.-


Archivos adjuntos
.sma   Descargar AMXX / MensajeriaPrivada1.2.sma (Tamaño: 4.85 KB / Descargas: 364)
.sma   Descargar AMXX / MensajeriaPrivada1.3.sma (Tamaño: 5.09 KB / Descargas: 173)
Mi unico plugin.
Tutorial de niveles.

Ayudo, pero no de la manera que quieren, si quieren aprender les servirá lo mio, para pedir el codigo en bandeja tienen la sección 'Pedidos'

(09/11/2017, 09:30 PM)SoundBlaster escribió: Espera y llamo a los power rangers para que me digan la linea de error
Responder
#2
Interesante idea
[TUT] Carnage

Fight

"El limite de los backdoors de gente q sabe programar como nostros lo impone nuestra maldad interior y creeme q soy muy malo en el interior"

Anónimo
Responder
#3
g_data podría ser char ya que se usa para el listado de jugadores, que no pueden superar los 32.

Ya que hacés un cache para ver quien está conectado y quién no, podrías hacer un caché con la lista de jugadores en vez de estar llamando todo el tiempo a get_players.
[Imagen: paypalqr.png]
Responder
#4
Buen plugin.

"Publicación publica" es una redundancia.
Cuando se publica algo es automáticamente público y no más privado.

Ni te molestes en enviarme un mensaje privado para pedirme ayuda porque NO lo voy a contestar.
Gracias por su atención.
Responder
#5
(21/07/2014, 11:12 AM)Neeeeeeeeeel.- escribió: g_data podría ser char ya que se usa para el listado de jugadores, que no pueden superar los 32.

Ya que hacés un cache para ver quien está conectado y quién no, podrías hacer un caché con la lista de jugadores en vez de estar llamando todo el tiempo a get_players.

No entendí muy bien lo segundo, pero la hice de esta nueva forma, creo que es mejor, no llamo a get_players cada vez que se abre el menu y tampoco a get_user_name.

A eso te referías ?

Saludos,
cLAANS.-
Mi unico plugin.
Tutorial de niveles.

Ayudo, pero no de la manera que quieren, si quieren aprender les servirá lo mio, para pedir el codigo en bandeja tienen la sección 'Pedidos'

(09/11/2017, 09:30 PM)SoundBlaster escribió: Espera y llamo a los power rangers para que me digan la linea de error
Responder
#6
(21/07/2014, 01:14 PM)cLAANS escribió: No entendí muy bien lo segundo, pero la hice de esta nueva forma, creo que es mejor, no llamo a get_players cada vez que se abre el menu y tampoco a get_user_name.

A eso te referías ?

Saludos,
cLAANS.-
Nop.

http://es.wikipedia.org/wiki/Cach%C3%A9

Es más, ahora si el usuario cambia de nombre no se refleja en el menú.
[Imagen: paypalqr.png]
Responder
#7
Gracias por el aporte me sirvio mucho, estaria bueno que tenga una bandeja de entrar donde le podrias dejar los mp a los que no esten conectados.
Responder
#8
(21/07/2014, 01:20 PM)Neeeeeeeeeel.- escribió:
(21/07/2014, 01:14 PM)cLAANS escribió: No entendí muy bien lo segundo, pero la hice de esta nueva forma, creo que es mejor, no llamo a get_players cada vez que se abre el menu y tampoco a get_user_name.

A eso te referías ?

Saludos,
cLAANS.-
Nop.

http://es.wikipedia.org/wiki/Cach%C3%A9

Es más, ahora si el usuario cambia de nombre no se refleja en el menú.

mmm, no se como hacer eso que me pedís, por otra parte si se mostraría el nombre

Código PHP:
public client_infochangedid )
{
    if( !
g_conectadoid } ) 
        return 
PLUGIN_HANDLED;
    
    static 
iName32 ];
    static const 
sCacheName[ ] = "name";
    
    
get_user_infoidsCacheNameiNamecharsmaxiName ) );
    
    if( !
equalg_nombreid ], iName ) )
        
copyg_nombreid ], charsmaxg_nombre[ ] ), iName );
    
    return 
PLUGIN_CONTINUE;


(21/07/2014, 01:33 PM)Xplod escribió: Gracias por el aporte me sirvio mucho, estaria bueno que tenga una bandeja de entrar donde le podrias dejar los mp a los que no esten conectados.

Pls, veo que hago >.<, nunca es tarde para innovar

Saludos,
cLAANS.-
Mi unico plugin.
Tutorial de niveles.

Ayudo, pero no de la manera que quieren, si quieren aprender les servirá lo mio, para pedir el codigo en bandeja tienen la sección 'Pedidos'

(09/11/2017, 09:30 PM)SoundBlaster escribió: Espera y llamo a los power rangers para que me digan la linea de error
Responder
#9
Buen plugin, Les va a servir a muchos Rainbow
Responder
#10
Parece mejor que "amx_psay" y más cómodo de usar, buen plugin!
Believe, be yourself and don't hold on to just one dream ❤

https://github.com/FEDERICOMB96
Responder
#11
(21/07/2014, 02:36 PM)Federicomb escribió: Parece mejor que "amx_psay" y más cómodo de usar, buen plugin!
amx_psay es solo para admins.
[Imagen: paypalqr.png]
Responder
#12
(21/07/2014, 03:31 PM)Neeeeeeeeeel.- escribió:
(21/07/2014, 02:36 PM)Federicomb escribió: Parece mejor que "amx_psay" y más cómodo de usar, buen plugin!
amx_psay es solo para admins.

Ya sé, por eso es mejor, es más útil.
Believe, be yourself and don't hold on to just one dream ❤

https://github.com/FEDERICOMB96
Responder
#13
Muy buen plugin Proud
lo usare para el party qe ablen por privado :p Fuck yeah
Responder
#14
Excelente idea!

PD:
Código PHP:
new iData], iAccessiCallbackg_name32 ];
menu_item_getinfomenuitemiAccessiData5g_name63iCallback ); 
-->
Código PHP:
new iData], Junk;
menu_item_getinfomenuitemJunkiData5""0Junk ); 
Son datos que no utilizas Lengua
Responder
#15
(21/07/2014, 07:12 PM)Mario AR. escribió: Excelente idea!

PD:
Código PHP:
new iData], iAccessiCallbackg_name32 ];
menu_item_getinfomenuitemiAccessiData5g_name63iCallback ); 
-->
Código PHP:
new iData], Junk;
menu_item_getinfomenuitemJunkiData5""0Junk ); 
Son datos que no utilizas Lengua
Directamente podría eliminar la native menu_item_getinfo.

Con qué necesidad creás una referencia estática local que usas solo una vez?
[Imagen: paypalqr.png]
Responder
#16
(21/07/2014, 07:55 PM)Neeeeeeeeeel.- escribió:
(21/07/2014, 07:12 PM)Mario AR. escribió: Excelente idea!

PD:
Código PHP:
new iData], iAccessiCallbackg_name32 ];
menu_item_getinfomenuitemiAccessiData5g_name63iCallback ); 
-->
Código PHP:
new iData], Junk;
menu_item_getinfomenuitemJunkiData5""0Junk ); 
Son datos que no utilizas Lengua
Directamente podría eliminar la native menu_item_getinfo.

Una vez lo hice; pero se veia más desordenado y requería de una matriz global; peor que llamar a una native a mi parecer (O hay otra forma O.O?).

(21/07/2014, 07:55 PM)Neeeeeeeeeel.- escribió: Con qué necesidad creás una referencia estática local que usas solo una vez?
Dafuq
Responder
#17
(21/07/2014, 07:59 PM)Mario AR. escribió: Una vez lo hice; pero se veia más desordenado y requería de una matriz global; peor que llamar a una native a mi parecer (O hay otra forma O.O?).
Como está usando un loop de 1 a la cantidad máxima de jugadores, el parámetro "item" incrementado en 1 es el ID del jugador.

(21/07/2014, 07:59 PM)Mario AR. escribió:
(21/07/2014, 07:55 PM)Neeeeeeeeeel.- escribió: Con qué necesidad creás una referencia estática local que usas solo una vez?
Dafuq
Código PHP:
static const sCacheName[ ] = "name"
[Imagen: paypalqr.png]
Responder
#18
(21/07/2014, 08:07 PM)Neeeeeeeeeel.- escribió:
(21/07/2014, 07:59 PM)Mario AR. escribió: Una vez lo hice; pero se veia más desordenado y requería de una matriz global; peor que llamar a una native a mi parecer (O hay otra forma O.O?).
Como está usando un loop de 1 a la cantidad máxima de jugadores, el parámetro "item" incrementado en 1 es el ID del jugador.

Eso se cumple si los IDs de los jugadores conectados van desde el 1 y son consecutivos. Imagina que estén conectados los IDs 1, 3 y 5. El ID 1 abre el menú, el key 2 sería para el index 5 pero item+1 sería 2.
Responder
#19
Tenés razón, me confundí.
[Imagen: paypalqr.png]
Responder
#20
(21/07/2014, 10:49 AM)cLAANS escribió:
Sistema de mensajería privada


. Descripción

Con este sencillo plugin podremos comunicarnos con alguna persona de forma privada

. Comando(s)

Escribiendo /mp o /mensajeria en say & say team se abrirá un menú, una vez abierto se podrá seleccionar un jugador para escribirle un mensaje a través de un messagemode

. Cvar(s)

1) amx_cvar_mensajeria < 1 (Default)|0 >

. Changelog


Código:
versión 1.0
     - Publicación del plugin
versión 1.1
     - Optimización de la obtención del nombre de los jugadores
     - Optimización g_data[ 33 ] -> g_data[ 33 char ]

. Imágenes


[Imagen: MensajeriaTest2.jpg]
[Imagen: MensajeriaTest.jpg]

Saludos,
cLAANS.-


Muy bien plugin y a mi parecer muy Original .. Pero Solo deberias dejar el "fixeado" no 2 versiones .. es una recomendacion..

Saludos Cordiales..!
Responder
#21
Yo hice uno parecido hace un monton... creo que la unica diferencia es que podes bloquear a un jugador para que no te mande mas MP... y no es con menu, aca lo dejo por si sirve de algo... Los names con mas de 12 caracteres no estan permitidos
Código PHP:
/* Script generated by Pawn Studio */

#include <amxmodx>
#include <amxmisc>
#include <fakemeta>
#include <colorchat>

#define PLUGIN    "Mensajes Privados"
#define AUTHOR    "Gonza.-*"
#define VERSION    "1.0.0"

new const szPrefix[] = "[MP]"

new gName[33][33], gBlock[33]
new 
gLast[33], gLastName[33][33]

new 
g_MaxPlayers

public plugin_init()
{
    
register_plugin(PLUGINVERSIONAUTHOR)
    
    
register_forward(FM_ClientUserInfoChanged"fw_PlayerInfoChanged")
    
    
register_clcmd("say""cmdSay")
    
register_clcmd("say_team""cmdSay")
    
    
g_MaxPlayers get_maxplayers()
}

public 
cmdSay(id)
{
    static 
szArgs[192]; read_args(szArgscharsmax(szArgs))
    
remove_quotes(szArgs); trim(szArgs)
    
    if (
equali(szArgs".msg"4) || equali(szArgs"/msg"4))
    {
        
formatex(szArgscharsmax(szArgs), "%s"szArgs[4])
        
trim(szArgs)
        
        if (
szArgs[0] != '"')
        {
            
ColorChat(idGREEN"%s^x01 Formato: .msg^x04 ^"^x01..Aca el nombre..^x04^"^x03 Mensaje..."szPrefix)
            return 
PLUGIN_HANDLED
        
}
        
        static 
szName[33]
        
        if (!
parse(szArgsszNamecharsmax(szName))) return PLUGIN_CONTINUE
        
        
static i
        
for (1<= g_MaxPlayersi++)
        {
            if (!
is_user_connected(i)) continue
            
            if (
containi(gName[i], szName) != -1)
            {
                if (
gBlock[i] & id)
                {
                    
ColorChat(idGREEN"%s^x01 El usuario^x04 %s^x01 Te tiene bloqueado"szPrefixgName[i])
                    return 
PLUGIN_HANDLED
                
}
                static 
Color:COLORCOLOR get_user_team(id) == RED BLUE
                remove_quotes
(szArgs); trim(szArgs)
                
ColorChat(iCOLOR"^x04%s^x03 %s^x01: %s"szPrefixgName[id], szArgs[strlen(szName) + 2])
                
ColorChat(idCOLOR"^x04%s^x03 %s -> %s^x01: %s"szPrefixgName[id], gName[i], szArgs[strlen(szName) + 2])
                
gLast[i] = id
                gLastName
[i] = gName[id]
                return 
PLUGIN_HANDLED
            
}
        }
    }
    else if (
equali(szArgs".rm"3) || equali(szArgs"/rm"3))
    {
        if (!
is_user_connected(gLast[id]) || !equali(gLastName[id], gName[gLast[id]]))
        {
            
ColorChat(idGREEN"%s^x01 El jugador al que intentas responder se desconecto o cambio de nombre"szPrefix)
            return 
PLUGIN_HANDLED
        
}
        
        if (
gBlock[gLast[id]] & id)
        {
            
ColorChat(idGREEN"%s^x01 El usuario^x04 %s^x01 Te tiene bloqueado"szPrefixgName[gLast[id]])
            return 
PLUGIN_HANDLED
        
}
        
        
formatex(szArgscharsmax(szArgs), "%s"szArgs[3])
        
trim(szArgs)
        
        static 
Color:COLORCOLOR get_user_team(id) == RED BLUE
        remove_quotes
(szArgs); trim(szArgs)
        
ColorChat(gLast[id], COLOR"^x04%s^x03 %s^x01: %s"szPrefixgName[id], szArgs)
        
ColorChat(idCOLOR"^x04%s^x03 %s -> %s^x01: %s"szPrefixgName[id], gName[gLast[id]], szArgs)
        
gLast[gLast[id]] = id
        gLastName
[gLast[id]] = gName[id]
        return 
PLUGIN_HANDLED
    
}
    else if (
equali(szArgs".name"5) || equali(szArgs".nombre"7) || equali(szArgs"/name"5) || equali(szArgs"/nombre"7))
    {
        if (
szArgs[4] == 'e'formatex(szArgscharsmax(szArgs), "%s"szArgs[5])
        else if (
szArgs[4] == 'b'formatex(szArgscharsmax(szArgs), "%s"szArgs[7])
        
trim(szArgs)
        
        
client_cmd(id"name ^"%s^""szArgs)
        return 
PLUGIN_HANDLED
    
}
    else if (
equali(szArgs".block"6) || equali(szArgs".bloquear"9) || equali(szArgs"/block"6) || equali(szArgs"/bloquear"9))
    {
        if (
szArgs[5] == 'k'formatex(szArgscharsmax(szArgs), "%s"szArgs[6])
        else if (
szArgs[4] == 'u'formatex(szArgscharsmax(szArgs), "%s"szArgs[9])
        
trim(szArgs)
        
        if (
szArgs[0] != '"')
        {
            
ColorChat(idGREEN"%s^x01 Formato: .block o .bloquear^x04 ^"^x01..Aca el nombre..^x04^""szPrefix)
            return 
PLUGIN_HANDLED
        
}
        
        static 
szName[33]
        
        if (!
parse(szArgsszNamecharsmax(szName))) return PLUGIN_CONTINUE
        
        
static i
        
for (1<= g_MaxPlayersi++)
        {
            if (!
is_user_connected(i)) continue
            
            if (
containi(gName[i], szName) != -1)
            {
                static 
Color:COLORCOLOR = (gBlock[id] & i) ? BLUE RED
                remove_quotes
(szArgs); trim(szArgs)
                
ColorChat(idCOLOR"^x04%s^x03 %s^x01 a^x04 %s"szPrefix, (gBlock[id] & i) ? "DESBLOQUEASTE" "BLOQUEASTE"gName[i])
                if (
gBlock[id] & igBlock[id] &= ~i
                
else gBlock[id] |= i
                
return PLUGIN_HANDLED
            
}
        }
    }
    return 
PLUGIN_CONTINUE
}

public 
fw_PlayerInfoChanged(idbuffer)
{
    static 
szName[33]
    
engfunc(EngFunc_InfoKeyValuebuffer"name"szNamecharsmax(szName))
    
    if (
equal(gName[id], szName)) return FMRES_IGNORED
    
else if (strlen(szName) > 12)
    {
        
ColorChat(idRED"^x04%s^x01 Tu nombre no puede contener mas de^x03 12^x01 caracteres."szPrefix)
        
engfunc(EngFunc_SetClientKeyValueidbuffer"name"gName[id])
        
client_cmd(id"name %s"gName[id])
        return 
FMRES_SUPERCEDE
    
}
    
gName[id] = szName
    
return FMRES_IGNORED
}

public 
client_disconnect(id)
{
    static 
i
    
for (1<= g_MaxPlayersi++)
    {
        if (
gBlock[i] & idgBlock[i] |= ~id
    
}
}

public 
client_putinserver(id)
{
    
get_user_name(idgName[id], charsmax(gName[]))
    
    if (
strlen(gName[id]) > 12)
    {
        
client_print(idprint_console"Tu nombre contiene mas de 12 caracteres, debe contener 12 o menos.")
        
server_cmd("kick #%d ^"Tu nombre contiene mas de 12 caracteresdebe contener 12 o menos.^""get_user_userid(id))
        return
    }
    
    
gLast[id] = 0
    gLastName
[id] = ""

ColorChat(id, GREEN, "%s^x01 Formato: .msg^x04 ^"^x01..Aca el nombre..^x04^"^x03 Mensaje...", szPrefix)
Responder
#22
Creo que la versión de cLAANS con la opción de bloquear a un jugador sería excelente! (Por UserID para que se liberen del bloqueo con un reconnect).

EDIT: Eso se puede hacer con bits ^^ no hace falta crear una matriz. Sólo edita el menú de jugadores, pones un if en el título para cambiarlo según sea el menú de bloquear jugadores o el de elegir un jugador para enviar un mensaje. Y le agregas un formatex antes del menu_additem, para poner [Bloqueado] en el menú para bloquear y [No Disponible] para los que te tienen bloqueado en el menú para elegir el receptor.

Te puedes guiar de mi plugin del sXe Admin Menu o el desaprobado Marica + Mute.
Responder
#23
UPDATE, revisen si encuentra errores o algo para mejorar.

Saludos,
cLAANS.-
Mi unico plugin.
Tutorial de niveles.

Ayudo, pero no de la manera que quieren, si quieren aprender les servirá lo mio, para pedir el codigo en bandeja tienen la sección 'Pedidos'

(09/11/2017, 09:30 PM)SoundBlaster escribió: Espera y llamo a los power rangers para que me digan la linea de error
Responder
#24
Recivir -> Recibir

Ni te molestes en enviarme un mensaje privado para pedirme ayuda porque NO lo voy a contestar.
Gracias por su atención.
Responder
#25
Ya fue editado en el plugin, lo note en la imagen, pero no tenia ganas de sacar otra foto.

Saludos,
cLAANS.-
Mi unico plugin.
Tutorial de niveles.

Ayudo, pero no de la manera que quieren, si quieren aprender les servirá lo mio, para pedir el codigo en bandeja tienen la sección 'Pedidos'

(09/11/2017, 09:30 PM)SoundBlaster escribió: Espera y llamo a los power rangers para que me digan la linea de error
Responder


Salto de foro:


Usuarios navegando en este tema: 3 invitado(s)