Предлагаю идею! Есть так назаываемый сэйскрипт, который дает возможность писать от любого ника, но команду приходится использовать каждый раз...частенько это неудобно... Предлагаю сделать такое меню: Использовать ник -> : 1)- Использовать ник для общего чата 2)- Использовать ник для ПМ 3)- Использовать ник для всего 4)- отключить ник
При нажатии 1 и 2 или 3 в файл для того или иного юзера (в частности для админов) записывается соответсвующий выбранный им ник с параметром (1 or 2 or 3), и последующие сообщения этого юзера идут от этого ника, до тех пор пока он не обнулит запись (4) -Отключить ник)
Вроде все! Идею предложил...кто что думает?
ГОТОВО. Название скрипта: Saynick (писал в дополнение скрипту "Сказать от любого имени") Версия скрипта: 1.0 Версия API: API2 Автор: Vicious - Возможность зарезервировать любой ник для общего чата(через меню), после чего все сообщения в общий чат будут идти от этого ника, до тех пор пока вы не обнулите записи ников. (так же через меню) - Возможность зарезервировать ник для ЛС, причем ответы, направленные зарезервированному вами пользователю, теперь будут приходить вам.
Автор: alex82 21.3.2009, 16:54
Была такая идея. До практической реализации дело не дошло.
Автор: Setuper 22.3.2009, 21:00
Идея не плохая, однако она требует структурированного и универсального написания.
Автор: vicious 23.3.2009, 8:06
Цитата(Setuper @ 22.3.2009, 21:00)
Идея не плохая, однако она требует структурированного и универсального написания.
и? Не станешь писать?
Автор: vicious 24.3.2009, 23:11
мучаюсь -мучаюсь ...нефига не получается! надо учить матчасть с нуля видать...никак не вьеду по нормальному как работать с текстовыми файлами...записывать, в них то что мне нужно и потом извлекать из них то что мне нужно.
Тобишь хочу чтобы при нажатии в меню "использовать ник" в текстовый файл записывалось что такому нику присвоилось такое-то имя....и дальше при ChatArrival смотрелось присвоен ли в этом текстовом файле данному нику какое-нибудь имя или нет...! ну вообщем вы поняли о чем я....но нефига не получается! Может все таки луа -мастеры отзовутся?
Автор: Wariner 24.3.2009, 23:18
я не мастер... но проще всего будет инфу в файле хранить в виде таблицы. функции сохранения можно найти в разделе для разработчииков ==>> склад функций. пример работы с таблицами можешь взять из любого скрипта. например из этой темы http://mydc.ru/topic602.html
Автор: vicious 24.3.2009, 23:48
Цитата(Wariner @ 24.3.2009, 23:18)
я не мастер... но проще всего будет инфу в файле хранить в виде таблицы. функции сохранения можно найти в разделе для разработчииков ==>> склад функций. пример работы с таблицами можешь взять из любого скрипта. например из этой темы http://mydc.ru/topic602.html
Да согласен, вообщем то я и пробовал в виде таблицы...по примеру скрипта одного...но у меня каждый раз перезаписывается текстовый файл, а не добавляется...хотя код скопирован со скрипта в котором добавлялось и кроме значений того, ЧТО добавлять я там не менял...(вроде бы)
Вот код на данном этапе:
Код
sBot = SetMan.GetString(21) -- Имя бота tNickam = {} tNickpm = {} function OnStartup() sFileam = Core.GetPtokaXPath().."scripts/Saynick/Nickam.tbl" sFilepm = Core.GetPtokaXPath().."scripts/Saynick/Nickpm.tbl" if loadfile(sFileam) and loadfile(sFilepm) then dofile(sFileam) dofile(sFilepm) end TmrMan.AddTimer(1800000,"OnExit") end
function OnExit() --WriteTable(tNicks, "saynick", sFile) end
function UserConnected(tUser) --if tUser.iProfile == 0 then local sMsg = "$UserCommand 1 1 **УПРАВЛЕНИЕ\\*Сказать\\Использовать ник для AM$<%[mynick]> !addamnick %[line:Введите ник для AM]||".. "$UserCommand 1 1 **УПРАВЛЕНИЕ\\*Сказать\\Использовать ник для PM$<%[mynick]> !addpmnick %[line:Введите ник для PM]||".. "$UserCommand 1 1 **УПРАВЛЕНИЕ\\*Сказать\\Сбросить ники$<%[mynick]> !remnicks||".. "$UserCommand 1 2 **УПРАВЛЕНИЕ\\*Сказать\\Использовать этот ник для AM$<%[mynick]> !addamnick %[nick]||".. "$UserCommand 1 2 **УПРАВЛЕНИЕ\\*Сказать\\Использовать этот ник для PM$<%[mynick]> !addpmnick %[nick]||" Core.SendToUser(tUser, sMsg) --end end OpConnected = UserConnected RegConnected = UserConnected
function ChatArrival(tUser, sData) sData = string.sub(sData,1,-2) nick = tUser.sNick local _,_,cmd = string.find(sData, "%b<>%s+(%S+)") if cmd == "!addamnick" then local _,_,sNick = string.find(sData, "%b<>%s+%S+%s+(%S+)") if not sNick then else if sNick ~= tUser.sNick then tNickam[tUser.sNick] = {} table.insert(tNickam[tUser.sNick], sNick) WriteTable(tNickam, "Nickam", sFileam) else Core.SendToUser(tUser, "<"..sBot.."> Этот ник у вас по умолчанию в настройках DC") end
end return true end end
function WriteTable(tTable, tablename, file) local handle = io.open(file, "w") Serialize(tTable, tablename, handle) handle:close() end
function Serialize(tTable, sTableName, hFile, sTab) sTab = sTab or ""; hFile:write(sTab..sTableName.." = {\n" ); for key, value in pairs(tTable) do local sKey = (type(key) == "string") and string.format("[%q]",key) or string.format("[%d]",key);
if(type(value) == "table") then Serialize(value, sKey, hFile, sTab.."\t"); else local sValue = (type(value) == "string") and string.format("%q",value) or tostring(value); hFile:write(sTab..'\t["'..nick..'"] = '..sValue); end hFile:write(",\n"); end hFile:write(sTab.."}"); end
Сразу говорю, скорее всего тут и оишбки и вообще попытка написать скрипт "по русски"...но увы как могу...я тока начинающий...
Автор: Setuper 25.3.2009, 0:10
Переменные должны быть одинаковы
Код
WriteTable(tNickam, "tNickam", sFileam)
Автор: vicious 25.3.2009, 0:53
Цитата(Setuper @ 25.3.2009, 0:10)
Переменные должны быть одинаковы
Код
WriteTable(tNickam, "tNickam", sFileam)
хм...туплю наверн, но не понял. Что исправить и на что исправить?
Ну как так не может? Проверь попробуй код на деле, я говорю то что есть. У меня именно так и записывает, как описал выше!
Вот еще раз весь код который щас имею: (правда пока что он имеет меня)
Код
--[[ Название скрипта: Saynick Версия скрипта: 1.0 Версия API: API2 Автор: Vicious ]]--
sBot = SetMan.GetString(21) -- Имя бота tNickam = {} tNickpm = {} function OnStartup() sFileam = Core.GetPtokaXPath().."scripts/Saynick/Nickam.tbl" sFilepm = Core.GetPtokaXPath().."scripts/Saynick/Nickpm.tbl" if loadfile(sFileam) and loadfile(sFilepm) then dofile(sFileam) dofile(sFilepm) end TmrMan.AddTimer(1800000,"OnExit") end
function OnExit() --WriteTable(tNicks, "saynick", sFile) end
function UserConnected(tUser) --if tUser.iProfile == 0 then local sMsg = "$UserCommand 1 1 **УПРАВЛЕНИЕ\\*Сказать\\Использовать ник для AM$<%[mynick]> !addamnick %[line:Введите ник для AM]||".. "$UserCommand 1 1 **УПРАВЛЕНИЕ\\*Сказать\\Использовать ник для PM$<%[mynick]> !addpmnick %[line:Введите ник для PM]||".. "$UserCommand 1 1 **УПРАВЛЕНИЕ\\*Сказать\\Сбросить ники$<%[mynick]> !remnicks||".. "$UserCommand 1 2 **УПРАВЛЕНИЕ\\*Сказать\\Использовать этот ник для AM$<%[mynick]> !addamnick %[nick]||".. "$UserCommand 1 2 **УПРАВЛЕНИЕ\\*Сказать\\Использовать этот ник для PM$<%[mynick]> !addpmnick %[nick]||" Core.SendToUser(tUser, sMsg) --end end OpConnected = UserConnected RegConnected = UserConnected
function ChatArrival(tUser, sData) sData = string.sub(sData,1,-2) nick = tUser.sNick local _,_,cmd = string.find(sData, "%b<>%s+(%S+)") if cmd == "!addamnick" then local _,_,sNick = string.find(sData, "%b<>%s+%S+%s+(%S+)") if not sNick then Core.SendToUser(tUser, "<"..sBot.."> Вы не ввели ник!") else if sNick ~= tUser.sNick then tNickam[tUser.sNick] = sNick WriteTable(tNickam, "tNickam", sFileam) else Core.SendToUser(tUser, "<"..sBot.."> Этот ник у вас по умолчанию в настройках DC") end
end return true end end
function WriteTable(tTable, tablename, file) local handle = io.open(file, "w") Serialize(tTable, tablename, handle) handle:close() end
function Serialize(tTable, sTableName, hFile, sTab) sTab = sTab or ""; hFile:write(sTab..sTableName.." = {\n" ); for key, value in pairs(tTable) do local sKey = (type(key) == "string") and string.format("[%q]",key) or string.format("[%d]",key);
if(type(value) == "table") then Serialize(value, sKey, hFile, sTab.."\t"); else local sValue = (type(value) == "string") and string.format("%q",value) or tostring(value); hFile:write(sTab..'\t["'..nick..'"] = '..sValue); end hFile:write(",\n"); end hFile:write(sTab.."}"); end
Автор: Setuper 25.3.2009, 14:12
Хаха. Ну конечно у тебя будет повторяться, так как у тебя неправильно написана функция Serialize.
Это что за самодеятельность:
Код
hFile:write(sTab..'\t["'..nick..'"] = '..sValue);
Должно быть так:
Код
hFile:write(sTab.."\t"..sKey.." = "..sValue);
Функция Serialize предназначена для рекурсивной записи в файл. Её никогда нельзя изменять.
Автор: vicious 25.3.2009, 14:58
Спс! Да я догадывался что все дело в ней, просто чес говоря вообще не знаю принцип работы этой функции, не дадите ссылку где есть описалово (желательно на русс, но если нет то и на англ сойдет)... Заранее спасибо!
Автор: Wariner 25.3.2009, 15:14
зачем новичку забивать себе этим голову. Для начало надо узнать структура таблиц и правильно научится с ними работать!
Все...сделал вроде как, работает норм, хотя думаю не все в нем идеально))) . Спасибо всем, кто помогал. Скрипт выкладываю, проверяйте, говорите где недоработки и оишибки еще остались, буду исправлять.
Автор: Серый 27.3.2009, 1:42
5+ Работает...пока нормал )) Спс!
Автор: vicious 27.3.2009, 12:38
Хм...вопросик вот, хочу улучшить скрипт.
Код
tNickam = { ["[len]vicious"] = "ухаха", }
В данном коде tNickam["[len]vicious"] возвращает "ухаха"
Как мне получить само "[len]vicious"? (ессно это не tUser.sNick)
Автор: Wariner 27.3.2009, 14:40
может я не правильно понял но
Код
for i,v in pairs(tNickam) do if v == "ухаха" then Core.SendToAll(i) end end
Автор: vicious 27.3.2009, 15:44
Все верно, спасибо! Я хотел сделать возможно ответа на присвоенный ник. В СейСкрипте если кому то пишешь в пм от выдуманного ника, то ответ уже не приходит, а в моем скрипте ответ будет приходить человеку, который писал в ПМ от зарезервированного ника!!!!
Перезалил скрипт, теперь в нем есть все, что я от него хотел!
Автор: Setuper 27.3.2009, 19:47
Устное предупреждение! Подобного рода скрипты запрещены! Нехорошо читать чужие лички!
Автор: vicious 27.3.2009, 21:01
Цитата(Setuper @ 27.3.2009, 19:47)
Устное предупреждение! Подобного рода скрипты запрещены! Нехорошо читать чужие лички!
Окей, только при чем здесь читать чужие лички и этот скрипт...его назначения совсем для другого
Автор: Wariner 27.3.2009, 21:04
если человек ушёл, а ты поставил себе его ник, то ты читаешь его личку. да ещё и отвечаешь на неё!
Автор: vicious 27.3.2009, 21:09
Цитата(Wariner @ 27.3.2009, 21:04)
если человек ушёл, а ты поставил себе его ник, то ты читаешь его личку. да ещё и отвечаешь на неё!
Да, так и есть, и даже если не ушел. Но скрипт я делал не для того чтобы пользоваться чужими никами...а выдуманными никами. Хотя не спорю кто-то может использовать и в таких целях...
Автор: Wariner 27.3.2009, 21:11
вот поэтому такие скрипты запрещены! а если и выкладываются то с предусмотренной защитой и закрытым кодом!
Автор: vicious 27.3.2009, 21:16
Цитата(Wariner @ 27.3.2009, 21:11)
вот поэтому такие скрипты запрещены! а если и выкладываются то с предусмотренной защитой и закрытым кодом!
Ну вам виднее...можете удалить его отсюдова))) мне главное он у меня есть...!))) просто жадничать не хотел!