Название на орегинале: User.Profile.Bot.v1.1..LUA5x.RUS.
Поддержка Lua 5.0 / 5.1
Описание.
Итак, что умеет этот скрипт?- при входе на хаб, если у юзера еще нет анкеты, то он может быть уведомлен о создании новой- можно сколько угодно раз редактировать пункты своей анкеты- можно смотреть список юзеров, у кого есть анкеты- можно смотреть анкету конкретного юзера- команда удаления своей анкеты имеет функцию подтверждения (повторный ввод команды с долнительным словом)- админ может удалить любую анкету или очистить любой пункт любой анкеты
+ полноценное меню. Не нужно даже перезаходить, чтобы начать редактировать свою анкету с помощью меню.
Саму менюшку с редактированием пукнтов анкеты я вынес в конфигуратор вместе с конфигуратором самой анкеты.Еще сделал поддержку LUA 5.1.1, поправил проверку прав доступа к командам, немного все переоформил..
В общем, смотрим).
============================================================
Я же добавлю лишь то, что данный скрипт проверен на моём сообственном хабе под PtokaX 0.3.6.0 Работает нормально.
Будут проблемы пишите в аську 473-243-811 Я конечно не смагу вам точно испарвить скрипт но магу дать вам проверенную птоках.
============================================================
А скачать Данный скрипт можно пока на маём фтп сервере.
Адрес ftp://91.146.48.45/Programs/Scripts/
Ссылка на фтп сервер проверена 100%
============================================================
Cовременем возможно будут новости и о других полезных скриптах, а пока же я советую всем кто создаёт хабы, создавать их на PtokaX v 0.3.6.0 Так как все крипты в будующем которые будут прописаны здесь будут проверяны на данной машине.
Если конечно вы можете переделывать скрипты и если у вас есть на это время то пожалуйста качайте и переделывайте.
============================================================
Содиржание скрипта!
============================================================
-- /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\
--|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||  |
--||||| Русскую версию  |||||||||||                                                     |||||||| b.y:  S.t.0.n.e  d.b |  |
--||||| подготовил: NRJ |||||||||||        А.Н.К.Е.Т.И.Р.О.В.А.Н.И.Е          |||||||||||||||||||||||||||||||  |
--|||||||||||||||||||||||||||||||||                                                     |||||||||||||||||||||||||||||||  |
--|||||||||||||||||||||||||||||||||       v1.1   -    LUA 5.x   -   PtokaX    |||||||||||||||||||||||||||||||  |
--|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||  |
-- \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\/
--
--
----[ v1.1 Что же здесь интересненького? ]--------------------------------------------------------------------------------
--
-- Данный скрипт позволит вашим пользователям создавать и управлять своими анкетами на основании вашего шаблона.
--
-- Пункты анкеты:
-- - имя_в_реале
-- - дата_рождения
-- - знак_зодиака
-- - пол
-- - тело
-- - icq
-- - где_живешь
-- - учеба_работа
-- - о_себе
-- - семья
-- - о_других
-- - интересы
-- - музыка
-- - фильмы
-- - привычки
--
-- Также есть администраторская команда для редактирования чужих анкет.
-- Управление доступом к командам.
--
-- F.A.Q.
--
-- В. Как добавить или удалить пункт анкеты?
--
-- О. Во-первых, вам нужно внести новый пункт анкеты или отредактировать старый в таблице
--    tUserProfiles[curUser], которая вынесена в конфигуратор.
--    Во-вторых, необходимо отредактировать вывод анкет в чат. Данный пункт находится в
--    функции showProfile(curUser,type) - там увидете.
--    В-третьих, не забудьте поменять команды меню, которые также вынесены в конфигуратор - MenuProfile(user)
--
-- /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\
--|• Настройки •|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||  |
-- \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\/
tVar = {
sPrefix    = "!",        -- Префикс команд
sBot      = "Profiles",    -- Имя бота
sFolder    = "AHKETbI",    -- Папка скрипта
sFile    = "profiles.dat",    -- Название БД
sRCEnable    = "on",                 -- Посылать менюшку? <on=да, off=нет>
sEdited    = "on",        -- Прятать анкеты, которые еще не редактировались? <on=да, off=нет>
sSpam    = "on",                 -- Если у юзера еще нет анкеты, то предлагать ему создать ее при входе? ;)
sMsgtoUsers = "Теперь можно создать свою анкету! Напиши !анкета создать", -- Что писать при входе?
sRCName      = "Анкеты",          -- Название меню
}

