Skip to forum content

You are not logged in. Please login or register.


forums.pvpgn.pro → [RU] The Source Code → /announce (coloured)

Pages 1

You must login or register to post a reply

RSS topic feed

Posts: 19

1 (edited by Karaulov 24.02.2012 10:43)

Topic: /announce (coloured)

Думаю кому-нибудь эта тема должна пригодится.

Если сделаете все верно , то получите себе на сервер красный(error) серый(цвет как /me) белый(обычное сообщение) announce:)
пишу практически на понятном русском языке :)
/redann
/whann
/grann

1)добавить после строки (~262)

static int _handle_announce_command(t_connection * c, char const * text);

строки

static int _handle_announcered_command(t_connection * c, char const * text);
static int _handle_announcewhite_command(t_connection * c, char const * text);
static int _handle_announcegray_command(t_connection * c, char const * text);

2)добавить после строки(~384)

    { "/announce"           , _handle_announce_command },

строки

    { "/redann"                , _handle_announcered_command },
    { "/whann"                , _handle_announcewhite_command },
    { "/grann"                , _handle_announcegray_command },

3)после кода(в строке ~2050)

static int _handle_announce_command(t_connection * c, char const *text)
{
  unsigned int i;
  t_message *  message;

  for (i=0; text[i]!=' ' && text[i]!='\0'; i++); /* skip command */
  for (; text[i]==' '; i++);

  if (text[i]=='\0')
  {
    message_send_text(c,message_type_info,c,"usage: /announce <announcement>");
    return 0;
  }

  snprintf(msgtemp, sizeof(msgtemp), "%.64s: %.128s",conn_get_username(c),&text[i]);
  if (!(message = message_create(message_type_broadcast,c,msgtemp)))
    message_send_text(c,message_type_info,c,"Could not broadcast message.");
  else
    {
      if (message_send_all(message)<0)
    message_send_text(c,message_type_info,c,"Could not broadcast message.");
      message_destroy(message);
    }

  return 0;
}

добавить вот это (тупо копирование и изменение названия и типа сообщения и ещё пару моментов)

static int _handle_announcewhite_command(t_connection * c, char const *text)
{
  unsigned int i;
  t_message *  message;

  for (i=0; text[i]!=' ' && text[i]!='\0'; i++); /* skip command */
  for (; text[i]==' '; i++);

  if (text[i]=='\0')
  {
    message_send_text(c,message_type_info,c,"usage: /announce <announcement>");
    return 0;
  }

  snprintf(msgtemp, sizeof(msgtemp), "%.0s%.128s%.0s",conn_get_username(c),&text[i]);
  if (!(message = message_create(message_type_talk,c,msgtemp)))
    message_send_text(c,message_type_info,c,"Could not broadcast message.");
  else
    {
      if (message_send_all(message)<0)
    message_send_text(c,message_type_info,c,"Could not broadcast message.");
      message_destroy(message);
    }

  return 0;
}
static int _handle_announcegray_command(t_connection * c, char const *text)
{
  unsigned int i;
  t_message *  message;

  for (i=0; text[i]!=' ' && text[i]!='\0'; i++); /* skip command */
  for (; text[i]==' '; i++);

  if (text[i]=='\0')
  {
    message_send_text(c,message_type_info,c,"usage: /announce <announcement>");
    return 0;
  }

  snprintf(msgtemp, sizeof(msgtemp),":%.0s %.128s",conn_get_username(c),&text[i]);
  if (!(message = message_create(message_type_emote,c,msgtemp)))
    message_send_text(c,message_type_info,c,"Could not broadcast message.");
  else
    {
      if (message_send_all(message)<0)
    message_send_text(c,message_type_info,c,"Could not broadcast message.");
      message_destroy(message);
    }

  return 0;
}

