Skip to forum content

You are not logged in. Please login or register.


forums.pvpgn.pro → [RU] The Source Code → [Info] /pro /pros

Pages 1

You must login or register to post a reply

RSS topic feed

Posts: 28

1 (edited by SkyFall 01.08.2016 20:05)

Topic: [Info] /pro /pros

Начну  smile
в account_wrap.cpp добавить код

extern int account_get_auth_pro(t_account * account, char const * channelname)
        {
            char temp[256];

            if (!channelname)
                return account_get_boolattr(account, "BNET\\auth\\pro");

            std::sprintf(temp, "BNET\\auth\\pro\\%.100s", channelname);
            return account_get_boolattr(account, temp);
        }


        extern int account_set_auth_pro(t_account * account, char const * channelname, int val)
        {
            char temp[256];

            if (!channelname)
                return account_set_boolattr(account, "BNET\\auth\\pro", val);

            std::sprintf(temp, "BNET\\auth\\pro\\%.100s", channelname);
            return account_set_boolattr(account, temp, val);
        }

В account_wrap.h добавить

extern int account_get_auth_pro(t_account * account, char const * channelname);
        extern int account_set_auth_pro(t_account * account, char const * channelname, int val);

В command.cpp добавить

static int _handle_pro_command(t_connection * c, char const * text)
{
    char const *    username;
    char        command;
    t_account *        acc;
    t_connection *    dst_c;
    int            changed=0;

    text = skip_command(text);

    if ((text[0]=='\0') || ((text[0] != '+') && (text[0] != '-'))) {
    message_send_text(c,message_type_info,c,"используйте: /pro +геймер чтобы добавить в список про аккунтов.");
    message_send_text(c,message_type_info,c,"       /pro -геймер чтобы убрать из списка про аккунтов.");
    return -1;
    }

    command = text[0];
    username = &text[1];

    if(!*username) {
    message_send_text(c,message_type_info,c,"You need to supply a username.");
      return -1;
    }

    if(!(acc = accountlist_find_account(username))) {
    snprintf(msgtemp, sizeof(msgtemp), "There's no account with username %.64s.", username);
    message_send_text(c, message_type_info, c, msgtemp);
    return -1;
    }
    dst_c = account_get_conn(acc);

    if (command == '+') {
    if (account_get_auth_pro(acc,NULL) == 1) {
        snprintf(msgtemp, sizeof(msgtemp), "%.64s уже добавлен в список Про аккунтов.",username);
    } else {
        account_set_auth_pro(acc,NULL,1);
        snprintf(msgtemp, sizeof(msgtemp), "%.64s Добавлен в список Про аккунтов",username);
        snprintf(msgtemp2, sizeof(msgtemp2), "%.64s добавил вас в список Про аккунтов.",conn_get_loggeduser(c));
        changed = 1;
    }
    } else {
    if (account_get_auth_pro(acc,NULL) != 1)
            snprintf(msgtemp, sizeof(msgtemp), "%.64s is no Server PRO, so you can't demote him",username);
    else {
        account_set_auth_pro(acc,NULL,0);
        snprintf(msgtemp, sizeof(msgtemp), "%.64s убран из списка про аккутов.",username);
        snprintf(msgtemp2, sizeof(msgtemp2), "%.64s убрал вас из списка про аккунтов. (Жаль)",conn_get_loggeduser(c));
        changed = 1;
    }
    }

    if (changed && dst_c) message_send_text(dst_c, message_type_info, c, msgtemp2);
    message_send_text(c, message_type_info, c, msgtemp);
    command_set_flags(dst_c);
    return 0;
}

далее

static int _handle_pros_command(t_connection * c, char const *text)
{
  unsigned int    i;
  t_elem const *  curr;
  t_connection *  tc;
  char const *    nick;

  std::strcpy(msgtemp,"Про аккунты в сети:");
  i = std::strlen(msgtemp);
  LIST_TRAVERSE_CONST(connlist(),curr)
    {
      tc = (t_connection*)elem_get_data(curr);
      if (!tc)
    continue;
      if (!conn_get_account(tc))
        continue;
      if (account_get_auth_pro(conn_get_account(tc),NULL)==1)
    {
      if ((nick = conn_get_username(tc)))
        {
          if (i+std::strlen(nick)+2>sizeof(msgtemp)) /* " ", name, '\0' */
        {
          message_send_text(c,message_type_info,c,msgtemp);
          i = 0;
        }
          std::sprintf(&msgtemp[i]," %s", nick);
          i += std::strlen(&msgtemp[i]);
        }
    }
    }
  if (i>0)
    message_send_text(c,message_type_info,c,msgtemp);

  return 0;
}

