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

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

MyDC.ru _ Запросы скриптов для PtokaX _ Общий подсчет сообщений

Автор: Invisible 6.3.2011, 8:17

Господа кто нибудь может сделать скрипт который будет подсчитать общее количество сообщений хаба, и отображать в Топике. То есть каждое сообщение юзера в чате +1 сообщение.

PS. ответы типо: Бред, Чушь, А зачем?, для чего? можно не писать.

Автор: Tsd 6.3.2011, 9:26

Идея неплоха. Прикручу у себя на хабе.


Автор: Ksan 6.3.2011, 18:53

Вот один из вариантов (название скрипта - MessCount.lua ) :

Сам скрипт ТУТ
Код
-- Скрипт показа общего числа сообщений чата в топике.
-- Автор: Ksan (aka Trans)
-- Дата: 06-03-2011
-- Где: г.Томск

-- Скрипт показа общего числа сообщений чата в топике.
-- При необходимости освободить топик для иных сообщений оператор может через меню отменить показ числа сообщений в топике. Потом сможет так же через то же меню восстановить.
-- Папка "MessCount" должна быть создана заранее.

local sBot = SetMan.GetString(21)
local bTopic = true
local sCountFile = Core.GetPtokaXPath().."scripts/MessCount/MessCount.txt"

tProfiles = {  -- Кто может ставить/отменять показ в топике
    [0]  = 1, -- Мастер
    [1]  = 1, -- ОПератор
    [2]  = 0, -- VIP
}

function OnStartup()
    dofile(sCountFile)
    if tMessCount == nil then
        tMessCount = { }
        tMessCount["MessCount"] = 0
    end  
end

function OpConnected(tUser)
    Core.SendToUser(tUser, "$UserCommand 1 3 << АДМИНКА >>\\Число сообщений в топик$<%[mynick]> !messcount&#*124;") -- тут звёздочку в конце удалить
end

function ChatArrival(tUser, sData)
--    Core.GetUserAllData(tUser)
    local sData = sData:sub(1,-2)
    local sCmd = sData:match("^%b<>%s+(%S+)")
    if tProfiles[tUser.iProfile] == 1 and sCmd == "!messcount" then
        bTopic = not bTopic
        if bTopic == true then
            Core.SendToUser(tUser, "<"..sBot.."> Число сообщений будет показываться в топике.")
        else
            Core.SendToUser(tUser, "<"..sBot.."> Число сообщений не будет показываться в топике.")
        end
        return true
    end
    tMessCount["MessCount"] = tMessCount["MessCount"] + 1
    if bTopic == true then
        SetMan.SetString(10, "В чате написано "..tMessCount["MessCount"].." сообщений")  -- сам текст можете править как вам угодно
    end
    SaveToFile(sCountFile, tMessCount, "tMessCount")
    collectgarbage()
--    return true
end

function OnExit()
    SaveToFile(sCountFile, tMessCount, "tMessCount")    
end

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

function Serialize(tTable, sTableName, sTab)
    assert(tTable, "tTable equals nil");
    assert(sTableName, "sTableName equals nil");
    assert(type(tTable) == "table", "tTable must be a table!");
    assert(type(sTableName) == "string", "sTableName must be a string!");
    sTab = sTab or "";
    sTmp = ""
    sTmp = sTmp..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
            sTmp = sTmp..Serialize(value, sKey, sTab.."\t");
        else
            local sValue = (type(value) == "string") and string.format("%q",value) or tostring(value);
            sTmp = sTmp..sTab.."\t"..sKey.." = "..sValue
        end
        sTmp = sTmp..",\n"
    end
    sTmp = sTmp..sTab.."}"
    collectgarbage()
    return sTmp
end

Число сообщений будет сохраняться в файл, дабы при отключении скрипта или хаба сохранялось. Для этого надо заранее в папке "scripts" создать папку "MessCount" (только папку!). При первом запуске файл сам создастся.
При необходимости освободить топик для иных сообщений оператор может через меню отменить показ числа сообщений в топике. Потом сможет так же через то же меню восстановить показ.
В скрипте в коде отправки команды в меню в самом конце вставил *, её надо удалить перед запуском скрипта.

UPD: http://mydc.ru/topic4733.html