Ir para conteúdo
Entre para seguir isso  
Fryen

Gerador de gráfico de mensagens privadas

Recommended Posts

Fryen    0
Fryen

Gera um gráfico com as mensagens enviadas/recebidas/respondidas a cada mês. Primeira vez que mecho com GD, e o código tá uma merda mesmo. Pra funcionar você tem que baixar o arquivo TXT com todas suas mensagens, é só clicar aqui. Aí edita no começo do script o nome do arquivo e o seu nome de usuário.

 

local file = 'privatemessages-Raphael-06-01-2011.txt'
local user = 'Raphael'



require('gd')
local msgs = {}
local marg = string.rep("#", 80)
local marg2 = string.rep("=", 80)
local marg3 = string.rep("-", 80)
local f = ""
local i = 2
local s = 0
local ns = 0
local n = 1
-- 0 = start
-- 1 = get folder name
-- 2 = skip lines
-- 3 = msg header
-- 4 = msg body

for l in io.lines(file) do
   if s == 4 then
       if l == marg then
           s = 1
       elseif l == marg2 then
           msgs[f][n][5] = msgs[f][n][5]:match("(.+)..")
           n = n + 1
           msgs[f][n] = {}
           s = 3
       else
           msgs[f][n][5] = msgs[f][n][5] .. l .. "\n"
       end
   elseif s == 3 then
       if l == marg3 then
           s = 4
           msgs[f][n][5] = ""
       else
           table.insert(msgs[f][n], l:match("^%S+%s:%s+(.+)$"))
       end
   elseif s == 2 then
       i = i - 1
       if i == 0 then
           s = ns
       end
   elseif s == 1 then
       f = l:match("^%S+%s:%s+(.+)$")
       msgs[f] = {}
       n = 1
       msgs[f][n] = {}
       s = 2
       i = 3
       ns = 3
   elseif s == 0 then
       if l == marg then
           s = 1
       end
   end
end

local stats = {}
local months = {"January", "February", "March", "April", "May", "June",  "July", "August", "September", "October", "November", "December"}
local m = os.date('*t')
m = (m.year - 2010) * 12 + m.month - 4
for i = 1, m do
   stats[i] = {s = 0, r = 0, a = 0}
end

local s = 0 -- Sent
local r = 0 -- Received
local a = 0 -- Answered
for _, v in pairs(msgs) do
   for _, k in ipairs(v) do
       local y, m = k[3]:match("(%d+)%-(%d+)%-.+")
       local i = (y - 2010) * 12 + m - 4

       if k[1] == user then
           s = s + 1
           stats[i].s = stats[i].s + 1
       elseif k[2] == user then
           r = r + 1
           stats[i].r = stats[i].r + 1
           if (k[4] or ""):match("^Re:.+") then
               a = a + 1
               stats[i].a = stats[i].a + 1
           end
       end
   end
end

local testImg = gd.create(200, 50)
local img = gd.createTrueColor(m * 70 + 100, 400)
local black = img:colorAllocate(0, 0, 0)
local white = img:colorAllocate(255, 255, 255)
local red = img:colorAllocate(255, 0, 0)
local green = img:colorAllocate(0, 255, 0)
local blue = img:colorAllocate(0, 0, 255)
local mm = 0
img:filledRectangle(0, 0, img:sizeX(), 400, white)
img:line(50, 35,  50, 365, black)
img:line(35, 350, img:sizeX() - 35, 350, black)
for k, v in ipairs(stats) do
   mm = math.max(v.s, v.r, v.a, mm)
end
for i = 1, 6 do
   img:line(45, 350 - i * 50, 55, 350 - i * 50, black)
   local p = {testImg:stringFT(black, "Tahoma", 10, 0, 0, 0, math.floor(mm / 6 * i))}
   img:stringFT(black, "Tahoma", 10, 0, 40 - p[3], 355 - i * 50, math.floor(mm / 6 * i))
end
for i = 1, m do
   local p = {testImg:stringFT(black, "Tahoma", 10, 0, 0, 0, months[(i+3)%12+1])}
   img:stringFT(black, "Tahoma", 10, 0, (i * 70 - 20) + ((70 - p[3]) / 2), 365, months[(i+3)%12+1])
   local p = {testImg:stringFT(black, "Tahoma", 10, 0, 0, 0, 2010 + math.floor((i + 4) / 12))}
   img:stringFT(black, "Tahoma", 10, 0, (i * 70 - 20) + ((70 - p[3]) / 2), 380, 2010 + math.floor((i + 4) / 12))
end

for k, v in ipairs(stats) do
   if k == #stats then
       break
   end
   img:line(85 + (k - 1) * 70, 349 - (v.s / mm * 300), 85 + k * 70, 349 - (stats[k + 1].s / mm * 300), red)
end
for k, v in ipairs(stats) do
   if k == #stats then
       break
   end
   img:line(85 + (k - 1) * 70, 349 - (v.r / mm * 300), 85 + k * 70, 349 - (stats[k + 1].r / mm * 300), blue)
end
for k, v in ipairs(stats) do
   if k == #stats then
       break
   end
   img:line(85 + (k - 1) * 70, 349 - (v.a / mm * 300), 85 + k * 70, 349 - (stats[k + 1].a / mm * 300), green)
end
img:png("oi.png")
os.execute("oi.png")

Exemplo:

 

Enviadas

Recebidas

Respondidas

imgoBm87.png

Editado por Fryen

Compartilhar este post


Link para o post
Compartilhar em outros sites
Mock    32
Mock

cara o codigo não esta uma merda, esta MEIO desorganizado mais ainda sim é um code legal.

Compartilhar este post


Link para o post
Compartilhar em outros sites
Elwyn    106
Elwyn

é como o mock disse, a não está muito legal de ler o code não, mas tá bem legal.

Compartilhar este post


Link para o post
Compartilhar em outros sites
Fryen    0
Fryen
cara o codigo não esta uma merda, esta MEIO desorganizado mais ainda sim é um code legal.

 

Foi o que eu quis dizer, bagunçado.

Compartilhar este post


Link para o post
Compartilhar em outros sites
iuniX    4
iuniX

Eu gostei bastante, só esta um pouco bagunçado como o Mock disse. (Se o Skyen ver isso ele vai reclamar OPASKDPOSA)

 

Mas parabéns, fico bem legal.

Compartilhar este post


Link para o post
Compartilhar em outros sites
Visitante
Este tópico está impedido de receber novos posts.
Entre para seguir isso  

  • Quem Está Navegando   0 membros estão online

    Nenhum usuário registrado visualizando esta página.

×