2

Re: [Info] /pro /pros

слишком уж банально, добавь хотя бы таймер, который указывает на какой срок был дан про-аккаунт (это не так уж и сложно wink).

3 (edited by SkyFall 09.08.2016 22:36)

Re: [Info] /pro /pros

Suite wrote:

слишком уж банально, добавь хотя бы таймер, который указывает на какой срок был дан про-аккаунт (это не так уж и сложно wink).

на основе /lock сделал /pro )
В account_wrap.cpp добавить

extern int account_set_auth_protime(t_account * account, unsigned int val)
        {
            return account_set_numattr(account, "BNET\\auth\\protime", val);
        }
extern int account_set_auth_proby(t_account * account, char const * val)
        {
            return account_set_strattr(account, "BNET\\auth\\proby", val);
        }

В account_wrap.h добавить

extern int account_set_auth_protime(t_account * account, unsigned int val);
extern int account_set_auth_proby(t_account * account, char const * val);

и в command.cpp добавить

static int _handle_pro_command(t_connection * c, char const *text)
        {
            t_connection * user;
            t_account *    account;
            char const * username, *hours = "72";
            unsigned int sectime;
            char msgtemp3[MAX_MESSAGE_LEN];

            char     t[MAX_MESSAGE_LEN];
    unsigned int i,j;
    char    arg1[256];
    char    arg2[256];

    std::strncpy(t, text, MAX_MESSAGE_LEN - 1);
    for (i=0; t[i]!=' ' && t[i]!='\0'; i++); 

    for (; t[i]==' '; i++); 
    for (j=0; t[i]!=' ' && t[i]!='\0'; i++) 
    if (j<sizeof(arg1)-1) arg1[j++] = t[i];
    arg1[j] = '\0';

    for (; t[i]==' '; i++); 
    for (j=0; t[i]!=' ' && t[i]!='\0'; i++) 
    if (j<sizeof(arg2)-1) arg2[j++] = t[i];
    arg2[j] = '\0';

    username = arg1;
    hours = arg2;
            

            if (!(account = accountlist_find_account(username)))
            {
                message_send_text(c, message_type_error, c, "Используйте:/pro задрот время.");
                return 0;
            }

            account_set_auth_pro(account,NULL,1);
            sectime = (atoi(hours) == 0) ? 0 : (atoi(hours) * 60 * 60) + now; // get unlock time in the future
            account_set_auth_protime(account, sectime);
            account_set_auth_proby(account, conn_get_username(c));


            if (sectime == 0)
                snprintf(msgtemp3, sizeof(msgtemp3), " навсегда");
            else
                snprintf(msgtemp3, sizeof(msgtemp3), " от %.48s", seconds_to_timestr(sectime - now));

            snprintf(msgtemp, sizeof(msgtemp), "Аккунт %s получил про аккаунта %s", account_get_name(account), msgtemp3);
            message_send_text(c, message_type_error, c, msgtemp);

            if ((user = connlist_find_connection_by_accountname(username)))
            {
                snprintf(msgtemp, sizeof(msgtemp), "Вы получили про аккаунт от [ %s ] на %s", conn_get_username(c), msgtemp3);
                message_send_text(user, message_type_info, user, msgtemp);
            }

            return 0;
        }

Сам не тестил но вроде ошибок нет, команду сделал в 1.99 так как у меня нету c++ 2015  для новых версий pvpgn big_smile

4

Re: [Info] /pro /pros

Хорошая идея))) про pro
как можно при получении /pro у пользователя были еще дополнительные команды типа /ann /color

5

Re: [Info] /pro /pros

launcher wrote:

Хорошая идея))) про pro
как можно при получении /pro у пользователя были еще дополнительные команды типа /ann /color

анн поставишь в цг 1

static int _handle_announce_command(t_connection * c, char const *text)
{
    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,"используйте: /announce <announcement>");
    return 0;
  }
    
    