-- /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\
--|• Команды •|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||  |
-- \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\/
tCmd = {
-- Команды пользователей
sHelp    = "анхелп",    -- Показать помощь
sProfile = "анкета",    -- Редактировать свою анкету
sViewPro = "анкеты",    -- Посмотреть список анкет юзеров

-- Команды админа
sDelPro  = "delpro",    -- Удалить анкету юзера или какое-то значение в анкете
}

-- /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\
--|• Профили •|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||  |
-- \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\/
-- Пользовательский доступ (1=допуск/0=запрет) -- **Профили 1 и 2 созданы для поддержки RoboCop'ом**
pUser = {   
[0] = 1, -- =[Master]=
[1] = 1, -- =[OP]=
[2] = 1, -- =[ViP]=
[3] = 1, -- =[Reg]=
[4] = 1, -- =[Custom Profile 1]=
[5] = 1, -- =[Custom Profile 2]=
   [-1] = 1, -- =[UnReg]=
}
-- Административный доступ (1=допуск/0=запрет)
pAdmin = {
[0] = 1, -- =[Master]=
[1] = 0, -- =[OP]=
[2] = 0, -- =[ViP]=
[3] = 0, -- =[Reg]=
[4] = 0, -- =[Custom Profile 1]=
[5] = 0, -- =[Custom Profile 2]=
   [-1] = 0, -- =[UnReg]=
}

-- /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\
--|• Пункты анкеты •|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||  |
-- \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\/

-- Пункты анкеты и их значения при создании
-- ["Пункт"] = "Значение по умолчанию"

-- !!! ["edited"] = "0" - НЕ ТРОГАТЬ!

function newProfile(curUser)
tUserProfiles[curUser] = {}
tUserProfiles[curUser] = {
["имя_в_реале"] = "",
["дата_рождения"] = "",
["знак_зодиака"] = "",
["пол"] = "",
["тело"] = "",
["icq"] = "",
["где_живешь"] = "",
["учеба_работа"] = "",
["о_себе"] = "",
["семья"] = "",
["о_других"] = "",
["интересы"] = "",
["музыка"] = "",
["фильмы"] = "",
["привычки"] = "",
["edited"] = "0",
}
saveProfile();
end

-- Меню для редактирования пунктов своей анкеты. Специально вынес отдельно (NRJ)