static int _handle_announcered_command(t_connection * c, char const *text)
{
  unsigned int i;
  t_message *  message;

  for (i=0; text[i]!=' ' && text[i]!='\0'; i++); /* skip command */
  for (; text[i]==' '; i++);

  if (text[i]=='\0')
  {
    message_send_text(c,message_type_info,c,"usage: /announce <announcement>");
    return 0;
  }

  snprintf(msgtemp, sizeof(msgtemp), "%.64s: %.128s",conn_get_username(c),&text[i]);
  if (!(message = message_create(message_type_error,c,msgtemp)))
    message_send_text(c,message_type_info,c,"Could not broadcast message.");
  else
    {
      if (message_send_all(message)<0)
    message_send_text(c,message_type_info,c,"Could not broadcast message.");
      message_destroy(message);
    }

  return 0;
}

во вложениях сам файл(если неполучается скомпилить или чтонибудь не так ввели(файл из последней версии pvpgn на данный момент этот файл из SVN 1.99...))

после всех этих действий , вам останется только добавить команды в command_groups.conf

для тестирования announce, добавьте там строку

1 /whann /redann /ann /grann

собирать лучше с помощью проги от harpywar
code.google.com/p/pvpgn-magic-builder/

magic-builder
если при компиляции вылетает ошибки о недостатке файла afxres и т.п, то я просто скопировал эти файлы в папку с исходниками(source) из папки module\include\vsexpress_include\



15 minutes and 15 seconds after:

на данный момент меня интересует как сделать защиту от флуда анонсами ? :)

30 minutes and 6 seconds after:

ещё можно сделать массовое ЛС, просто заменив тип сообщение на тип whisper

2

Re: /announce (coloured)

Можно заодно рассматривать как гайд по созданию новой команды smile.

Обработку по флуду наверное нужно добавлять в command.cpp, handle_command(). Эта функция вызывается перед выполнением любой команды.

Do not ask for support in PM.

3

Re: /announce (coloured)

вот думаю как можно сделать , определённое количество анонсов в день на 1 игрока... скорее всего нужен какой-то счётчик...ща голова болит не могу ничего придумать smile...


есть на данный момент софт или плагины для стелсбота , которые отлавливают announce от игроков?...

4

Re: /announce (coloured)

Cub_bone wrote:

вот думаю как можно сделать , определённое количество анонсов в день на 1 игрока... скорее всего нужен какой-то счётчик...ща голова болит не могу ничего придумать smile...

Можно в бд замутить, каждому игроку добавить поле acct_lastann_time (int), куда сохранять unixtime последнего аннонса от него. Потом сверять с текущим временем - прошел день или нет.

С бд работать примерно так

// чтение
time_t      time;
time = account_get_strattr(account,"BNET\\acct\\lastann_time");

// запись
account_set_strattr(account,"BNET\\acct\\lastann_time", (unsigned int)now);
Do not ask for support in PM.

5 (edited by Karaulov 24.02.2012 10:45)

Re: /announce (coloured)

спасибо, попробую примерно так сделать


Ща думаю сделать случайный анонс

типо message_type_random
если message_type_emote , то

snprintf(msgtemp, sizeof(msgtemp),":%.0s %.128s",conn_get_username(c),&text[i]);

если type_talk

 snprintf(msgtemp, sizeof(msgtemp), "%.0s%.128s%.0s",conn_get_username(c),&text[i]);

если type_error or type_broadcast, то

 snprintf(msgtemp, sizeof(msgtemp), "%.64s: %.128s",conn_get_username(c),&text[i]);

6

Re: /announce (coloured)

Cub_bone wrote:

BNET\\acct\\ ссылка на базу(т.е можно любое поле создать и использовать BNET\\acct\\название(так просто?) ?)?

BNET\\acct\\название означает поле acct_название в таблице BNET. Лучше не в свою таблицу, а именно туда т.к. он сразу запишет нужному аккаунту нужную запись, и не нужно лишнего кода.


Я сам с++ не знаком особо, не на нем пишу. С рандомом можно как то так:

// рандом из трех цифр, правда хз с нуля или с одного начинается :)
int rnd = rand() % 3;

if ( rnd == 0 )
    snprintf(msgtemp, sizeof(msgtemp),":%.0s %.128s",conn_get_username(c),&text[i]);
elseif ( rnd == 1 )
     snprintf(msgtemp, sizeof(msgtemp), "%.64s: %.128s",conn_get_username(c),&text[i]);
elseif ( rnd == 2 )
     ...
Do not ask for support in PM.

7

Re: /announce (coloured)

