Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

MyDC.ru _ Запросы скриптов для PtokaX _ Запрет символов в никах и цифровых ников

Автор: DrakonSP 14.2.2010, 6:51

Здравствуйте! Как Вы уже поняли нужен скрипт запрещающий использовать цифровые (состоящие только из цифр) ники.
http://mydc.ru/ipb.html?act=findpost&pid=11000 не то! Т.к. тут идёт запрет определёных символов в конце и начале ника,
А нужно запрещать вход на хаб никам, состоящими только из цифр.
Тобишь, я не хочу запрещать цифры в никах, но хочу запретить вход пользователям, чьи ники состоят только из цифр.

Например:
12345
13579
123654
384257 - Запретить использование таких ников!

DrakonSP123
Вася15
536Сергей - Ники такого рода запрещать не надо!

Скрипт не бред, потому что проблема очевидна...
На хаб за день могут зайти десятки уникальных пользователей с ником 12345.
Но самая жара начинаеться, когда какой-нибудь умник с ником 12345 регистрируеться,
И догадайтесь с каким паролем? big_smile1.gif

Автор: Serx 14.2.2010, 10:57

Что-то вроде такого:

Код
function ValidateNickArrival(tUser)
    if not string.find(tUser.sNick,"%D") then
        Core.SendToUser(tUser, "Ники состоящие только из цифр запрещены")
        Core.Disconnect(tUser)
    end
end

Автор: Nickolya 14.2.2010, 17:14

Смущает меня такая регулярка, я бы сделал вот так:

Код
function ValidateNickArrival(tUser)
    if tUser.sNick:match("^(%d+)$") then
        Core.SendToUser(tUser, "Ники состоящие только из цифр запрещены")
        Core.Disconnect(tUser)
    end
end

Автор: Setuper 14.2.2010, 17:33

Лучше вот так:

Код
function ValidateNickArrival(tUser)
    if tUser.sNick:find"^%d+$" then
        Core.SendToUser(tUser, "Ники состоящие только из цифр запрещены")
        Core.Disconnect(tUser)
    end
end


Захват (%d+) лучше не делать, так как это лишние действия, и вместо match в условии использовать find. Так как интерпретатору проще сравнить число, которое возвращает find, со значением boolean, чем сравнивать строку, которую возвращает match. Ведь строка - это массив символов. Намного проще работать с числами, чем с массивами. Не делая захваты, строк вообще не будет, а метод find вернёт только 2 числа (начало и конец регулярного выражения, если таковое было обнаружено).

Автор: trojan 14.2.2010, 22:32

1

Автор: Nickolya 14.2.2010, 22:36

Так сделай маленькую модификацию скрипта выше:

Код
tExept = {
    ["911"] = true,
}

function ValidateNickArrival(tUser)
    if not tExept[tUser.sNick] and tUser.sNick:find"^%d+$" then
        Core.SendToUser(tUser, "Ники состоящие только из цифр запрещены")
        Core.Disconnect(tUser)
    end
end

Автор: DrakonSP 16.2.2010, 1:46

Хочу сделать скрипт по своим фунциям схожим вот с http://mydc.ru/ipb.html?act=findpost&pid=11000
Но по системе ValidateNickArrival и find
Мне всего лишь надо что бы мне подсказали с захватом
А то ещё недостаток вышеуказанного скрипта, то что там идёт разделение запрещ. символ в начале и в конце ника.
Напишите пожалуйста пример захвата который искал бы к примеру запрещёный символ @ во всем нике (в какой бы части он не находился)
Дальше я сам разберусь... Надеюсь big_smile1.gif
Или это возможно только по такой системе?

Код
"^(%@)"  -  В начале ника
"(%@)"  -  В конце ника

Спасибо!

Автор: Serx 16.2.2010, 10:47

Код
tUser.sNick:find"^(@)" -- в начале ника (1й символ)
tUser.sNick:find"(@)" -- на любом месте в нике
tUser.sNick:find"(@)$" -- не уверен, но думаю это будет отлавливать в конце ника (последний символ)

Если нужен именно сам факт нахождения символа в нике, то скобки можно убрать (они нужны именно для захвата символа).

а вообще вот тут очень полезная информация по таким вопросам: http://mydc.ru/topic266.html

Автор: DrakonSP 16.2.2010, 19:31

Пишу вот так:

Код
tUser.sNick:find"(@)" -- на любом месте в нике

Он действительно отлавливает символ @ в любом месте ника.
так же я хочу запрещать символ ! например. Пишу:
Код
tUser.sNick:find"(@!)"

И скрипт не отлавливает ничего ни @ ни !
Как быть? может я чего не так делаю?

Автор: Wariner 16.2.2010, 19:48

конечно! ты сейчас пытаешься найти в нике не каждый символ по отдельности а их комбинацию в определённом порядке.

Автор: DrakonSP 16.2.2010, 20:14

