CS:BANS - Подключение флагов, на ограниченный / неограниченный срок.

Сообщения
28
Реакции
25
Помог
1 раз(а)
Здравствуйте.
Столкнулся с проблемой. Игрок использует флаги Админа с неограниченным сроком, необходимо ему установить флаг Випа ADMIN_LEVEL_H (t) на определенный срок.
- Вопрос как это сделать? Есть решение?

Если добавить новую запись, сделать копию записи игрока, только изменить флаг и установить срок пользования.
- Такой вариант не проходит. Работает только последняя запись.

Необходимо (к примеру):
- В админ-панели у игрока стоит срок неограничен.
- В вип-панели у игрока стоит срок 29 дней.
 
Сообщения
2,491
Реакции
2,794
Помог
61 раз(а)
В текущей реализации ксбанса и админ лоадеров никак
 
Сообщения
1,291
Реакции
2,288
Помог
57 раз(а)
Я раньше дописывал человеку пометку, ставил нужный флаг руками, и переставлял время действия прав на необходимый срок. Когда время истекало, - акк у человека отключался, и он соответсвенно должен был мне написать, чтобы я включил его назад (вспомнив по пометке, что я дал, и убрав временный флаг). Изврат, и более того, изврат не всегда подходящий.

Наконец мне это надоело, и я переписал лоадер неугомона. Изначально он прогонял игрока по списку до первого совпадения, я же сделал прогон по всему списку и подхват всех подходящих флагов. Т.е. если у человека к серверу слинковано два аккаунта, скажем, один с флагом "a", другой с флагом "b", то подхватывается оба аккаунта и в конечном итоге человек у нас получает "ab". При этом эти аккаунты друг от друга не зависят, чего и требовалось достичь. Работает вроде как исправно. Делалось, если честно, на ****бись (лишь бы работало), и там ещё в порядок надо код привести. Плагин сильно модифицирован и многим скорее всего не подойдёт (я там кучу всего выпилил, в т.ч. поддержку Lite Bans, вроде бы она была). Но если кому надо, - могу подкинуть, пишите в ПМ. Хотя бы принцип увидите, мб переделаете сами дефолт так же. Я бы кинул сюда, но полагаю, нельзя выкладывать модификации плагинов других авторов без их разрешения.

Код:
func_GetUserAccess(id, szName[32] = "")
{
    remove_user_flags(id)
    
    new szAuthID[25]; get_user_authid(id, szAuthID, chx(szAuthID))
    new szIP[16]; get_user_ip(id, szIP, chx(szIP), 1)
    if(!szName[0]) get_user_name(id, szName, chx(szName))
    
    g_iPlayerFlags[id] = 0
    new iCount
    
    new szHash[34], szPassword[33]

    for(new i, aSize = ArraySize(g_aAccounts); i < aSize; i++)
    {
        ArrayGetArray(g_aAccounts, i, g_eUserData)
        
        if(g_eUserData[ACC_AUTH_FLAGS] & FLAG_AUTHID)
        {
            if(szAuthID[10] != g_eUserData[ACC_AUTH][10] || strcmp(szAuthID, g_eUserData[ACC_AUTH]))
                continue
        }
        else if(g_eUserData[ACC_AUTH_FLAGS] & FLAG_IP)
        {
            if(szIP[0] != g_eUserData[ACC_AUTH][0] || strcmp(szIP, g_eUserData[ACC_AUTH]))
                continue
        }
        else if(szName[0] != g_eUserData[ACC_AUTH][0] || strcmp(szName, g_eUserData[ACC_AUTH][0]))
            continue
            
        // [TODO] Сейчас перезаписывается. Хз что с этим делать. Для AS можно устанавливать значение только для учётки с админским флагом ('d').
        g_iAdminExpired[id] = g_eUserData[ACC_EXPIRED]
            
        if(g_eUserData[ACC_AUTH_FLAGS] & FLAG_NOPASS)
        {
            iCount++
            g_iPlayerFlags[id] |= g_eUserData[ACC_ACCESS_FLAGS];    
            continue
        }
        //else
        get_user_info(id, g_szPwdField, szPassword, chx(szPassword))
        hash_string(szPassword, Hash_Md5, szHash, chx(szHash))
        
        if(!strcmp(szHash, g_eUserData[ACC_PASS]))
        {
            iCount++
            g_iPlayerFlags[id] |= g_eUserData[ACC_ACCESS_FLAGS];
            continue
        }
        
        if(g_eUserData[ACC_AUTH_FLAGS] & FLAG_KICK)
        {
            server_cmd("kick #%d Пропишите в консоли ^"%s^" ^"ваш_пароль^"", get_user_userid(id), g_szPwdField)
            log_to_file(g_szAuthLog, "Login: ^"%s<%s><%s>^" kicked due to invalid password (account ^"%s^")", szName, szAuthID, szIP, g_eUserData[ACC_AUTH])
            return
        }
    }
    
    if(!g_iPlayerFlags[id])
    {
        g_iAdminExpired[id] = -1
        g_iPlayerFlags[id] = g_iDefaultAccess
        set_user_flags(id, g_iDefaultAccess)
        return
    }
    //else
    new szFlags[32]; get_flags(g_iPlayerFlags[id], szFlags, chx(szFlags))
    log_to_file(g_szAuthLog, "Login: ^"%s<%s><%s>^" authorized (acc. count: %d) (access ^"%s^")", szName, szAuthID, szIP, iCount, szFlags)
    set_user_flags(id, g_iPlayerFlags[id])
}
 