function MenuProfile(user)
user:SendData("$UserCommand 1 3 "..tVar.sRCName.."\\Мой профиль\\Посмотреть$<%[mynick]> !"..tCmd.sProfile.."|")
user:SendData("$UserCommand 1 3 "..tVar.sRCName.."\\Мой профиль\\Редактировать\\Настоящее имя$<%[mynick]> !"..tCmd.sProfile.." добавить имя_в_реале %[line:Твое настоящее имя?]|")
user:SendData("$UserCommand 1 3 "..tVar.sRCName.."\\Мой профиль\\Редактировать\\Дата рождения$<%[mynick]> !"..tCmd.sProfile.." добавить дата_рождения %[line:Дата рождения?]|")
user:SendData("$UserCommand 1 3 "..tVar.sRCName.."\\Мой профиль\\Редактировать\\Знак Зодиака$<%[mynick]> !"..tCmd.sProfile.." добавить знак_зодиака %[line:Знак Зодиака?]|")
user:SendData("$UserCommand 1 3 "..tVar.sRCName.."\\Мой профиль\\Редактировать\\Пол$<%[mynick]> !"..tCmd.sProfile.." добавить пол %[line:ж) или м)?]|")
user:SendData("$UserCommand 1 3 "..tVar.sRCName.."\\Мой профиль\\Редактировать\\Телосложение$<%[mynick]> !"..tCmd.sProfile.." добавить тело %[line:Рост, вес, общее впечатление?]|")
user:SendData("$UserCommand 1 3 "..tVar.sRCName.."\\Мой профиль\\Редактировать\\ICQ$<%[mynick]> !"..tCmd.sProfile.." добавить icq %[line:Твоя аська?]|")
user:SendData("$UserCommand 1 3 "..tVar.sRCName.."\\Мой профиль\\Редактировать\\Где живешь$<%[mynick]> !"..tCmd.sProfile.." добавить где_живешь %[line:Где ты живешь?]|")
user:SendData("$UserCommand 1 3 "..tVar.sRCName.."\\Мой профиль\\Редактировать\\Учеба и работа$<%[mynick]> !"..tCmd.sProfile.." добавить учеба_работа %[line:Где учишься и/или работаешь?]|")
user:SendData("$UserCommand 1 3 "..tVar.sRCName.."\\Мой профиль\\Редактировать\\О себе$<%[mynick]> !"..tCmd.sProfile.." добавить о_себе %[line:Немного о себе..]|")
user:SendData("$UserCommand 1 3 "..tVar.sRCName.."\\Мой профиль\\Редактировать\\О семье$<%[mynick]> !"..tCmd.sProfile.." добавить семья %[line:Парень, девушка, муж, жена, дети?]|")
user:SendData("$UserCommand 1 3 "..tVar.sRCName.."\\Мой профиль\\Редактировать\\Цели знакомства$<%[mynick]> !"..tCmd.sProfile.." добавить о_других %[line:С кем бы хотелось познакомиться?..]|")
user:SendData("$UserCommand 1 3 "..tVar.sRCName.."\\Мой профиль\\Редактировать\\Интересы$<%[mynick]> !"..tCmd.sProfile.." добавить интересы %[line:Твои интересы?]|")
user:SendData("$UserCommand 1 3 "..tVar.sRCName.."\\Мой профиль\\Редактировать\\Музыка$<%[mynick]> !"..tCmd.sProfile.." добавить музыка %[line:Любимая музыка?]|")
user:SendData("$UserCommand 1 3 "..tVar.sRCName.."\\Мой профиль\\Редактировать\\Фильмы$<%[mynick]> !"..tCmd.sProfile.." добавить фильмы %[line:Любимые фильмы?]|")
user:SendData("$UserCommand 1 3 "..tVar.sRCName.."\\Мой профиль\\Редактировать\\Вредные привычки$<%[mynick]> !"..tCmd.sProfile.." добавить привычки %[line:Курение, водка, КС?:)]|")

end

-- /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\
--|• Основной код •||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||  |
-- \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\/

function Main()
frmHub:RegBot(tVar.sBot);
loadProfile();
end