Цитата(Wariner @ 16.2.2010, 19:48) *
конечно! ты сейчас пытаешься найти в нике не каждый символ по отдельности а их комбинацию в определённом порядке.

А вот так правильней будет?
Код
tUser.sNick:find"([%!@])"

Автор: Wariner 16.2.2010, 21:51

правильнее будет:

Код
tUser.sNick:find"([%!]) and tUser.sNick:find"([@])"

Автор: DrakonSP 16.2.2010, 22:05

Цитата(Wariner @ 16.2.2010, 21:51) *
правильнее будет:
Код
tUser.sNick:find"([%!])" and tUser.sNick:find"([@])"

Не работает surrender.gif

Автор: Nickolya 16.2.2010, 22:20

Условие and означает что в нике должны быть оба символа для его истинности. По-идее если надо проверить наличие одного из символов будет вернее использовать именно

Код
tUser.sNick:find"([%!@])"

Автор: DrakonSP 16.2.2010, 22:37

А ещё 1 вопросик не подскажите byebye.gif ?
Хочу поместить захват в переменную и...

Раскрывающийся текст
Код
local sbansymbol = "[%!@4]"

function ValidateNickArrival(tUser)
    if tUser.sNick:find"("..sbansymbol..")" then
        Core.SendToUser(tUser,"*** Ваш ник содержит запрещённые символы!")
        Core.SendToUser(tUser,"*** Обратная связь: skobyanka.sp.hub@gmail.com")
        Core.Disconnect(tUser)
    end
    if tUser.sNick:find"^%d+$" then
        Core.SendToUser(tUser,"*** Ники состоящие только из цифр запрещены!")
        Core.SendToUser(tUser,"*** Обратная связь: skobyanka.sp.hub@gmail.com")
        Core.Disconnect(tUser)
    end
end

и... ошибка
Цитата
Disallow.lua:4: unfinished capture

Меняю на:
Раскрывающийся текст
Код
local sbansymbol = "([%!@4])"

function ValidateNickArrival(tUser)
    if tUser.sNick:find""..sbansymbol.."" then
        Core.SendToUser(tUser,"*** Ваш ник содержит запрещённые символы!")
        Core.SendToUser(tUser,"*** Обратная связь: skobyanka.sp.hub@gmail.com")
        Core.Disconnect(tUser)
    end
    if tUser.sNick:find"^%d+$" then
        Core.SendToUser(tUser,"*** Ники состоящие только из цифр запрещены!")
        Core.SendToUser(tUser,"*** Обратная связь: skobyanka.sp.hub@gmail.com")
        Core.Disconnect(tUser)
    end
end

В чём трабла?

Автор: Setuper 16.2.2010, 22:41

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

Код
if tUser.sNick:find"[!@]" then ...

Автор: Nickolya 16.2.2010, 23:03

Цитата(DrakonSP @ 16.2.2010, 22:37) *
if tUser.sNick:find""..sbansymbol.."" then

В функцию можно передавать текстовый параметр целиком, без конкатенация, записывая его без скобок, во всех иных случаях скобки нужны (я предпочитаю их использовать всегда):
Код
    if tUser.sNick:find(""..sbansymbol.."") then

Автор: DrakonSP 16.2.2010, 23:07

Не одна проблема так другая
Сделал так:

Раскрывающийся текст
Код
local sbansymbol = "[!]"    -- Запрещённые символы

function ValidateNickArrival(tUser)
    if tUser.sNick:find""..sbansymbol.."" then
        Core.SendToUser(tUser,"*** Ваш ник содержит запрещённые символы!")
        Core.SendToUser(tUser,"*** Обратная связь: skobyanka.sp.hub@gmail.com")
        Core.Disconnect(tUser)
    end
    if tUser.sNick:find"^%d+$" then
        Core.SendToUser(tUser,"*** Ники состоящие только из цифр запрещены!")
        Core.SendToUser(tUser,"*** Обратная связь: skobyanka.sp.hub@gmail.com")
        Core.Disconnect(tUser)
    end
end

Итог: Не пускает вообще ни кого, т.е. ник к примеру DrakonSP, а скрипт срабытывает!
меняю
Код
"..sbansymbol.."
на
Код
[!]
всё работает
Я в недоумении...
Получаеться захват нельзя засунуть в переменную? А как же http://mydc.ru/ipb.html?act=findpost&pid=11000 всё работает?

Автор: Setuper 17.2.2010, 0:02

Цитата(Nickolya @ 16.2.2010, 23:03) *
В функцию можно передавать текстовый параметр целиком, без конкатенация, записывая его без скобок, во всех иных случаях скобки нужны (я предпочитаю их использовать всегда):


естественно
Код
if tUser.sNick:find("[!@]") then
и
Код
if tUser.sNick:find"([!@])" then
различия очевидны. В первом случае скобки являются скобками метода find, во втором случае, скобки - это захват символа. Естественно их надо различать.

