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

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

MyDC.ru _ Kорзина _ Меню - "использовать Ник"

Автор: vicious 21.3.2009, 16:38

Предлагаю идею!
Есть так назаываемый сэйскрипт, который дает возможность писать от любого ника, но команду приходится использовать каждый раз...частенько это неудобно...
Предлагаю сделать такое меню:
Использовать ник -> :
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)


хм...туплю наверн, но не понял. Что исправить и на что исправить?

Автор: Wariner 25.3.2009, 8:06

заменить это

Код
WriteTable(tNickam, "Nickam", sFileam)

на
Код
WriteTable(tNickam, "tNickam", sFileam)


зачем под ник вводить подтаблицу?
Код
   tNickam[tUser.sNick] = {}
                table.insert(tNickam[tUser.sNick], sNick)

всё равно он не сможет писать с нескольких ников одновременно!
Код
   tNickam[tUser.sNick] = sNick

и всё))))

Автор: vicious 25.3.2009, 12:36

Спасибо, поменял. Уже гораздо лучше, но теперь вот что...
К примеру юзер№1 присваивает себе ник "maxim"...в таблицу записывает:

Код
tNickam = {
    ["юзер№1"] = "maxim",
}


Теперь юзер№2 присваивает себе ник "cooler" таблица примет вид:
Код
tNickam = {
    ["юзер№2"] = "maxim",
    ["юзер№2"] = "cooler",
}


Т.е. каждый новый ник записывается для всех зарезервированных имен. Проверял открывая два разных клиента.

Автор: Setuper 25.3.2009, 12:44

Ключи таблиц уникальны и не могут совпадать, то есть

Код
tNickam = {
    ["юзер№2"] = "maxim",
    ["юзер№2"] = "cooler",
}
это не правильно. Такого не может быть.

Автор: vicious 25.3.2009, 12:57

Цитата(Setuper @ 25.3.2009, 12:44) *
Ключи таблиц уникальны и не могут совпадать, то есть
Код
tNickam = {
    ["юзер№2"] = "maxim",
    ["юзер№2"] = "cooler",
}
это не правильно. Такого не может быть.


Ну как так не может? Проверь попробуй код на деле, я говорю то что есть. У меня именно так и записывает, как описал выше!

Вот еще раз весь код который щас имею: (правда пока что он имеет меня)
Код
--[[                            
                                  Название скрипта:  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

зачем новичку забивать себе этим голову. Для начало надо узнать структура таблиц и правильно научится с ними работать!

Автор: Setuper 25.3.2009, 15:19

ссылка http://mydc.ru/r/?http://www.lua.ru/doc/ + файл scripting-interface.txt

Автор: vicious 26.3.2009, 18:57

Все...сделал вроде как, работает норм, хотя думаю не все в нем идеально))) . Спасибо всем, кто помогал. Скрипт выкладываю, проверяйте, говорите где недоработки и оишибки еще остались, буду исправлять.

Автор: Серый 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) *
вот поэтому такие скрипты запрещены! а если и выкладываются то с предусмотренной защитой и закрытым кодом!

Ну вам виднее...можете удалить его отсюдова))) мне главное он у меня есть...!))) просто жадничать не хотел!

Автор: Setuper 27.3.2009, 21:40

тема закрыта