//если игрок является админом
    if (account_get_auth_admin(account,NULL)==1)
      {
        // послать анонс
        snprintf(msgtemp, sizeof(msgtemp), "[<Администратор>]%.64s: %.128s",conn_get_username(c),&text[i]);
        message = message_create(message_type_info,c,msgtemp);
        message_send_all(message);
      }
    //если игрок является оператором
        else if (account_get_auth_operator(account,NULL)==1) 
      {
        // послать анонс
        snprintf(msgtemp, sizeof(msgtemp), "[<Модератор>]%.64s: %.128s",conn_get_username(c),&text[i]);
        message = message_create(message_type_info,c,msgtemp);
        message_send_all(message);
      }
   //если игрок является про аккунтом
        else if (account_get_auth_pro(account,NULL)==1) 
      {
        // послать анонс
        snprintf(msgtemp, sizeof(msgtemp), "[<Про Аккунт>]%.64s: %.128s",conn_get_username(c),&text[i]);
        message = message_create(message_type_info,c,msgtemp);
        message_send_all(message);
      }

        //если игрок голый или он просто юзер то
        else if (account_is_operator_or_admin(account,NULL)==0) 
         
        {
message_send_text(c,message_type_info,c,"Анонс только для администрации( типа админ модер и про аккаунт)");
      }

  return 0;
}

а колор не знаю как делать  neutral

6 (edited by launcher 10.08.2016 20:07)

Re: [Info] /pro /pros

if (account_get_auth_admin(account,NULL)==1)

это у админов
а у ПРО акаунтов будет

account_set_auth_pro(account,NULL)==1);

???

7

Re: [Info] /pro /pros

launcher wrote:
if (account_get_auth_admin(account,NULL)==1)

это у админов
а у ПРО акаунтов будет

account_set_auth_pro(account,NULL)==1);

???

верно

8

Re: [Info] /pro /pros

молодец, но кто будет автоматически снимать статус про-аккаунт?)

Добавлено: 24.08.2016 09:05

но для этого ты много, что должен учитывать (т.е. выход игрока пересчёт времени и отключение таймера, падение сервера и тд).

9

Re: [Info] /pro /pros

Suite wrote:

молодец, но кто будет автоматически снимать статус про-аккаунт?)

Добавлено: 24.08.2016 09:05

но для этого ты много, что должен учитывать (т.е. выход игрока пересчёт времени и отключение таймера, падение сервера и тд).

сервер снимет же про аккаунта как в локе

10

Re: [Info] /pro /pros

SkyFall wrote:

сервер снимет же про аккаунта как в локе

а ты уверен?) протестируй, мне потом ответ скажи.

11

Re: [Info] /pro /pros

Suite wrote:
SkyFall wrote:

сервер снимет же про аккаунта как в локе

а ты уверен?) протестируй, мне потом ответ скажи.

ок)

12 (edited by Suite 13.09.2016 18:59)

Re: [Info] /pro /pros

SkyFall wrote:

ок)

а я пока поищу ту часть, которую нужно переделать.

Добавлено: 13.09.2016 19:58

В общем можешь не тестить. Просмотрел код, оно не будет обнулять время данный сервером ибо ты кое-где не дописал. Даже если допишешь оно не будет обнулять ибо есть еще много деталей, которые должен был учесть (в данном случае ты). Вспомнил даже как я реализовывал VIP на своем сервере. Чуток пойже я сделаю полноценную команду.

13

Re: [Info] /pro /pros

Suite wrote:
SkyFall wrote:

ок)

а я пока поищу ту часть, которую нужно переделать.

Добавлено: 13.09.2016 19:58

В общем можешь не тестить. Просмотрел код, оно не будет обнулять время данный сервером ибо ты кое-где не дописал. Даже если допишешь оно не будет обнулять ибо есть еще много деталей, которые должен был учесть (в данном случае ты). Вспомнил даже как я реализовывал VIP на своем сервере. Чуток пойже я сделаю полноценную команду.

значит и в локе проблемы есть???

14

Re: [Info] /pro /pros

в самом lock нет проблем. проблемы в твоем коде. ты не понимаешь, того что ты делаешь.

Добавлено: 13.09.2016 21:32