Как уже было сказано, если строка является постоянным строковым литералом, то скобки можно опускать. Я предпочитаю опускать скобки почти везде, где это можно делать и не только у функции, но и просто по приоритету операций. Можно написать так:
Код
if ((a and b) or (c and d)) then
А можно тоже самое писать без скобок, зная приоритеты выполнения операций.

То же самое касается и конструкторов таблиц. Пример:
Код
function F(tab)
  for i,v in pairs(tab) do
    ...
  end
end


Вызов этой функции может быть такой:
Код
F({1,2,3,4,5})
Но можно и по-другому вызвать (без скобок):
Код
F{1,2,3,4,5}

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

Пример эффектной функции:
Код
function prnt(x)
  if x then
    Core.SendToAll(x)
    return prnt
  end
end
prnt "one" "two" "three"
Напишите в птохе и проверьте, что этот код действительно работает. Согласитесь, что если бы мы написали prnt("one")("two")("three"), то было бы тоже забавно, но не так, как 3 строковых литерала подряд big_smile.gif)))

Автор: DrakonSP 17.2.2010, 0:23

В общем я маленько въехал, но это всё равно для меня очень сложно.
Я понял, что там где можно обойтись без этих скобок лучше их опускать.
Но в моём случае они нужны, потому что захват не являеться постояным, а заключён в переменную.
Так?
Добавил скобки всё работает! byebye.gif
Скрипт можно перести в готовые...
 Disallow.lua ( 560 байт ) : 48

Функции скрипта

-- Запрет символов в никах
-- Заперет ников состоящих только из цифр

Автор: Setuper 17.2.2010, 0:29

Код
if tUser.sNick:find(""..sbansymbol.."") then

это очень дурная привычка так писать!!! Вы даже не представляете насколько это вредно. Нужно всеми способами избавляться от лишних конкатенаций, а тут наоборот делают.
Почему не написать так:
Код
if tUser.sNick:find(sbansymbol) then
зачем делать лишнюю конкатенацию? Эту привычку надо искоренять! Не пойму, кто вас научил делать эту лишнюю конкатенацию? Ведь никто из скриптописателей данного форума так не пишет.

Автор: DrakonSP 17.2.2010, 0:33

Простите я не знал baffle.gif
Теперь знаю Спасибо byebye.gif

Автор: DrakonSP 21.2.2010, 23:34

Кто-нибудь может подсказать, в чём прикол?
Следующий код запрещает ники состоящие только из цифр

Код
    if tUser.sNick:find"^%d+$" then
        Core.SendToUser(tUser,"*** Ники состоящие только из цифр запрещены!")
        Core.Disconnect(tUser)
    end

Логически рассуждая можно запретить ники состоящие например из символа -
Следующим образом
Код
    if tUser.sNick:find"^%-$" then
        Core.SendToUser(tUser,"*** Ники состоящие только из символов запрещены!")
        Core.Disconnect(tUser)
    end

Символ - заэкранирован, и всё равно не работает
Почему?

Автор: Setuper 21.2.2010, 23:49

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

Код
if tUser.sNick:find"^%-+$" then


Ведь если бы мы в предыдущем примере не поставили плюсик:
Код
if tUser.sNick:find"^%d$" then
то ловилась бы тоже одна цифра, а не любое число.

Автор: DrakonSP 22.2.2010, 0:04

Не могу удержаться и спросить ещё кое что byebye.gif
Таким образом, что бы запретить ники состоящие только из - или . или z
Ну вообщем не важно какие это будут символы
Приходиться делать так:

Раскрывающийся текст
Код
    if tUser.sNick:find"^%-+$" then
        Core.SendToUser(tUser,"*** Ники состоящие только из символов запрещены!")
        Core.Disconnect(tUser)
    end
    if tUser.sNick:find"^z+$" then
        Core.SendToUser(tUser,"*** Ники состоящие только из одной и той же буквы запрещены!")
        Core.Disconnect(tUser)
    end

Мне интересно узнать... Можно ли как то упростить код?
Чтобы просто добавлять символы в
Код
tUser.sNick:find"^z+$"

Автор: Nickolya 22.2.2010, 0:07

По-моему так:

Код
tUser.sNick:find"^([%-z])%1*$"

Автор: DrakonSP 22.2.2010, 0:11

Нет не фурычит

Автор: Setuper 22.2.2010, 12:21

Регулярные выражения в Lua не столь разнообразны, как регулярные выражения пёрла. Поэтому не всё возможно сделать big_smile.gif

Автор: sphinx 22.2.2010, 17:17

Код
   if tUser.sNick:match("^[%-]+$") or tUser.sNick:match("^[%.]+$") or tUser.sNick:match("^[z]+$") then

Автор: Setuper 22.2.2010, 17:58

Тогда уж без квадратных скобок и с использованием find, а не match

Код
local sNick = tUser.sNick
if sNick:find"^%-+$" or sNick:find"^%.+$" or sNick:find"^z+$" then