Название скрипта: RegmeEmail Версия API: 2 Версия скрипта: 1.0 Автор: Setuper Описание: Простенькая регистрация через e-mail. Команда для регистрации: !regme email@email.com После отправки команды, у пользователя есть 10 минут для того, чтобы зайти в почту, посмотреть там пароль и зайти на хаб. В противном случае авторизация не произойдёт, и спустя 10 минут аккаунт удалится с хаба.
ВНИМАНИЕ! Для работы скрипта необходимы модули: cmd и email, а также необходима библиотека сокетов: http://mydc.ru/topic43.html Модули и библиотеку сокетов следует поместить в папку libs.
Непосредственно сам скрипт: regme_email.lua ( 6.18 килобайт )
: 302
Автор: Хабыч 15.12.2009, 15:12
эм... а меню нет у скрипта или я что то не так сделал?
Автор: Setuper 15.12.2009, 15:22
Добавил менюшку регистрации для незарегистрированных пользователей. Скрипт перезалил.
Так как это бета версия, поэтому функциональность урезана. Только одна функция регистрации через e-mail.
Автор: Хабыч 15.12.2009, 15:32
Спасибо отлично работает. Вот хорошо было бы если была функция смены пароля.
Автор: Setuper 15.12.2009, 15:49
В принципе для смены пароля в птохе есть стандартная команда: !passwd <новый пароль>
Автор: Хабыч 15.12.2009, 15:56
Попробовал сам добавить смену пароля
Код
function UserConnected(tUser) Core.SendToUser(tUser, "$UserCommand 1 3 Регистрация\\Зарегистрироваться$<%[mynick]> !regme %[line:Введите Ваш e-mail]|") end
function UserConnected(tUser) Core.SendToUser(tUser, "$UserCommand 1 3 Регистрация\\Сменить пароль$<%[mynick]> !passwd %[line:Введите новый пароль]|") end
Прошу сильно не ругать, что не так, как надо сделать?
Автор: Setuper 15.12.2009, 16:21
Код
function RegConnected(tUser) if tNoActivate[tUser.sNick] then tNoActivate[tUser.sNick] = nil end Core.SendToUser(tUser, "$UserCommand 1 3 Регистрация\\Сменить пароль$<%[mynick]> !passwd %[line:Введите новый пароль]|") end OpConnected = RegConnected
function UserConnected(tUser) Core.SendToUser(tUser, "$UserCommand 1 3 Регистрация\\Зарегистрироваться$<%[mynick]> !regme %[line:Введите Ваш e-mail]|") end
Автор: Хабыч 15.12.2009, 17:56
Setuper
Последняя просьба, покажи пожалуйста как реализовать в этом скрипте функцию "удалить акаунт"? И ничего если команду "!regme" заменить например на "!регистрация"? Это только сам скрипт капать или cmd тоже?
Автор: luxemat 15.12.2009, 18:11
парни почему то у меня скрипт не включается regme_email.lua ошибку показывает что я не так делаю
Автор: Хабыч 15.12.2009, 18:15
Цитата(luxemat @ 15.12.2009, 19:11)
парни почему то у меня скрипт не включается regme_email.lua ошибку показывает что я не так делаю
полож email.lua и cmd.lua в папку libs
Автор: luxemat 15.12.2009, 18:19
спс большое
ещё вопрос что опять не так у меня > Не удалось отослать письмо на адрес: email@email.ru Причина: 535 5.7.8 Error: authentication failed: authentication failure
Автор: Хабыч 15.12.2009, 18:23
настрой мыло, пропиши свой почтовый ящик, smtp сервер
пример
local sFrom = "coolhubs@mail.ru" -- Адрес отправителя local sServer = "smtp.mail.ru" -- Адрес сервера local sUser = "coolhubs" -- Имя пользователя local sPass = "*******" -- Пароль local sHubAddress = "coolhub.sytes.net" -- Адрес вашего хаба
Автор: luxemat 15.12.2009, 18:31
вот что я прописал надеюсь правельно
-- настройки e-mail local sFrom = "kirser@bk.ru" -- Адрес отправителя local sServer = "smtp.mail.ru" -- Адрес сервера local sUser = "LuxeMat" -- Имя пользователя local sPass = "*****" -- Пароль local sHubAddress = "94.243.55.201:450" -- Адрес вашего хаба
и всеровно выдаёт ошибку
Не удалось отослать письмо на адрес: kirser@bk.ru Причина: 535 Incorrect authentication data
Автор: Хабыч 15.12.2009, 18:34
а про это http://mydc.ru/topic43.html не забыл? ты прочитай внимательно
Автор: luxemat 15.12.2009, 18:37
да читал всё
просто другим пользователям вот что пишет <Chukgert> PtokaX> Введён неправильный формат e-mail адреса.
наверное я тугадум
Автор: Хабыч 15.12.2009, 18:38
ну библиотеку полож тоже в папку libs и будет тебе счастье у меня всё работает
Автор: luxemat 15.12.2009, 18:41
Автор: Setuper 15.12.2009, 18:46
luxemat:
local sFrom = "kirser@bk.ru" -- Адрес отправителя local sServer = "smtp.bk.ru" -- Адрес сервера local sUser = "kirser" -- Имя пользователя local sPass = "*****" -- Пароль local sHubAddress = "94.243.55.201:450" -- Адрес вашего хаба
Хабыч: Для того, чтобы добавить команду, нужно в функцию OnStartup() добавить ещё одну функцию cmd.Add, вот так:
Код
function OnStartup() sBot = SetMan.GetString(21) sSubject = sSubject:gsub("%[HUBNAME%]", SetMan.GetString(0)) email.SetValues(sFrom, sServer, sUser, sPass) cmd.Add("[Rr][Ee][Gg][Mm][Ee]", Regme, Protect) cmd.Add("[Рр][Ее][Гг][Ии][Сс][Тт][Рр][Аа][Цц][Ии][Яя]", Regme, Protect) if loadfile(sFile) then dofile(sFile) end end
После этого регистрироваться можно будет как по команде !regme, так и по команде !регистрация Собственно для этого и создавался модуль cmd.
Если не нужен верхний регистр, то можно просто добавить cmd.Add("регистрация", Regme, Protect), тогда регистрация будет срабатывать по команде !регистрация, но не будет срабатывать, например, по команде !РЕГИСРАЦИЯ или !рЕгИсТрАцИя Короче говоря можно добавлять команды как регулярные выражения.
Автор: Хабыч 15.12.2009, 20:11
Во голова, выражаю огромное спасибо Setuper. А можете показать пример реализации функции удалить акаунт?
Автор: Setuper 15.12.2009, 23:23
Сделал.
Пофиксил регулярное выражение для определения формата e-mail адреса (раньше не пропускало e-mail со знаком подчёркивания). Для фикса качаем обновлённый файл email.lua
Автор: Хабыч 16.12.2009, 0:30
Цитата(Setuper @ 16.12.2009, 0:23)
Для фикса качаем обновлённый файл email.lua
скачал. письмо на мыло приходит но скрипт не регает
Автор: Goblin 16.12.2009, 13:24
Можете добавить блокировку регистрации? т.е. черный список mail и IP-адресов.
Автор: trojan 26.12.2009, 21:02
1
Автор: Артём 26.12.2009, 21:11
Цитата(trojan @ 26.12.2009, 20:02)
как за 10 мин успеть?
Код
local iDelay = 10 -- Число минут для аткивации регистрации
а самому выставить нужные минуты не судьба?
Автор: Milena 27.1.2010, 19:29
Письмо приходит и в нём крякозябы из-за того, что почтовый клиент обманывается неверным указанием кодировки в заголовке письма.
В хедере 'content-type: text/plain; charset="iso-8859-1"', а фактически cp1251
Автор: Mc-JuNiOr 19.2.2010, 21:02
Не удалось отослать письмо на адрес: dc-urbania@yandex.ru Причина: timeout
это я напортачил или просто временно недоступно ???
помогите мне настроить ) плизз
Автор: )_(Steep_)_(_Boss)_( 29.3.2010, 0:12
Можно Зделать что бы Скрипт Сохранял ники тех кто был зарегистрирован именно через Емел+ Сохранял Это всё в Текстовике Лежащем в птоке+ к самом текставике Можно ли зделать так что бы указывался Ник а через пробел Его емелл через каторый он зарегался,,, Подскажите реально ето?
Автор: Saymon 29.3.2010, 0:14
только зачем?
Автор: Артём 29.3.2010, 0:16
Цитата()_(Steep_)_(_Boss)_( @ 28.3.2010, 23:12)
... Ник а через пробел Его емелл через каторый он зарегался...
а ещё через пробел пароли от мыла...
Автор: alex82 29.3.2010, 0:22
Цитата()_(Steep_)_(_Boss)_( @ 29.3.2010, 0:12)
Подскажите реально ето?
Реально.
Автор: )_(Steep_)_(_Boss)_( 29.3.2010, 0:30
Цитата(Артём @ 29.3.2010, 2:16)
а ещё через пробел пароли от мыла...
нз зачем админу такое)) он и в регистрации глянуть может)
Автор: (Steep)_(Boss) 30.3.2010, 3:30
Цитата(Milena @ 27.1.2010, 21:29)
Письмо приходит и в нём крякозябы из-за того, что почтовый клиент обманывается неверным указанием кодировки в заголовке письма.
В хедере 'content-type: text/plain; charset="iso-8859-1"', а фактически cp1251
у меня такая же проблема, Надо Это Сетаперу Увидеть
УВ. Сетапер Глянь Картинку
Автор: Saymon 30.3.2010, 6:57
а что ему тут видеть? Смени кодировку в клиенте, а лучше сам клиент.
Автор: (Steep)_(Boss) 30.3.2010, 7:54
Цитата(Saymon @ 30.3.2010, 8:57)
а что ему тут видеть? Смени кодировку в клиенте, а лучше сам клиент.
у мя все читает нормально, Письма+даже с етого форума и т.д,,,, не первый человек жалуется что такая проблема
Автор: Saymon 30.3.2010, 11:55
У меня было похожее от другова скрипта тоже рега через мыло так программа The Bat вообще белеберду отображала. Разработчик сказал что нужно всего лиш поменять кодировку письма в почтовом клиенте. После регистрации сразу юзерам сообщалось типа 'при отображении белиберды в письме - меняйте кодировку' Потом через время юзеры начали почему то боятся за свои почтовые ящики и флудить мою личку вопросами - зачем мыло и тп.... Сделал стандартный вариант регистрации на хабе так заметил что регистрироватся стали раза в 2 больше.
Автор: (Steep)_(Boss) 30.3.2010, 11:58
Цитата(Saymon @ 30.3.2010, 13:55)
У меня было похожее от другова скрипта тоже рега через мыло так программа The Bat вообще белеберду отображала. Разработчик сказал что нужно всего лиш поменять кодировку письма в почтовом клиенте. После регистрации сразу юзерам сообщалось типа 'при отображении белиберды в письме - меняйте кодировку' Потом через время юзеры начали почему то боятся за свои почтовые ящики и флудить мою личку вопросами - зачем мыло и тп.... Сделал стандартный вариант регистрации на хабе так заметил что регистрироватся стали раза в 2 больше.
я та не спорю но еси так посудить почему другие письма без проблем глядятся?
Автор: Saymon 30.3.2010, 12:12
Ну вроде да.
Автор: (Steep)_(Boss) 30.3.2010, 12:15
Цитата(Saymon @ 30.3.2010, 14:12)
Ну вроде да.
Меня Этот Вопрос тоже мучиит, но не знаю Может сетапер Опишится и подскажет как быть) что будет то будет)
Автор: Setuper 30.3.2010, 15:28
Изменение кодировки:
открываем папку libs открываем файл email.lua
ищем в этом файле следующие строчки:
Код
local tMessage = { headers = { to = sTo, from = tVal.sFrom, subject = sSubject, }, body = sMsg }
изменяем их на:
Код
local tMessage = { headers = { to = sTo, from = tVal.sFrom, subject = sSubject, ['content-type'] = 'text/plain; charset="cp1251"' }, body = sMsg }
Другими словами, в таблицу headers нужно дописать поле ['content-type'] = 'text/plain; charset="cp1251"'
Автор: (Steep)_(Boss) 30.3.2010, 15:55
Это Дабовление Кодировки или полное Изменение?
Автор: Saymon 30.3.2010, 15:59
Цитата((Steep)_(Boss) @ 30.3.2010, 16:55)
Это Дабовление Кодировки или полное Изменение?
Цитата
Изменение кодировки:
Автор: (Steep)_(Boss) 30.3.2010, 17:42
а те кто будет проверять почту,, после етого заменения кодировки,, у них что то меняется или остаётся все как было?
Автор: Setuper 30.3.2010, 19:03
Что это значит? Ты русский или не? Можешь нормально объяснить кто, когда и что будет проверять? Лучше не задавать лишних вопросов, а попробовать.
Автор: (Steep)_(Boss) 30.3.2010, 20:55
Вмысле что ето значит, ты если не понял таки скажи а не надо тут влеплять руский не руский,, я Имею введу у тех людей при регистрации и при Проверки Письма у нихбудет такая же Шляпа как у мя на той картинке?,,Просто вот попробовал Через Гуглхром,, через него Квабры кодабры,, через Оперу и Екслоер все Нормальн,+ спасибо что зделал, с программами проблем нету, отображает на ура!!
Автор: stanok 25.8.2010, 4:54
Не получается нечего требует файлы а их нету
Цитата
no file '***\HUB\cmd.dll' no file '***\HUB\libs\cmd.dll' no file '***\HUB\scripts\libs\cmd.dll'
Автор: Nickolya 25.8.2010, 5:15
Всё лежит в 1 посту, помечено специально даже красным, изучай информацию внимательней.
Автор: pol_91 31.8.2010, 2:59
Не удалось отослать письмо на адрес: pol_91@mail.ru Причина: timeout что это значит?
Автор: mariner 31.8.2010, 11:16
ну как бы за нужное время не было отклика от сервера. Такое бывает, если не вбить настройки
Код
local sFrom = "email@email.ru" -- Адрес отправителя local sServer = "smtp.yandex.ru" -- Адрес сервера local sUser = "user" -- Имя пользователя local sPass = "pass" -- Пароль
или сервер использует SSL
Автор: -=Zion=- 11.9.2010, 19:46
Как сделать что бы он операторам сообщение посылал о зарегистрировавшемся юзере?...
Автор: Nickolya 12.9.2010, 19:58
Код
Core.SendToUser(tUser, ("<%s> Вы зарегистрированы. Пароль отправлен вам на указанную вами почту. Вам необходимо в течение %s минут перезайти на хаб, в противном случае активации аккаунта не будет, и аккаунт будет удалён с хаба."):format(sBot, iDelay))
Спасибо огромное... работает Извеняюсь за навязчивость, а можно что бы вот так было:
CODE
Зарегистрировался новый юзер вот детали регистрации: ====================== Ник: Яна Пароль: xxx Шара: 97.66 GB. IP: 93.185.82.248 Режим работы: Актив Открыто слотов: 10
Автор: Nickolya 13.9.2010, 15:52
Код
Core.SendToOps(([[<%s> Зарегистрировался новый юзер, вот детали регистрации:
Ник: %s Пароль: %s Шара: %s IP: %s Режим работы: %s Открыто слотов: %s
]]):format(sBot, tUser.sNick, sPasswd, GetNormalShare(Core.GetUserValue(tUser, 16) or 0), tUser.sIP, Core.GetUserValue(tUser, 10) and "Актив" or "Пассив", Core.GetUserValue(tUser, 21) or 0))
Функция GetNormalShare, ее надо дописать в самый конец скрипта:
Код
function GetNormalShare(s) s = tonumber(s) or 0 if s >= 1125899906842624 then return (math.floor(1000 * s / 1125899906842624) / 1000).." ПБ" elseif s >= 1099511627776 then return (math.floor(1000 * s / 1099511627776) / 1000).." TБ" elseif s >= 1073741824 then return (math.floor(1000 * s / 1073741824) / 1000).." ГБ" elseif s >= 1048576 then return (math.floor(1000 * s / 1048576) / 1000).." МБ" elseif s >= 1024 then return (math.floor(1000 * s / 1024) / 1000).." КБ" else return s.." Б" end end
Писал без проверки, так что за код не ручаюсь.
Автор: -=Zion=- 13.9.2010, 18:12
Спасибо ещё раз огромное... Всё работает как надо...
Автор: Goblin 16.9.2010, 23:03
Скрипт очень хорош но не достаточно, я думаю его нужно дополнить. Вот моя идея по этому скрипту
что нужно добавить: Восстановление пароля на email База паролей+email+nick p.s. я так и не понял emails.dat как работает т.е. после рестарта скрипта база очищается. Блокировка регистрации на уже зарегистрированный email p.s. вроде эта функция уже присутствует но она не работает, можно 100раз пароль отправить на один email. Чёрный список email ( думаю очень будет полезная т.к. можно будет забанить по email, его дольше менять чем ип) И отсылку администраторам что зарегистрировался пользователь
Код
Ник: Пароль: email: IP:
Думаю бессмысленна эта функция т.к. есть отдельный скрипт который отвечает за чистку регистрации. Выкладываю уже без этой функции
Код
у пользователя есть 10 минут для того, чтобы зайти в почту, посмотреть там пароль и зайти на хаб. В противном случае авторизация не произойдёт, и спустя 10 минут аккаунт удалится с хаба.
Все сделал по инстуркции [12:59:51] <Hub> Не удалось отослать письмо на адрес: @yandex.ru Причина: 535 5.7.8 Error: authentication failed: Invalid login or password
Автор: Setuper 28.12.2010, 14:49
Ну написано же, что неправильный логин или пароль. Введи правильный логин и пароль своего ящика и всё получится
Код
local sFrom = "email@email.ru" -- Адрес отправителя local sServer = "smtp.yandex.ru" -- Адрес сервера local sUser = "user" -- Имя пользователя local sPass = "pass" -- Пароль
Автор: Dani_Filth 27.5.2011, 11:52
Люди подскажите пожалуйста... Вот я зарегался на этим скриптом пришло сообщение на мыло.. Таким образом
function GetPass() math.randomseed(os.time()) sPass = tAbc[math.random(#tAbc)] -- 1-я буква пароля local iPass = math.random(4, 7) -- длина пароля = [(от 4 до 7) + 1] for i = 1, iPass do sPass = sPass..tAbc[math.random(#tAbc)] end return sPass end
Тут в этой строке регулируется и создаётся произвольная длина пароля:
Код
local iPass = math.random(4, 7)
Вместо 4 и 7 можешь писать другие разумные размеры длины пароля. Только нужно учитывать, что 1 символ уже создался в предыдущей строке.
PS: Можно было обойтись без предварительной таблицы символов tAbc, но тогда код стал бы громоздче.
UPD: Так, наверно, эту переменную - local sPass - надо объявить заранее, до использования в function GetPass(), иначе не уверен, что вытащится по return.. Поэтому в код внёс поправку небольшую.
Автор: Ameet 8.1.2012, 14:01
Цитата(Ksan @ 5.1.2012, 18:57)
Ameet, находишь в скрипте вот такой код:
Код
function GetPass() math.randomseed(os.time()) return tostring(math.random(100, 99999999)) end
function GetPass() math.randomseed(os.time()) sPass = tAbc[math.random(#tAbc)] -- 1-я буква пароля local iPass = math.random(4, 7) -- длина пароля = [(от 4 до 7) + 1] for i = 1, iPass do sPass = sPass..tAbc[math.random(#tAbc)] end return sPass end
Тут в этой строке регулируется и создаётся произвольная длина пароля:
Код
local iPass = math.random(4, 7)
Вместо 4 и 7 можешь писать другие разумные размеры длины пароля. Только нужно учитывать, что 1 символ уже создался в предыдущей строке.
PS: Можно было обойтись без предварительной таблицы символов tAbc, но тогда код стал бы громоздче.
UPD: Так, наверно, эту переменную - local sPass - надо объявить заранее, до использования в function GetPass(), иначе не уверен, что вытащится по return.. Поэтому в код внёс поправку небольшую.
большое спасибо, можешь подсказать ещё немного
Код
C:\dchub\power\scripts\regme_email.lua:124: bad argument #1 to 'format' (string expected, got nil)
скрипт
Скрипт
Код
local cmd = require"cmd" -- Библиотека команд local email = require"email" -- Библиотека электронный почты
-- настройки e-mail local sFrom = "11111" -- Адрес отправителя local sServer = "11111" -- Адрес сервера local sUser = "111111" -- Имя пользователя local sPass = "1111111" -- Пароль local sHubAddress = "111111" -- Адрес вашего хаба --
local sSubject = "Registration: [HUBNAME]" -- Тема сообщения local iRegProfile = 5 -- Номер профиля для регистрации local sFile = debug.getinfo(1).source:match("^@?(.+[/\\]).-$").."baza/emails.dat"
local sMsg = [[Здравствуйте!
На хабе по адресу dchub://[HUB] появилась регистрационная запись, в которой был указал ваш электронный адрес (e-mail).
Зарегистрирован был следующий ник:
===================================
Ник пользователя (login): [NICK] Пароль: [PASS]
===================================
Если вы не понимаете, о чем идет речь — просто проигнорируйте это сообщение!
Если же именно вы решили зарегистрироваться на хабе по адресу dchub://[HUB], то вам следует войти на хаб и тем самым активировать вашу учетную запись.
Подтверждение регистрации производится один раз. Активация произойдет автоматически.
function GetPass() math.randomseed(os.time()) sPass = tAbc[math.random(#tAbc)] -- 1-я буква пароля local iPass = math.random(5, 8) -- длина пароля = [(от 4 до 7) + 1] for i = 1, iPass do sPass = sPass..tAbc[math.random(#tAbc)] end return sPass end
function Regme(tUser) local sEmail = cmd.msParams if tMailList[sEmail] then return nil, ("С введённым вами e-mail адресом уже зарегистрирован пользователь. Если письмо не пришло на ящик, для перерегистрации на этот e-mail нужно подождать %s минут и повторить регистрацию."):format(iDelay) end local sPasswd = GetPass() local res, err = email.SendMail(sEmail, sSubject, GetMsg(tUser.sNick, sPasswd)) if res then RegMan.AddReg(tUser.sNick, sPasswd, iRegProfile) Core.SendToOps("Зарегистрировался юзер с ником "..tUser.sNick) tMailList[sEmail] = tUser.sNick tNickList[tUser.sNick] = sEmail Save(tMailList, "tMailList", sFile) tNoActivate[tUser.sNick] = true Core.SendToUser(tUser, ("<%s> Пароль отправлен на адрес: (e-mail). Письмо с вашим паролем было успешно отправлено (Message with your password was sent successfully)"):format(sBot, iDelay)) end return res, err end
function Unreg(tUser) RegMan.DelReg(tUser.sNick) for k, v in pairs(tMailList) do if v == tUser.sNick then tMailList[k] = nil return true end end return true end
function ChatArrival(tUser, sData) local r, e = cmd.Exec(sData:sub(#(tUser.sNick) + 4, -2), tUser) if not r and e then Core.SendToUser(tUser, ("<%s> "..e):format(sBot)) end if cmd.miCmdState == 3 then Core.SendToUser(tUser, ("<%s> Команда введена без префикса"):format(sBot)) end if cmd.miCmdState == 4 then Core.SendToUser(tUser, ("<%s> Вы уже зарегистрированы!"):format(sBot)) return true end if r or e then return true end end
function RegConnected(tUser) if tNoActivate[tUser.sNick] then tNoActivate[tUser.sNick] = nil end Core.SendToUser(tUser, "$UserCommand 1 3 Регистрация\\Сменить пароль$<%[mynick]> !passwd %[line:Введите новый пароль]||".. "$UserCommand 1 3 Регистрация\\Удалить регистрацию$<%[mynick]> !unreg|") end OpConnected = RegConnected
function UserConnected(tUser) Core.SendToUser(tUser, "$UserCommand 1 3 Регистрация\\Зарегистрироваться$<%[mynick]> !regme %[line:Введите Ваш e-mail]|") end
function Save(tTable, sTableName, sFile) local h = io.open(sFile, "w") if h then Serialize(tTable, sTableName, h) h:flush() h:close() end end
function Serialize(tTable, sTableName, hFile, sTag) sTag = sTag or '' hFile:write(sTag..sTableName.." = {\n" ) for k, v in pairs(tTable) do local sKey = ( type(k) == "string" ) and ( "[%q]" ):format(k) or ( "[%d]" ):format(k) if type(v)=="table" then Serialize(v, sKey, hFile, sTag..'\t') else local sValue = ( type(v) == "string" ) and ( "%q" ):format(v) or tostring(v) hFile:write(sTag..'\t'..sKey.." = "..sValue) end hFile:write",\n" end hFile:write(sTag..'}') end
Буду очень благодарен!
Автор: Enyby 8.1.2012, 14:07
Цитата(Ameet @ 8.1.2012, 13:01)
Код
C:\dchub\power\scripts\regme_email.lua:124: bad argument #1 to 'format' (string expected, got nil)
В приведенном скрипте на 124 строке нет функции format. Укажите где 124 строка в вашем файле.
Автор: Ameet 8.1.2012, 14:18
Цитата(Enyby @ 8.1.2012, 14:07)
В приведенном скрипте на 124 строке нет функции format. Укажите где 124 строка в вашем файле.
Сама функция
Фенкция
Код
function Regme(tUser) local sEmail = cmd.msParams if tMailList[sEmail] then return nil, ("С введённым вами e-mail адресом уже зарегистрирован пользователь. Если письмо не пришло на ящик, для перерегистрации на этот e-mail нужно подождать %s минут и повторить регистрацию."):format(iDelay) end local sPasswd = GetPass() local res, err = email.SendMail(sEmail, sSubject, GetMsg(tUser.sNick, sPasswd)) if res then RegMan.AddReg(tUser.sNick, sPasswd, iRegProfile) Core.SendToOps("Зарегистрировался юзер с ником "..tUser.sNick) tMailList[sEmail] = tUser.sNick tNickList[tUser.sNick] = sEmail Save(tMailList, "tMailList", sFile) tNoActivate[tUser.sNick] = true Core.SendToUser(tUser, ("<%s> Пароль отправлен на адрес: (e-mail). Письмо с вашим паролем было успешно отправлено (Message with your password was sent successfully)"):format(sBot, iDelay)) end return res, err end
Строка
Код
return nil, ("С введённым вами e-mail адресом уже зарегистрирован пользователь. Если письмо не пришло на ящик, для перерегистрации на этот e-mail нужно подождать %s минут и повторить регистрацию."):format(iDelay)
Автор: Enyby 8.1.2012, 14:29
Вижу в коде переменную iDelay, которая не инициализирована. Первый раз используется в указанной строке, а второй раз передается в
Код
Core.SendToUser(tUser, ("<%s> Пароль отправлен на адрес: (e-mail). Письмо с вашим паролем было успешно отправлено (Message with your password was sent successfully)"):format(sBot, iDelay))
Но в строку формата не подставляется.
Более того, судя по названию переменной это целое число. А выводится как строка. Дальше. Судя по сообщению скрипта, должен быть таймаут повторной регистрации. Его нет. Во всяком случае в коде я его не вижу.
Как экспресс фикс, можно в начале скрипта написать:
Код
iDelay = "5"
Но это неправильный подход.
UPD: Резюмируя, могу сказать, что скрипт требует переделки, если предлагается реализовывать заявленный функционал.
Если же не переделывать, то достаточно изменить так:
Код
function Regme(tUser) local sEmail = cmd.msParams if tMailList[sEmail] then return nil, ("С введённым вами e-mail адресом уже зарегистрирован пользователь. Если письмо не пришло на ящик, для перерегистрации обратитесь к оператору.") end local sPasswd = GetPass() local res, err = email.SendMail(sEmail, sSubject, GetMsg(tUser.sNick, sPasswd)) if res then RegMan.AddReg(tUser.sNick, sPasswd, iRegProfile) Core.SendToOps("Зарегистрировался юзер с ником "..tUser.sNick) tMailList[sEmail] = tUser.sNick tNickList[tUser.sNick] = sEmail Save(tMailList, "tMailList", sFile) tNoActivate[tUser.sNick] = true Core.SendToUser(tUser, ("<%s> Пароль отправлен на адрес: (e-mail). Письмо с вашим паролем было успешно отправлено (Message with your password was sent successfully)"):format(sBot)) end return res, err end
Автор: Ameet 13.1.2012, 0:59
Ребята, помогите реализовать функцию восстановления пароля.
Автор: Enyby 13.1.2012, 8:25
Вот функция. Вызывать по вкусу. Особо не тестил, но должно работать:
Код
function Restore(tUser) local sEmail = cmd.msParams if not tMailList[sEmail] then return nil, ("С введённым вами e-mail адресом ни зарегистрирован ни один пользователь. Если вы уверены, что e-mail указан без ошибок, обратитесь к оператору.") end if not RegMan.GetReg(tMailList[sEmail]) then return nil, ("Аккаунт пользователя, привязанный к данному e-mail был удален, обратитесь к оператору.") end local sPasswd = GetPass() local res, err = email.SendMail(sEmail, sSubject, GetMsg(tMailList[sEmail], sPasswd)) if res then RegMan.ChangeReg(tMailList[sEmail], sPasswd, RegMan.GetReg(tMailList[sEmail]).iProfile) Core.SendToOps("Выполнено восстановление пароля для ника "..tMailList[sEmail].." на e-mail "..sEmail) Core.SendToUser(tUser, ("<%s> Пароль отправлен на адрес: %s. Письмо с вашим паролем было успешно отправлено (Message with your password was sent successfully)"):format(sBot, sEmail)) end return res, err end
Автор: Ameet 27.1.2012, 15:27
Видел на озерках фишку что невозможно зарегистрироваться если нету шары 10 гб, как можно реализовать такую фишку?
Автор: Артём 27.1.2012, 16:25
Ameet, перед отправкой команды сделай проверку на шару. Примерно так (может и не правильно, но вроде работает )
РаскрИвушка
Код
function ChatArrival(tUser, sData) Core.GetUserAllData(tUser) -- начало if tUser.iShareSize <= iMinShare then Core.SendToUser(tUser, "У вас мало открыто шары, откройте "..iMinShare.."") return true -- конец проверки на шару end local r, e = cmd.Exec(sData:sub(#(tUser.sNick) + 4, -2), tUser) if not r and e then Core.SendToUser(tUser, ("<%s> "..e):format(sBot)) end if cmd.miCmdState == 3 then Core.SendToUser(tUser, ("<%s> Команда введена без префикса"):format(sBot)) end if cmd.miCmdState == 4 then Core.SendToUser(tUser, ("<%s> Вы уже зарегистрированы!"):format(sBot)) return true end if r or e then return true end end
Ameet, перед отправкой команды сделай проверку на шару. Примерно так (может и не правильно, но вроде работает )
РаскрИвушка
Код
function ChatArrival(tUser, sData) Core.GetUserAllData(tUser) -- начало if tUser.iShareSize <= iMinShare then Core.SendToUser(tUser, "У вас мало открыто шары, откройте "..iMinShare.."") return true -- конец проверки на шару end local r, e = cmd.Exec(sData:sub(#(tUser.sNick) + 4, -2), tUser) if not r and e then Core.SendToUser(tUser, ("<%s> "..e):format(sBot)) end if cmd.miCmdState == 3 then Core.SendToUser(tUser, ("<%s> Команда введена без префикса"):format(sBot)) end if cmd.miCmdState == 4 then Core.SendToUser(tUser, ("<%s> Вы уже зарегистрированы!"):format(sBot)) return true end if r or e then return true end end
такой вопрос а имеет значение куда вставить функцию в конец или начала списка функций?
Автор: Enyby 27.1.2012, 17:36
Только вместо:
Код
Core.GetUserAllData(tUser)
Лучше писать:
Код
Core.GetUserData(tUser, 16)
Автор: Артём 27.1.2012, 17:41
Ameet, нет, всё равно P.S. Если хочешь чтобы шару в нормальном виде показывало, а не в байтах, добавь
Код
FormatSize = function(int) local i,u,x = tonumber(int) or 0,{"","K","M","G","T","P"},1 while i > 1024 do i,x = i/1024,x+1 end return string.format("%.2f %sB.",i,u[x]) end
и
Код
Core.SendToUser(tUser, "У вас мало открыто шары, откройте "..FormatSize(iMinShare).."")
будет показывать место
Цитата
У вас мало открыто шары, откройте 536870912000
вот так
Цитата
У вас мало открыто шары, откройте 500.00 GB.
Автор: Ameet 27.1.2012, 17:58
Цитата(Артём @ 27.1.2012, 17:41)
Ameet, нет, всё равно P.S. Если хочешь чтобы шару в нормальном виде показывало, а не в байтах, добавь
Код
FormatSize = function(int) local i,u,x = tonumber(int) or 0,{"","K","M","G","T","P"},1 while i > 1024 do i,x = i/1024,x+1 end return string.format("%.2f %sB.",i,u[x]) end
и
Код
Core.SendToUser(tUser, "У вас мало открыто шары, откройте "..FormatSize(iMinShare).."")
будет показывать место вот так
как бы сделать что бы в сообщении что вам нужно шарнуть 10гб писало не метрами а гигабайтами?
Автор: Enyby 27.1.2012, 18:01
А что там у тебя пишет?
Автор: Артём 27.1.2012, 18:04
Ameet, обнови страничку и посмотри мой пост выше, у меня гигабайтами пишет. Значит ты в метрах указал ограничение. 10 Гб = 10737418240 Б
Автор: Ameet 27.1.2012, 18:17
Цитата(Артём @ 27.1.2012, 18:04)
Ameet, обнови страничку и посмотри мо пост выше, у меня гигабайтами пишет. Значит ты в метрах указал ограничение. 10 Гб = 10737418240 Б
я то думаю в чем проблема, точно в метрах! Спасибо!
Автор: Артём 27.1.2012, 18:22
Ameet, Кнопочка есть...
Автор: Ameet 27.1.2012, 18:23
Цитата(Ameet @ 27.1.2012, 18:17)
я то думаю в чем проблема, точно в метрах! Спасибо!
блин,
Код
[17:22:14] *У вас мало открыто шары, откройте 10737418240
Автор: a_l_e_x_ 29.5.2012, 1:43
Ребят, у меня вот это пишет - Не удалось отослать письмо на адрес: 12345@list.ru Причина: 501 Syntactically invalid EHLO argument
local sFrom = "12345@list.ru" -- Адрес отправителя local sServer = "smtp.mail.ru" -- Адрес сервера local sUser = "12345@list.ru" -- Имя пользователя local sPass = "12345" -- Пароль local sHubAddress = "192.168.0.1" -- Адрес вашего хаба
Я проверял, не получаеться ничего!
Автор: Saymon21 29.5.2012, 10:16
Если адрес smtp сервера прописать smtp.list.ru ?
Автор: a_l_e_x_ 29.5.2012, 15:12
Всё равно так пишет, незнаю в чём ошибка
Автор: mariner 29.5.2012, 19:00
в поле "имя вашего хаба" впиши свой домен.
Автор: Sergey613 10.10.2012, 15:36
Синтаксис C:\0.4.2.0b401-Lua5.2.1\libs\cmd.lua:6: attempt to call global 'module' (a nil value) 6 строка: module"cmd"
Автор: Артём 10.10.2012, 15:43
Sergey613, прочти ещё раз первый пост, а именно красные буковки !!!
Автор: Sergey613 10.10.2012, 16:00
Цитата(Артём @ 10.10.2012, 16:43)
Sergey613, прочти ещё раз первый пост, а именно красные буковки !!!
Какие из них? Эти: ВНИМАНИЕ! Для работы скрипта необходимы модули: cmd и email, а также необходима библиотека сокетов: http://mydc.ru/topic43.html Модули и библиотеку сокетов следует поместить в папку libs. Или эти: local sServer = "smtp.bk.ru" -- Адрес сервера local sUser = "kirser" -- Имя пользователя
Если про папку libs, то она давно создана и библиотеки там лежат и файлы: cmd.lua и email.lua туда же упали. Если про адрес сервера и имя пользователя, то я их вбил свои!
Автор: Alexey 10.10.2012, 16:19
Ну всё правильно тебе пишет, ведь в Lua 5.2
Цитата
Function module is deprecated. It is easy to set up a module with regular Lua code. Modules are not expected to set global variables.
Либо ставь птоку с луа 5.1, либо адаптируй модули сам.
Автор: Sergey613 10.10.2012, 16:30
Цитата(Alexey @ 10.10.2012, 17:19)
Ну всё правильно тебе пишет, ведь в Lua 5.2 Либо ставь птоку с луа 5.1, либо адаптируй модули сам.
Понятно. Спасибо. Знать бы как :(
Автор: Артём 10.10.2012, 16:41
Sergey613, ты не знаешь как поставить птоку с луа 5.1 ?
Автор: Sergey613 10.10.2012, 17:37
Да нет, не в том проблема. ))) Вообщем если вкратце, то всё дело в памяти )) DD3 дешёвая зараза, как не прикупить, купил, а куда её 8 гигов? под 32 битные она не смотрится (видится) а под 64 пришлось винду ставить, ну и пошло, одно за другим. Тут и птоха 64 бита, ну и библиотеки соответсвенно под неё, вот и результат . ))
Автор: -=Zion=- 7.3.2013, 12:41
Я дико извиняюсь за наглость :-) Но, возможно ли к этому скрипту как-нибудь прикрутить MySQL? А то слишком часто выключают свет дома, и зареганые юзеры не сохраняются. Бесперебойник имеется, но его хватает буквально на полчаса, а свет, бывает, вырубают на целый день. Или может посоветуете, как сделать так, чтобы зареганые юзеры "на лету" сохранялись, а не висели в памяти.
Автор: Артём 7.3.2013, 13:47
в какой памяти они висят, а разве не должны они сразу записываться в RegisteredUsers.XML ?
Автор: -=Zion=- 7.3.2013, 14:35
Цитата(Артём @ 7.3.2013, 18:47)
в какой памяти они висят, а разве не должны они сразу записываться в RegisteredUsers.XML ?
В том то и дело, что они туда записываются только при корректном выключении/перезапуске хаба, а до этих действий их там нет.
PS. - OS Ubuntu
Автор: Alexey 7.3.2013, 14:54
Добавь строку
Код
RegMan.Save()
перед строкой 149 и после строки 131.
Автор: -=Zion=- 7.3.2013, 15:58
Цитата(Alexey @ 7.3.2013, 19:54)
Добавь строку
Код
RegMan.Save()
перед строкой 149 и после строки 131.
В какое именно место?
Код
128. Зарегистрировался новый юзер 129. вот детали регистрации: 130. ====================== 131. Ник: %s 132. Шара: %s 133. IP: %s 134. Режим работы: %s 135. Открыто слотов: %s 136. 137. ]]):format(sBot, tUser.sNick, GetNormalShare(Core.GetUserValue(tUser, 16) or 0), tUser.sIP, Core.GetUserValue(tUser, 10) and "Актив" or "Пассив", Core.GetUserValue(tUser, 21) or 0)) 138. end 139. return res, err 140. end 141. 142. function Unreg(tUser) 143. RegMan.DelReg(tUser.sNick) 144. for k, v in pairs(tMailList) do 145. if v == tUser.sNick then 146. tMailList[k] = nil 147. return true 148. end 149. end 150. return true 151. end
Автор: Alexey 7.3.2013, 16:26
Номера строк я давал ориентируясь на версию из стартового поста темы. Пользователи модифицированных версий должны самостоятельно сделать корректировки с учётом внесённых ими модификаций.
Указанную строку надо добавить после первого вызова RegMan.DelReg и перед TmrMan.RemoveTimer.
Автор: -=Zion=- 7.3.2013, 16:49
Цитата(Alexey @ 7.3.2013, 21:26)
Номера строк я давал ориентируясь на версию из стартового поста темы. Пользователи модифицированных версий должны самостоятельно сделать корректировки с учётом внесённых ими модификаций.
Спасибо, вроде разобрался, вот так должно получиться?:
Код
function Unreg(tUser) RegMan.DelReg(tUser.sNick) RegMan.Save() for k, v in pairs(tMailList) do if v == tUser.sNick then tMailList[k] = nil return true end end return true end
function Timer(id) local sNick = tTimers[id] if tNoActivate[sNick] then RegMan.DelReg(sNick) tMailList[tNickList[sNick]] = nil tNickList[sNick] = nil Save(tMailList, "tMailList", sFile) end RegMan.Save() TmrMan.RemoveTimer(id) end
Но всё равно не сохраняет. Т.е. в самой птоке зареганый юзер есть, а в файле его нет.
Автор: Alexey 7.3.2013, 17:41
Видимо, ты ждал меньше, чем iDelay минут.
Автор: -=Zion=- 7.3.2013, 18:52
Цитата(Alexey @ 7.3.2013, 22:41)
Видимо, ты ждал меньше, чем iDelay минут.
Ну тоесть он только через 10 минут запишется в фаил? Попробую, позже отпишусь, но что-то мне подсказывает что это тут не причем :-)
Попробывал, да, действительно записалась через 10 минут. Спасибо еще раз. А не подскажите в каком месте нужно изменить этот самый iDelay чтобы поменьше время выставить (например одну минуту), но чтобы время, юзеру, на перезаход на хаб (для активации) так и осталось 10 минут. Случаем не здесь?:
Зачем это надо? Не вижу смысла сохранять неактивированный ник.
Автор: Iskandark 13.4.2014, 21:56
Столкнулся с проблемой в этом скрипте: в момент отправки письма регистрируемому пользователю чат подвисает на 2-5 секунд до момента, пока не будет отправлено сообщение регистрируемому пользователю об отправке письма.
Такая же проблема с подвисанием чата на секунд 5 возникает при подключении к любому сайту по http через скрипты. Использование http.TIMEOUT = 1 - не вариант, так как подвисать всё равно будет хоть и 1 секунду...
Как понимаю, библиотека luasocket занимает открытый socket хаба... Можно ли использовать собственное соединение, отдельное от соединения хаба?
Стоит Ptokax 0.5.0.1 под Debian. Решаема ли эта проблема? Знает кто и сталкивался?
Автор: Iskandark 17.4.2014, 0:10
Не могу нигде найти, как всё-таки сделать отправку письма о регистрации в неблокирующем сокет режиме (non-blocking).
Кто-нибудь знает, как можно реализовать это?
Есть подозрение, что надо внести какую-то правку в module("socket.tp"), вот в этот блок, с использование socket.select
Код
function connect(host, port, timeout, create) local c, e = (create or socket.tcp)() if not c then return nil, e end c:settimeout(timeout or TIMEOUT) local r, e = c:connect(host, port) if not r then c:close() return nil, e end return base.setmetatable({c = c}, metat) end
Да, там написано использовать socket.select и sock:settimeout(0): "Non-blocking: call socket.select with a timeout argument of 0, and use sock:settimeout(0) on the socket you're reading from." Пробую в разных вариациях, вылезают разного рода ошибки и непонятно как всё-таки сделать отправку писем в неблокирующем режиме :( Пока что не работает... Может кто знает, как сделать рабочий вариант с неблокирующим сокетом?
Ещё один из вариантов, чтобы не лезть в модули Luasocket это использовать параметр [create = function] в функции smtp.send():
Код
create: An optional function to be used instead of socket.tcp when the communications socket is created.
Но непонятно опять же, как это сокет неблокирующем режиме сделать.
Автор: dimetro 9.2.2015, 21:22
[20:19:50] <PtokaX> Не удалось отослать письмо на адрес: ххххх@yandex.ru Причина: 530 5.7.7 Email sending without SSL/TLS encryption is not allowed. Please see: http://mydc.ru/r/?http://help.yandex.ru/mail/mail-clients/ssl.xml
Автор: WINS 10.2.2015, 8:47
ищи мылосервисы, которые могут работать без шифрования
Автор: Iskandark 11.2.2015, 23:17
Цитата(WINS @ 10.2.2015, 8:47)
ищи мылосервисы, которые могут работать без шифрования
нормальных и известных почтовых серверов, работающих без шифрования нет... можно с трудом найти...
Хорошо бы, если lua могла работать с yandex и google. Но я пока не нашел решения рабочего.
Автор: dimetro 11.2.2015, 23:45
Цитата(Iskandark @ 11.2.2015, 22:17)
нормальных и известных почтовых серверов, работающих без шифрования нет... можно с трудом найти...
Хорошо бы, если lua могла работать с yandex и google. Но я пока не нашел решения рабочего.
на хабе Озерки как ни странно работает , почта ихняя на google. видать что то знают
Автор: Alexey 15.2.2015, 6:37
Модуль отправки писем с шифрованием SSL/TLS. Для работы требуется библиотека http://mydc.ru/topic3401.html. email.lua ( 2.59 килобайт )
: 12
Автор: Alexey 15.2.2015, 21:20
Из рубрики «Нам пишут...»:
Цитата(Артём @ 15.2.2015, 12:52)
Привет, куда этот модуль нужно закидывать или просто как скрипт запускать?
Закидывать вместо одноимённого модуля из первого поста.
Цитата(Артём @ 15.2.2015, 12:52)
Он будет работать с дисктриктовым FlexyReg? А то и там не отсылаются письма на мыло при регистрации.
Я не нашёл такого скрипта на форуме, поэтому не могу сказать наверняка. Но если FlexyReg использует модуль из первого поста, то и с выложенным мной работать будет успешно.
PS: Такие вопросы лучше задавать в темах скриптов, а не через личные сообщения, — ведь ответ может быть интересен и другим посетителям форума.
Автор: Error 15.11.2015, 7:47
С данным плагином Ptokax на windows7 работает без ошибок, при переносе на windows server 2008 выдает ошибку: Синтаксис error loading module 'ssl.core' from file 'D:\PtokaX_Server\libs\ssl.dll': system error 14001 как исправить?
Автор: Saymon21 15.11.2015, 11:55
Один из вариантов - http://mydc.ru/r/?https://www.microsoft.com/ru-ru/download/details.aspx?id=40784 качай vcredist под свою архитектуру и ставь.