просто добавив ему время и изменив логическую переменную в базе ты не добьешься снятия вип статуса. для этого в локе сделана проверка при заходе на сервер логической переменной, которая указывает забанен ли пользователь, а если забанен, то насколько? и с этого времени вычитается текущее ( или какая то другая операция делается, но не суть ) и выдает ошибку на стороне клиента ( т.е. не заходит на сервер ).
все это можно было узнать просто прочитав код используя поиск по функциям в проекте smile

Добавлено: 13.09.2016 21:33

если уж тебе очень сложно, могу немного помочь в свое свободное время. связаться можно со мной через телеграм по тегу @test_qwerty.

15

Re: [Info] /pro /pros

думаю нету проблем потому что при заходе в сервер сервер провекяет есть ли у игрока лок если есть то выдаёт ошибку на стороне клиента . зачем про аккаунту такое ошибка
думаю работает потом потестирую как нибудь

16

Re: [Info] /pro /pros

так то что ты хочешь сделать, чуток по-другому делается. если вип игрок на сервере и время истекло, у него останется вип аккаунт.
тем более ты не забираешь вип статус у игрока.

17 (edited by SkyFall 15.09.2016 14:24)

Re: [Info] /pro /pros

а этот код?

sectime = (atoi(hours) == 0) ? 0 : (atoi(hours) * 60 * 60) + now; // получить разблокировать время в будущем

Добавлено: 15.09.2016 14:49

18

Re: [Info] /pro /pros

это просто переменная которую ты объявил и указал значение. ты не понимаешь сути (где это переменная фиксируется/проверяется/изменяется.)
на простом примере могу объяснить так: у тебя есть дверь, которая открывается и закрывается автоматически зависимости от прав пользователя. права пользователя ограничены по времени. если время истекает, то дверь не открывается. так вот. у тебя эти права фиксируются, но система, которая определяет время истечения не работает, потому что её нет. то есть если выданы права, они вообще не истекают, хотя, допустим, ими можно час пользоваться.

19 (edited by SkyFall 16.09.2016 06:03)

Re: [Info] /pro /pros

а щас время истекать будет?
если да то если добавлю в handle_bnet.cpp вот эту строку когда зайдёт на сервер:

if (account_get_auth_protime(account)==0)
      {

          account_set_auth_pro(account,NULL,0);
          
    }
else 
return;

20

Re: [Info] /pro /pros

так это очень легкое решение. а если игрок на сервере и у него истечет срок действия вип статуса?

21

Re: [Info] /pro /pros

может проверять каждый раз когда он пишет?
или посоветуй )

22

Re: [Info] /pro /pros

Таймер

23

Re: [Info] /pro /pros

таймер делать не умею...

24

Re: [Info] /pro /pros

Пример приведен в команде выключения сервера.

Добавлено: 18.09.2016 00:21

функция называется timerlist_add_timer.
сервер может упасть, при этом, таймера все очищаются. для возобновления таймеров ты должен запускать все таймеры заного, но с другим таймаутом.
конечно я еще не протестировал до конца, какая будет нагрузка таймеров на сервер. если будет все печально, придется написать свои таймеры под пвпгн для таких вот команд.
и изрядно удивился, что пвпгн выглядит по другому - видны плоды гарпивара и многих других пользователей гита.

25

Re: [Info] /pro /pros

Ахахахаха)) В начале там, твой /pro что-то ничего не дает))) У меня для про аккаунтам можно было цветным текстом в чате писать или иметь цветной ник на канале, либо писать в аннонс без всяких цг1 или цг2)))

26

Re: [Info] /pro /pros

у меня про аккаунт даёт анонс в 1 цг конечно же
золотая рамка
и доступ ко всем ботам в команде /bot

27

Re: [Info] /pro /pros

SkyFall wrote:

у меня про аккаунт даёт анонс в 1 цг конечно же
золотая рамка
и доступ ко всем ботам в команде /bot

Хочу снова занять себя пвпгном немного, если найду вдохновение, то займусь и выложу фишки всякие

28

Re: [Info] /pro /pros

XOM91K wrote:
SkyFall wrote:

у меня про аккаунт даёт анонс в 1 цг конечно же
золотая рамка
и доступ ко всем ботам в команде /bot

Хочу снова занять себя пвпгном немного, если найду вдохновение, то займусь и выложу фишки всякие

так и сделай )

Posts: 28

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 → [Info] /pro /pros