Сообщения
28
Реакции
25
Помог
1 раз(а)
fantom, и как быть, может есть какое решение?
Может заменить cs:bans на amxbans?
25 Мар 2018
BlackSignature, Да, я использую лоадер от неугомона, и его бан систему лайт банс.
Т.е. ты создаешь два одинаковых аккаунта, с разными флагами, и все работает. Правильно тебя понял?
 
Сообщения
1,291
Реакции
2,288
Помог
57 раз(а)
artfreeman, не обязательно два одинаковых. Можно выдать, скажем по нику "Player" с паролем "123", и на стимид 123456, без пароля. Если проверяющийся игрок проходит проверку в обоих случаях, - получает флаги с этих аккаунтов. Там без разницы, одинаковые они, или нет. Главное, чтобы данные игрока соответствовали их данным. Принцип обработки вон, я кинул.
 
Сообщения
28
Реакции
25
Помог
1 раз(а)
BlackSignature, Ну смотри, к примеру.
Привилегии подключены по нику + пароль.
Имеются на первой записи флаги админа на неограниченный срок. Далее мне необходимо подключить Випку на 30 дней.
Если я создам ворую запись похожую на первую запись, с тем же ником и паролем, только с флагом випки и на 30 дней.
Будет ли работать так: Админка на неограниченный срок. Випка на 30 дней.
 
Сообщения
1,291
Реакции
2,288
Помог
57 раз(а)
artfreeman, в дефотной реализации лоадера неугомона? Нет. Говорю же, там игрок прогоняется циклом по всему админ-листу. Когда происходит первое совпадение, - дальше цикл не отрабатывает. Т.е. подключится только один аккаунт, любые другие уже нет.
 
Сообщения
28
Реакции
25
Помог
1 раз(а)
BlackSignature, Вот я у тебя и спрашиваю про твою версию лоадера от неугомона)
 
Сообщения
1,291
Реакции
2,288
Помог
57 раз(а)
BlackSignature, Вот я у тебя и спрашиваю про твою версию лоадера от неугомона)
Моя версия с лайт банс не работает. Можете поискать скриптера на работу, не думаю, что выйдет дорого, - работы там немного, тем более, что есть пример реализации.
 
Сообщения
1,291
Реакции
2,288
Помог
57 раз(а)
Sonyx, не особо понял, о чём вы. Там же инфа загружается однократно в дин.аррей, и потом по нему от и до прогоняются игроки. А стандартная реализация подразумевает прогон игрока именно до первого совпадения. Иначе, зачем же я тогда переделывал плагин? Оо
 
Сообщения
957
Реакции
1,185
Помог
52 раз(а)
BlackSignature, Можно в SQL запросе сделать группировку по полю отбора (ip, name, steamid). В итоговом выхлопе имеем ответ из 1 строки на 1 админа.
В SELECT добавляет новое поле конкатинируемое, в него добавляем сложенные строки всех флагов.
Для выборки только не истекших записей там же в WHERE ставим условие по времени истечения.
в Итоге при переборе циклом результатов все записи будут уникальны, а флаги на 1 админа приведены в сложенную строку. Единственное в чем я не уверен - при повторяющихся символьных флагах как поведет себя функция перевода их в биты)
 
Сообщения
1,291
Реакции
2,288
Помог
57 раз(а)
Sonyx, понял теперь, спасибо. Но мне это не совсем подходит, да и многим наверно тоже, т.к. в такой реализации подразумевается соответствие, а у меня аккаунты очень часто не сходятся по типу отбора (покупка привилегий, она такая). Т.е. человек может быть админом(без срока) по стимиду без пароля, а затем купит vip по нику+пароль. Хотя как метод оптимизации, конечно, не помешает.
 
Последнее редактирование:

Пользователи, просматривающие эту тему

Сейчас на форуме нет ни одного пользователя.
Сверху Снизу