function ChatArrival(user,data)
local data = string.sub(data,1,-2)
local s,e,sTrig,sCmd = string.find(data,"%b<>%s*(%S)(%S+)")
if sTrig == tVar.sPrefix then   
    local tScriptCmds = {
    [tCmd.sHelp] = function(user,data)
            local msgGreeting = "\r\n"
            if (pUser[user.iProfile] == 1) then
                        msgGreeting = msgGreeting..tab.."::: ::: ::: Команды управления анкетами ::: ::: ::: \r\n\r\n"
            ..tab.."Помощь по командам - "..tVar.sPrefix..tCmd.sHelp.."\r\n"
            ..tab.."Моя анкета    - "..tVar.sPrefix..tCmd.sProfile.."\r\n"
            ..tab.."Все анкеты    - "..tVar.sPrefix..tCmd.sViewPro.."\r\n"
            elseif (pAdmin[user.iProfile] == 1) then
            msgGreeting = msgGreeting.."\r\n\r\n"..tab.."::: ::: ::: Администраторские команды ::: ::: :::\r\n\r\n"
            ..tab.."Удалить анкету/значение в анкете - "..tVar.sPrefix..tCmd.sDelPro.."\r\n"
            end
        user:SendPM(tVar.sBot,msgGreeting);
        return 1;
    end,
   
    [tCmd.sProfile] =
    function(user,data)
                if not (pUser[user.iProfile] == 1) then return 1; end
        local curUser = user.sName;
        local _,_,Cmd1 = string.find(data,"%b<>%s+%S+%s+(%S+)");
        if Cmd1 then
                        local _,_,Cmd2 = string.find(data,"%b<>%s+%S+%s+%S+%s+(%S+)");
        if string.lower(Cmd1) == "создать" and not tUserProfiles[curUser] then
                newProfile(curUser); user:SendPM(tVar.sBot,"*** Создана новая анкета! Чтобы отредактировать ее, воспользуйтесь меню или внапиши в чате: "..tVar.sPrefix..tCmd.sProfile); sendRightClick(user,"update");
             elseif string.lower(Cmd1) == "добавить" then
                if Cmd2 then
            if tUserProfiles[curUser][string.lower(Cmd2)] then
                                        local _,_,Cmd3 = string.find(data,"%b<>%s+%S+%s+%S+%s+%S+%s+(.*)");
                if Cmd3  == "*" then
                        editProfile(curUser,string.lower(Cmd2)," "); user:SendPM(tVar.sBot,"*** Твоя анкета изменена: "..Cmd2.." - ");
                elseif Cmd3 then
                    editProfile(curUser,string.lower(Cmd2),Cmd3); user:SendPM(tVar.sBot,"*** Твоя анкета изменена: "..Cmd2.." - "..Cmd3);
                else
                        user:SendPM(tVar.sBot,"*** Ошибка! Ты забыл указать значение: "..tVar.sPrefix..tCmd.sProfile.." добавить "..Cmd2.." <текст>");
                end
                else
                user:SendPM(tVar.sBot,showProfile(curUser,"profilecmds").."\r\n"..tab.."*** Ошибка! Чтобы отредактировать пункт анкеты воспользуйтесь командой "..tVar.sPrefix..tCmd.sProfile.." добавить <пункт> <текст>, * = пустое значение.");
            end
        else
                            user:SendPM(tVar.sBot,showProfile(curUser,"user").."\r\n"..tab.."Выбери пункт анкеты, который хочешь\r\n"..tab.."отредактировать и укажи его значение:\r\n"..tab.." "..tVar.sPrefix..tCmd.sProfile.." добавить <пункт> <текст>\r\n"..tab.."* = пустое значение.");
        end
        elseif string.lower(Cmd1) == "удалить" then
                if Cmd2 then
            if string.lower(Cmd2) == "полностью" then
                delProfile(curUser); user:SendPM(tVar.sBot,"*** Твоя анкета была удалена!");
            else
                user:SendPM(tVar.sBot,"*** ВНИМАНИЕ!! Это команда полностью удалит твою анкету! Для подтверждения введи: "..tVar.sPrefix..tCmd.sProfile.." удалить полностью");
            end
            else
                user:SendPM(tVar.sBot,"*** ВНИМАНИЕ!! Это команда полностью удалит твою анкету! Для подтверждения введи: "..tVar.sPrefix..tCmd.sProfile.." удалить полностью");
            end
        else
            user:SendPM(tVar.sBot,"*** Ошибка! Для редактирования или удаления свой анкеты введи: "..tVar.sPrefix..tCmd.sProfile.." <добавить/удалить>");
        end
        else
                    if not tUserProfiles[curUser] then
            user:SendPM(tVar.sBot,"*** У тебя еще нет анкеты! Чтобы создать анкету напиши: "..tVar.sPrefix..tCmd.sProfile.." создать"); return 1;
        else
            user:SendPM(tVar.sBot,showProfile(curUser,"user").."\r\n"..tab.."Для редактирования или удаления\r\n"..tab.."свой анкеты введи: "..tVar.sPrefix..tCmd.sProfile.." <добавить/удалить>");
        end
        end
        return 1;
    end,
   
    [tCmd.sViewPro] =
    function(user,data)
                if not (pUser[user.iProfile] == 1) then return 1; end
                local _,_,Cmd1 = string.find(data,"%b<>%s+%S+%s+(%S+)");
        if GetItemByName(Cmd1) then
                    user:SendPM(tVar.sBot,showProfile(Cmd1,"user"));
        else
        user:SendPM(tVar.sBot,showProfile(user,"allusers").."\r\n"..tab.."*** "..tVar.sPrefix..tCmd.sViewPro.." <ник> для просмотра анкеты. ***");
        end
        return 1;
    end,
   
    [tCmd.sDelPro] =
    function(user,data)
                if not (pAdmin[user.iProfile] == 1) then return 1; end
        local _,_,Cmd1 = string.find(data,"%b<>%s+%S+%s+(%S+)");
        if Cmd1 and GetItemByName(Cmd1) then
                    local _,_,Cmd2 = string.find(data,"%b<>%s+%S+%s+%S+%s+(%S+)");
        if Cmd2 then
                if string.lower(Cmd2) == "удалить" then
                    delProfile(Cmd1); user:SendPM(tVar.sBot,"*** Анкета юзера "..Cmd1.." была удалена.");
                elseif tUserProfiles[Cmd1][string.lower(Cmd2)] then
                    editProfile(Cmd1,string.lower(Cmd2)," "); user:SendPM(tVar.sBot,"*** Пункт анкеты "..Cmd2.." юзера "..Cmd1.." был очищен.");
            else
                user:SendPM(tVar.sBot,"*** Ошибка! Ты забыл указать, что мы будем делать - удалять или редактировать анкету: "..tVar.sPrefix..tCmd.sDelPro.." "..Cmd1.." <пункт/удалить>");
            end
            else
               user:SendPM(tVar.sBot,showProfile(Cmd1,"user").."\r\n"..tab.."*** Укажите пункт для удаления или воспользуйтесь\r\n"..tab.."командой 'удалить', чтобы стереть всю анкету:\r\n"..tab..tVar.sPrefix..tCmd.sDelPro.." <ник> <пункт/удалить>");
            end
        else
            user:SendPM(tVar.sBot,"*** Чтобы удалить анкету юзера или пукнт чьей-либо анкеты воспользуйтесь командой: "..tVar.sPrefix..tCmd.sDelPro.." <ник>");
        end
        return 1;
    end,
    }   
    if tScriptCmds[sCmd] then
    return tScriptCmds[sCmd](user,data);