У нас можно красным писать тока через аннонс а так просто так не получается не стал читать до конца и сразу спешил писать тут можно писать с разными шрифтами(обычный, /me, синый, красный) если я правильно понял?

8

Re: /announce (coloured)

3Dmonster, синий, желтый и белый цвета - это не тип сообщения, а флаги пишущего (админ/дудка/близзард).

9 (edited by Karaulov 16.10.2011 17:39)

Re: /announce (coloured)

вот у меня так получилось сделать случайный анонс:):

static int _handle_annrandom_command(t_connection * c, char const *text)
{
  unsigned int i;
  int rnd = rand() % 4;


  t_message *  message;

  for (i=0; text[i]!=' ' && text[i]!='\0'; i++); /* skip command */
  for (; text[i]==' '; i++);

  if (text[i]=='\0')
  {
    message_send_text(c,message_type_info,c,"usage: /announce <announcement>");
    return 0;
  }

  if ( rnd == 0 )
   {
    snprintf(msgtemp, sizeof(msgtemp), "%.64s: %.128s",conn_get_username(c),&text[i]);
    message = message_create(message_type_error,c,msgtemp);
    message_send_all(message);
    }
    if ( rnd == 1 )    
    {
    snprintf(msgtemp, sizeof(msgtemp), ":%.0s %.128s",conn_get_username(c),&text[i]);
    message = message_create(message_type_emote,c,msgtemp);
    message_send_all(message);
    }
    if ( rnd == 2 )
    {
    snprintf(msgtemp, sizeof(msgtemp), "%.0s%.128s%.0s",conn_get_username(c),&text[i]);
    message = message_create(message_type_talk,c,msgtemp);
    message_send_all(message);
    }
    if ( rnd == 3 )
    {
    snprintf(msgtemp, sizeof(msgtemp), "%.64s: %.128s",conn_get_username(c),&text[i]);
    message = message_create(message_type_broadcast,c,msgtemp);
    message_send_all(message);
    }
    
  return 0;
}

6 hours, 25 minutes and 44 seconds after:

а



чё у меня ложится сервер после такой вот команды:


static int _handle_anntes_command(t_connection * c, char const *text)
{

  int pka=10;
  char pia=pka;
  char const * alo;
  
  alo=(char const*)pia;
  t_account *  account; 
  account = conn_get_account(c);
  account_set_strattr(account,"BNET\\acct\\kann",alo);

}

именно после выполнения
  account_set_strattr(account,"BNET\\acct\\kann",alo);
конечно я с преобразованиями намутил но должно ведь работать:)
как правильно записывать ???
BNET\\acct\\kann

kann количество анонсов.. и с mysql неработает и без, тожа ошибка ...

вот например мне нужно записать число 10 в BNET\\acct\\kann
как грамотно это сделать?

10

Re: /announce (coloured)

Изменил стандартный анонс, с ограничением для юзера (3 анонса за 24 часа), без ограничений для админа.

Надо добавить 2 поля в таблицу BNET:
acct_custom_ann_time
acct_custom_ann_count

static int _handle_announce_command(t_connection * c, char const *text)
{
    const int max_anns = 3; // максимум анонсов для юзера
    const int max_wait = 60*60*24; // за 24 часа

    time_t      custom_ann_time;
    int custom_ann_count;
    
    unsigned int i;
    t_message *  message;
    t_account *  account;
    account = conn_get_account(c);
    for (i=0; text[i]!=' ' && text[i]!='\0'; i++); /* skip command */
    for (; text[i]==' '; i++);
    if (text[i]=='\0')
    {
    message_send_text(c,message_type_info,c,"usage: /announce <announcement>");
    return 0;
    }

    // чтение
    custom_ann_time = account_get_numattr(account,"BNET\\acct\\custom_ann_time");
    custom_ann_count = account_get_numattr(account,"BNET\\acct\\custom_ann_count");

    // если уже прошел день с момента последнего анонса
    if ( custom_ann_time < now - max_wait )
    {
        // установить исходное кол-во анонсов
        custom_ann_count = max_anns;
        account_set_numattr(account,"BNET\\acct\\custom_ann_count", (unsigned int)custom_ann_count);

        // обновить время на текущее
        account_set_numattr(account,"BNET\\acct\\custom_ann_time", (unsigned int)now);
    }

    bool test = account_get_boolattr(account,"BNET\\auth\\admin");

    // если анонсов хватает, или же юзер является админом
    if ( custom_ann_count > 0 || account_get_boolattr(account,"BNET\\auth\\admin") )
    {
        // послать анонс
        snprintf(msgtemp, sizeof(msgtemp), "%.64s: %.128s",conn_get_username(c),&text[i]);
        message = message_create(message_type_error,c,msgtemp);
        message_send_all(message);

        // и записать в бд, уменьшив на 1
        account_set_numattr(account,"BNET\\acct\\custom_ann_count", (unsigned int)--custom_ann_count);
    }
    else
    {
        snprintf(msgtemp, sizeof(msgtemp), "You can send ony %d announce for a %d hour(s)", max_anns, max_wait/60/60);
        message_send_text(c,message_type_error,c,msgtemp);
    }

    return 0;
}
Do not ask for support in PM.

