logo Debian Debian Debian-France Debian-Facile Debian-fr.org Forum-Debian.fr Debian ? Communautés logo inclusivité

Debian-facile

Bienvenue sur Debian-Facile, site d'aide pour les nouveaux utilisateurs de Debian.

Vous n'êtes pas identifié(e).

#1 14-12-2015 18:44:41

wlourf
Membre
Distrib. : Jessie
Noyau : Linux 3.16.0-4-amd64
(G)UI : awesome
Inscription : 19-07-2010

notifications des nouveaux posts sur le forum (pour awesome)

Hello

Je me suis fait un petit module qui affiche dans une notification naughty les nouveaux messages postés sur le forum, autant le partager si ça peut servir ou être amélioré smile
1450113589.png

A intervalles réguliers, le script récupère la page des posts récents avec wget (je ne sais pas faire directement avec lua...), l'enregistre dans un fichier temporaire et affiche les nouveaux messages depuis la dernière vérification dans une notification; un clic sur la notification ouvre le navigateur. Il est possible de filtrer des posts avec leur numéros "id"

Dans rc.lua

require("debianfacile")
debianfacile.init()



la fonction init peut prendre 5 paramètres facultatifs


-- @param intervalle : intervalle en minutes, défaut = 10
-- @param file_df    : fichier temporaire, défaut = /tmp/debianfacile.html
-- @param filters    : table contenant les numéros de topics à exclure
-- @param timeout    : timeout du notify, défaut : 15
-- @param icon       : icone de la notification, défaut : nil
-- @param title      : titre de la notification, défaut : Debian Facile
 



par exemple :

debianfacile.init( {icon = beautiful.debian_icon64,
                    timeout = 0,
                    filters={10602}
                    } )
 



et le  script (à enregistrer dans debianfacile.lua)


local naughty = require("naughty")
local string = string
local tostring = tostring
local tonumber = tonumber
local io = io
local timer = timer
local table = table
local pairs = pairs
local awful = awful

module ("debianfacile")

local url = 'https://debian-facile.org/search.php?action=show_recent'
local top_pid = 0
local first_run = true
local forum_notify = nil

-- init ----------------------------------------------------------------
-- @param intervalle : intervalle en minutes, défaut = 10
-- @param file_df    : fichier temporaire, défaut = /tmp/debianfacile.html
-- @param filters    : table contenant les numéros de topics à exclure
-- @param timeout    : timeout du notify, défaut : 15
-- @param icon       : icone de la notification, défaut : nil
-- @param title      : titre de la notification, défaut : Debian Facile
-- necessite wget
function init(args)
    if args == nil then
        args = {}
    end
    local args = {
                intervalle    = args.intervalle or 10,
                file_df       = args.file_df or "/tmp/debianfacile.html",
                filters       = args.filters or {},
                timeout_value = args.timeout or 15,
                icon          = args.icon,
                title         = args.title or "Debian Facile"
                }
    parse_forum(args)
    init_timer(args)
end

-- vérifie si une valeur existe dans une table
function value_exists(tbl, value)
    for k,v in pairs(tbl) do
        if value == v then
            return true
        end
    end
    return false
end

-- lecture des derniers messages du forum
function parse_forum(args)
    io.popen('wget -q ' .. url .. ' -O ' .. args.file_df )
    local f = io.open(args.file_df , "r")
    local sujet
    local pid, pdate, pauteur
    local table_new = {}
    local msg = ''

    if f == nil then
        naughty.notify({text="Problème lecture forum"})
        return
    end    

    for line in f:lines() do
        if string.find(line, 'viewtopic') ~= nil then
            if string.find(line, '"tcr"') == nil then
                line  = string.gsub(line, '<span class="stickytext">Épinglée&#160;:</span>', '')
                sujet = string.match(line, '>(.-)<')
                sujet = clean(sujet)
                tid = tonumber(string.match(line, '%d+')) --topic id
            else
                pid = tonumber(string.match(line, '%d+')) --post id
                --premiere lecture, on passe
                if top_pid == 0 then
                    top_pid = pid
                    break
                end
                pdate   = string.match(line, pid .. '">(.-)<')
                pauteur = string.match(line, 'byuser">par (.-)<')
                --nouveau message
                if pid > top_pid then
                    if value_exists(args.filters, tid) == false then
                        table.insert(table_new, {pid, sujet, pdate, pauteur})
                    end
                else
                    break
                end
            end
        end
    end

    if f ~= nil then
        io.close(f)
    end

    --message + notification
    if first_run then
        first_run = false
    else
        if table.getn(table_new) ~= 0 then
            for k,v in pairs(table_new) do
                msg = '\n' .. v[2] .. ' (' .. v[4] .. ', ' .. v[3] .. ')' .. msg
                if k == 1 then
                    top_pid = v[1]
                end
            end
        end
        if msg ~= '' then
            forum_notify = naughty.notify(
                {text   = msg ,
                timeout = args.timeout_value,
                title   = args.title,
                icon    = args.icon,
                run = function()
                    destroy_forum_notify()
                end
                })
        end
    end
end

-- init_timer
function init_timer(args)
    if check_timer ~= nil then
        check_timer:stop()
    end
    check_timer = timer {timeout = args.intervalle*60}
    check_timer:add_signal("timeout", function()
                                parse_forum(args)
                        end)
    check_timer:start()
end

-- clean, supprime caractères incongrus
function clean(txt)
    txt = string.gsub(txt, '&#039;' , "'")
    return txt
end

-- destroy la notification
function destroy_forum_notify()
    if forum_notify ~= nil then
        awful.util.spawn( 'x-www-browser ' .. url)
        naughty.destroy(forum_notify)
        forum_notify = nil
    end
end
 



testé avec Jessie et awesome 3.4.15

Hors ligne

#2 14-12-2015 19:46:54

paskal
autobahn
Lieu : ailleurs
Inscription : 14-06-2011
Site Web

Re : notifications des nouveaux posts sur le forum (pour awesome)

cool

... à quand mon nom en couleur ?  tongue  big_smile

I'd love to change the world
But I don't know what to do
So I'll leave it up to you...

logo-sur-fond.png

Hors ligne

#3 14-12-2015 20:15:25

wlourf
Membre
Distrib. : Jessie
Noyau : Linux 3.16.0-4-amd64
(G)UI : awesome
Inscription : 19-07-2010

Re : notifications des nouveaux posts sur le forum (pour awesome)

hmm un filtre sur ton nom serait une meilleure idée big_smile

Hors ligne

#4 15-12-2015 10:39:42

paskal
autobahn
Lieu : ailleurs
Inscription : 14-06-2011
Site Web

Re : notifications des nouveaux posts sur le forum (pour awesome)

big_smile

I'd love to change the world
But I don't know what to do
So I'll leave it up to you...

logo-sur-fond.png

Hors ligne

Pied de page des forums