end
end
end

ToArrival = ChatArrival

function NewUserConnected(user)
sendRightClick(user,"new");
if string.lower(tVar.sSpam) == "on" and not tUserProfiles[user.sName] then
    user:SendPM(tVar.sBot, "*** "..tVar.sMsgtoUsers)
end
end

function OnExit()
saveProfile();
end

function sendRightClick(user,type)
if type == "new" then
    if user.bUserCommand then
       if (pUser[user.iProfile] == 1) and string.lower(tVar.sRCEnable) == "on" then
           user:SendData("$UserCommand 1 3 "..tVar.sRCName.."\\Помощь$<%[mynick]> !"..tCmd.sHelp.."|")
               user:SendData("$UserCommand 1 3 "..tVar.sRCName.."\\Просмотр\\Все анкеты$<%[mynick]> !"..tCmd.sViewPro.."|")
        user:SendData("$UserCommand 1 3 "..tVar.sRCName.."\\Просмотр\\Анкета этого юзера$<%[mynick]> !"..tCmd.sViewPro.." %[nick]|")
                user:SendData("$UserCommand 1 3 "..tVar.sRCName.."\\Просмотр\\Анкета юзера..$<%[mynick]> !"..tCmd.sViewPro.." %[line:Ник юзера?]|")
        if tUserProfiles[user.sName] then
            MenuProfile(user)
                    user:SendData("$UserCommand 1 3 "..tVar.sRCName.."\\Мой профиль\\Удалить\\Свою анкету$<%[mynick]> !"..tCmd.sProfile.." удалить|")
        else
            user:SendData("$UserCommand 1 3 "..tVar.sRCName.."\\Мой профиль\\Создать анкету$<%[mynick]> !"..tCmd.sProfile.." создать|")
        end
    end
       if (pAdmin[user.iProfile] == 1) and string.lower(tVar.sRCEnable) == "on" then
               user:SendData("$UserCommand 1 3 "..tVar.sRCName.."\\Админ\\Удалить анкету юзера$<%[mynick]> !"..tCmd.sDelPro.." %[line:Ник юзера?] удалить|")
                user:SendData("$UserCommand 1 3 "..tVar.sRCName.."\\Админ\\Удалить пункт анкеты юзера$<%[mynick]> !"..tCmd.sDelPro.." %[line:Ник юзера?] %[line:Пункт анкеты?]|")
    end
       end