11 (edited by Zikoi5 19.06.2012 20:44)

Re: /announce (coloured)

+ добавок от меня (показывает сколько ему еще осталось до следующего анн)

после

} 
else 
{
            snprintf(msgtemp, sizeof(msgtemp), "You can send ony %d announce for a %d hour(s)", max_anns, max_wait/60/60);max_wait/60);
            message_send_text(c,message_type_error,c,msgtemp);

добавьте:

snprintf(msgtemp, sizeof(msgtemp), "Осталось еще %.48s",seconds_to_timestr(custom_ann_time+max_wait-now));
            message_send_text(c,message_type_info,c,msgtemp);

12

Re: /announce (coloured)

HarpyWar wrote:

Изменил стандартный анонс, с ограничением для юзера (3 анонса за 24 часа), без ограничений для админа.

Надо добавить 2 поля в таблицу BNET:
acct_custom_ann_time
acct_custom_ann_count

please show me how to add table in bnet ?
thx

13

Re: /announce (coloured)

Jimmy_Aquarius wrote:

please show me how to add table in bnet ?

May be fields, but not table?

alter table `bnet` add acct_custom_ann_time int(11) not null default 0;
alter table `bnet` add acct_custom_ann_count tinyint(2) not null default 0;

This will create two fields in table bnet.

Do not ask for support in PM.

14

Re: /announce (coloured)

HarpyWar wrote:
Jimmy_Aquarius wrote:

please show me how to add table in bnet ?

May be fields, but not table?

alter table `bnet` add acct_custom_ann_time int(11) not null default 0;
alter table `bnet` add acct_custom_ann_count tinyint(2) not null default 0;

This will create two fields in table bnet.

could you show the full command ?
so i can see it, because i use it doesn't work..

15

Re: /announce (coloured)

It works for me.

Добавлено: 07.12.2012 21:13

Nobody knows why it doesn't work for you. If you want to get a help you must provide any additional info (error message or screenshot).

Do not ask for support in PM.

16

Re: /announce (coloured)

error sir

17

Re: /announce (coloured)

HarpyWar wrote:
Jimmy_Aquarius wrote:

please show me how to add table in bnet ?

May be fields, but not table?

alter table `bnet` add acct_custom_ann_time int(11) not null default 0;
alter table `bnet` add acct_custom_ann_count tinyint(2) not null default 0;

This will create two fields in table bnet.

У меня в базе данных mysql стоить:
pvpgn_bnet/auth_admin
pvpgn_bnet/acct_custom_ann_time
pvpgn_bnet/acct_custom_ann_count
А я указал в C++
pvpgn_bnet\\auth\\admin
pvpgn_bnet\\acct\\custom_ann_time
pvpgn_bnet\\acct\\custom_ann_count
Так и должно быть?
и кстати в conf/command_groups.cfg
/ann /announce надо менять? на cg 1?

18

Re: /announce (coloured)

Phoenix wrote:

У меня в базе данных mysql стоить:
pvpgn_bnet/auth_admin
pvpgn_bnet/acct_custom_ann_time
pvpgn_bnet/acct_custom_ann_count
А я указал в C++
pvpgn_bnet\\auth\\admin
pvpgn_bnet\\acct\\custom_ann_time
pvpgn_bnet\\acct\\custom_ann_count
Так и должно быть?

Так и должно быть. Сначала вырезается первая часть строки до слешей - это название таблицы. Затем в оставшейся части "\\" заменяется на "_" и получается название поля в бд.

В command_groups.cfg идет обычное соотношение команд с номерами групп доступа, для ограничения прав. Эти номера групп могут быть присвоены юзеру через /cg.

Do not ask for support in PM.

19 (edited by Phoenix 12.02.2014 19:49)

Re: /announce (coloured)

HarpyWar wrote:
Phoenix wrote:

У меня в базе данных mysql стоить:
pvpgn_bnet/auth_admin
pvpgn_bnet/acct_custom_ann_time
pvpgn_bnet/acct_custom_ann_count
А я указал в C++
pvpgn_bnet\\auth\\admin
pvpgn_bnet\\acct\\custom_ann_time
pvpgn_bnet\\acct\\custom_ann_count
Так и должно быть?

Так и должно быть. Сначала вырезается первая часть строки до слешей - это название таблицы. Затем в оставшейся части "\\" заменяется на "_" и получается название поля в бд.

В command_groups.cfg идет обычное соотношение команд с номерами групп доступа, для ограничения прав. Эти номера групп могут быть присвоены юзеру через /cg.

Ограничение не работает
Вот настройка в C++

static int _handle_announce_command(t_connection * c, char const *text)
{
    const int max_anns = 3; // максимум анонсов для юзера
    const int max_wait = 60*60*24; // за 24 часа

    time_t      custom_ann_time;
    int custom_ann_count;
    
    unsigned int i;
    t_message *  message;
    t_account *  account;
    account = conn_get_account(c);
    for (i=0; text[i]!=' ' && text[i]!='\0'; i++); /* skip command */
    for (; text[i]==' '; i++);
    if (text[i]=='\0')
    {
    message_send_text(c,message_type_info,c,"usage: /announce <announcement>");
    return 0;
    }

    // чтение
    custom_ann_time = account_get_numattr(account,"pvpgn_bnet\\acct\\custom_ann_time");
    custom_ann_count = account_get_numattr(account,"pvpgn_bnet\\acct\\custom_ann_count");

    // если уже прошел день с момента последнего анонса
    if ( custom_ann_time < now - max_wait )
    {
        // установить исходное кол-во анонсов
        custom_ann_count = max_anns;
        account_set_numattr(account,"pvpgn_bnet\\acct\\custom_ann_count", (unsigned int)custom_ann_count);

        // обновить время на текущее
        account_set_numattr(account,"pvpgn_bnet\\acct\\custom_ann_time", (unsigned int)now);
    }

    bool test = account_get_boolattr(account,"pvpgn_bnet\\auth\\admin");

    // если анонсов хватает, или же юзер является админом
    if ( custom_ann_count > 0 || account_get_boolattr(account,"pvpgn_bnet\\auth\\admin") )
    {
        // послать анонс
        snprintf(msgtemp, sizeof(msgtemp), "%.64s: %.128s",conn_get_username(c),&text[i]);
        message = message_create(message_type_info,c,msgtemp);
        message_send_all(message);

        // и записать в бд, уменьшив на 1
        account_set_numattr(account,"pvpgn_bnet\\acct\\custom_ann_count", (unsigned int)--custom_ann_count);
    }
    else
    {
        snprintf(msgtemp, sizeof(msgtemp), "You can send ony %d announce for a %d hour(s)", max_anns, max_wait/60/60);
        message_send_text(c,message_type_error,c,msgtemp);
            snprintf(msgtemp, sizeof(msgtemp), "Осталось еще %.48s",seconds_to_timestr(custom_ann_time+max_wait-now));
            message_send_text(c,message_type_info,c,msgtemp);
    }

    return 0;
}

И скрин с БД
http://img.uz/d/2014/02/52fb97f274c75.jpg

Posts: 19

Pages 1

You must login or register to post a reply

Who now at forum

Currently view post: 0 guests, 0 registered users

forums.pvpgn.pro → [RU] The Source Code → /announce (coloured)