elseif type == "update" then
    --user:SendData("$UserCommand 1 3 "..tVar.sRCName.."\\Мой профиль\\Посмотреть$<%[mynick]> !"..tCmd.sProfile.."|")
    MenuProfile(user)
        user:SendData("$UserCommand 1 3 "..tVar.sRCName.."\\Мой профиль\\Удалить\\Свою анкету$<%[mynick]> !"..tCmd.sProfile.." удалить|")
end
end

function showProfile(curUser,type)
local sMsg = "\r\n\r\n"..tab;
if type == "user" then sMsg = sMsg.."-= Анкета "..curUser.." =-\r\n\r\n";
elseif type == "profilecmds" then sMsg = sMsg.."-= Анкета "..curUser.." - Показ команд =-\r\n\r\n";
    elseif type == "all" or type == "allusers" then sMsg = sMsg.."-= Анкеты всех юзеров =-\r\n\r\n"; end
if type == "user" then
    if tUserProfiles[curUser] then
    sMsg = sMsg..tab..string.rep("«»",19).."\r\n"

    sMsg = sMsg..tab.."имя_в_реале\t - "..tUserProfiles[curUser]["имя_в_реале"].."\r\n";
    sMsg = sMsg..tab.."дата_рождения\t - "..tUserProfiles[curUser]["дата_рождения"].."\r\n";
    sMsg = sMsg..tab.."пол\t\t - "..tUserProfiles[curUser]["пол"].."\r\n";
    sMsg = sMsg..tab.."тело\t\t - "..tUserProfiles[curUser]["тело"].."\r\n";
    sMsg = sMsg..tab.."icq\t\t - "..tUserProfiles[curUser]["icq"].."\r\n";
    sMsg = sMsg..tab.."где_живешь\t - "..tUserProfiles[curUser]["где_живешь"].."\r\n";
    sMsg = sMsg..tab.."учеба_работа\t - "..tUserProfiles[curUser]["учеба_работа"].."\r\n";
    sMsg = sMsg..tab.."о_себе\t\t - "..tUserProfiles[curUser]["о_себе"].."\r\n";
    sMsg = sMsg..tab.."семья\t\t - "..tUserProfiles[curUser]["семья"].."\r\n";
    sMsg = sMsg..tab.."о_других\t - "..tUserProfiles[curUser]["о_других"].."\r\n";
    sMsg = sMsg..tab.."интересы\t - "..tUserProfiles[curUser]["интересы"].."\r\n";
    sMsg = sMsg..tab.."музыка\t - "..tUserProfiles[curUser]["музыка"].."\r\n";
    sMsg = sMsg..tab.."фильмы\t - "..tUserProfiles[curUser]["фильмы"].."\r\n";
    sMsg = sMsg..tab.."привычки\t - "..tUserProfiles[curUser]["привычки"].."\r\n";

    sMsg = sMsg..tab..string.rep("«»",19).."\r\n\r\n"
    end
elseif type == "profilecmds" then
    if tUserProfiles[curUser] then
        sMsg = sMsg..tab..string.rep("«»",19).."\r\n"
        for sItem in pairs(tUserProfiles[curUser]) do
        if sItem ~= "edited" then
        sMsg = sMsg.."\t    "..tVar.sPrefix..tCmd.sProfile.." добавить "..sItem.." \t- "..tUserProfiles[curUser][sItem].."\r\n";
        end
    end
    sMsg = sMsg..tab..string.rep("«»",19).."\r\n\r\n"
    end
elseif type == "allusers" then
    if tUserProfiles ~= nil then
        sMsg = sMsg..tab..string.rep("«»",19).."\r\n"
    for sUser in pairs(tUserProfiles) do
                if string.lower(tVar.sEdited) == "on" then
        for sItem in pairs(tUserProfiles[sUser]) do
            if sItem == "edited" and tUserProfiles[sUser][sItem] ~= "0" then
            sMsg = sMsg.."\t    •"..sUser.."\r\n";
            end
                    end
        else
        sMsg = sMsg.."\t    •"..sUser.."\r\n";
        end
       end
       sMsg = sMsg..tab..string.rep("«»",19).."\r\n\r\n"
    end
end
return sMsg;
end

function editProfile(curUser,sItem,sValue)
if tUserProfiles[curUser] then
    tUserProfiles[curUser][sItem] = sValue;
    if tUserProfiles[curUser]["edited"] == "0" then tUserProfiles[curUser]["edited"] = "1"; end
        saveProfile();
else
    newProfile(curUser); saveProfile(); editProfile(curUser,sItem,sValue)
end
end

function delProfile(curUser)
tUserProfiles[curUser] = nil;
saveProfile();
end

function saveProfile()
for sUser in pairs(tUserProfiles) do
    ProfileData[sUser] = {}
    for sItem in pairs(tUserProfiles[sUser]) do
    ProfileData[sUser][sItem] = tUserProfiles[sUser][sItem];
    end
end
SaveToFile(tVar.sFolder.."/"..tVar.sFile,ProfileData,"ProfileData")
ProfileData = {};
end

function loadProfile()
local file = nil; local sText = nil; tUserProfiles = {};
if loadfile(tVar.sFolder.."/"..tVar.sFile) then dofile(tVar.sFolder.."/"..tVar.sFile);
else
      sText = "ProfileData = {\r\n}";
       io.output(tVar.sFolder.."/"..tVar.sFile);
       file = io.open(tVar.sFolder.."/"..tVar.sFile,"w+");
       file:write( sText );
      file:close();
      dofile(tVar.sFolder.."/"..tVar.sFile);
  end
  if ProfileData ~= nil then
    for sUser in pairs(ProfileData) do
    tUserProfiles[sUser] = {}
    for sItem in pairs(ProfileData[sUser]) do
        tUserProfiles[sUser][sItem] = ProfileData[sUser][sItem];
    end
    end
end
ProfileData = {};
end

Serialize = function(tTable,sTableName,hFile,sTab)
sTab = sTab or "";
hFile:write(sTab..sTableName.." = {\n");
for key,value in pairs(tTable) do
    if (type(value) ~= "function") then
    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"..sKey.." = "..sValue);
    end
    hFile:write(",\n");
    end
end
hFile:write(sTab.."}");
end

SaveToFile = function(file,table,tablename)
local hFile = io.open(file,"w+") Serialize(table,tablename,hFile); hFile:close();
end

Settings = {
  sChar = { "-", " ", "i", "l", "r", "t", "I", "y", "o", },
}

tab = "   "..string.rep("  ",string.len(tVar.sBot));

tUserProfiles = {}

OpDisconnected=UserDisconnected
OpConnected=NewUserConnected
===========================================================
Ну вот вроде и всё, что я хотел сказать по поводу этого скрипта.
Удачи всем админам хабов.