Recuperando eventos do Zeitgeist
Muito provavelmente, você deseja recuperar informações que já estejam no Zeitgeist.
Para pesquisar um evento no Zeitgeist, primeiro você precisa de um TimeRange. Sendo este um objeto com 'Begin' e 'End', definindo quando começa
e quando termina o período, para encontrar eventos ocorridos no intervalo deste período.
from zeitgeist.datamodel import TimeRange
timerange = TimeRange.always() #inclui todos não importando a data
print timerange.begin
print timerange.end
comeco = 0
fim = 10000000
timerange = TimeRange(comeco, fim) #
print timerange.begin
print timerange.end
Após decidir qual o período definido em sua busca, deve-se definir qual Template será utilizado para a busca.
* Template de Evento, nada mais é do que o objeto Event podendo ter informações omitidas, sendo que toda informação omitida é considerada como
WildCard (ou Curinga).
Para encontrar o evento de 'receber uma mensagem de texto' definido anteriormente, é possível utilizar o seguinte template:
from zeitgeist.datamodel import Event, Interpretation, Subject, Manifestation
my_template = Event.new_for_values(
interpretation=unicode(Interpretation.EVENT_INTERPRETATION.RECEIVE_EVENT),
manifestation=unicode(Manifestation.EVENT_MANIFESTATION.WORLD_ACTIVITY),
actor= 'application://pidgin.desktop',
subjects=[
Subject.new_for_values(
interpretation=unicode(Interpretation.IMMESSAGE),
manifestation=unicode(Manifestation.SOFTWARE_SERVICE),
uri= 'pidgin://gtalk/fulano@gtalk.com',
origin='pidgin://gtalk/fulano@gtalk.com',
storage='local',
)
]
)
Mais as informações podem ser omitidas ou incluídas para refinar sua busca, por exemplo, um Template para Subjects com links:
links_acessados_ou_enviados = Event.new_for_values(
manifestation=Manifestation.EVENT_MANIFESTATION.USER_ACTIVITY,
subjects=[Subject.new_for_values(interpretation=unicode(Interpretation.WEBSITE))]
)
links_recebidors= Event.new_for_values(
manifestation=Manifestation.EVENT_MANIFESTATION.WORLD_ACTIVITY,
subjects=[Subject.new_for_values(interpretation=unicode(Interpretation.WEBSITE))]
)
todos_links= Event.new_for_values(
subjects=[Subject.new_for_values(interpretation=unicode(Interpretation.WEBSITE))]
)
Pode-se utilizar mais de um Template ou omiti-los da busca para incluir todos os eventos.
Mais três informações são necessárias para realizar a busca, são elas:
I - StorageState: que informa se o subject esta disponível (StorageState.Available), indisponível (StorageState.NotAvailable) ou tanto faz
(StorageState.Any). Por exemplo, se era um arquivo, este pode ter sido removido;
II - A quantidade de resultados, valor inteiro, onde 0 representa todos possíveis;
III - ResultType: que informa o tipo do resultado, basicamente é utilizado para informar ordenação, mas também pode informar que algo no Template
não deve ser igual ao evento, para o evento aparecer nos resultados.
Exemplo realizando uma busca simples por todos os sites:
#! /usr/bin/env python
from zeitgeist.client import ZeitgeistDBusInterface
from zeitgeist.datamodel import Event, Interpretation, TimeRange, \
StorageState, ResultType, Subject, Manifestation
zg = ZeitgeistDBusInterface()
events = zg.FindEvents(
#timerange
TimeRange.always(),
#Event template
[
Event.new_for_values(
subjects=[Subject.new_for_values(interpretation=unicode(Interpretation.WEBSITE))]
)
],
#Storage State
StorageState.Any,
#Quantidade de resultados
0,
#Ordenação da busca
ResultType.MostRecentEvents)
for e in events:
print type(e)
print Event(e)
Para a busca, também pode ser utilizado o ZeitgeistClient, porém, funciona de forma um pouco diferente, pois deve ser passado um Callback que
receberá o resultado da busca.
Esperando novos eventos
Uma vez que já esteja definido como enviar eventos para o Zeitgeist, como pesquisá-los, como registrá-los no Desktopcouch, só falta mais uma
informação importante: como registar para ser informado todas as vezes que um evento for criado.
Para registrar-se, defina um TimeRange, os Templates e duas funções de Callback, uma que receberá os eventos criados e outra que recebe os ID dos
eventos removidos.
Como estas chamadas são assíncronas, será necessário um Mainloop, que pode ser tanto GLib, quando QT.
from dbus.mainloop.glib import DBusGMainLoop
import gobject
DBusGMainLoop(set_as_default=True)
mloop = gobject.MainLoop()
from zeitgeist.client import ZeitgeistClient
def insert(timerange, events, *args, **kws):
print timerange, events
def delete(timerange, events_ids, *args, **kws):
print timerange, events_ids
zeitgeistclient = ZeitgeistClient()
monitor = zeitgeistclient.install_monitor(
#intervalo
TimeRange.always(),
#templates
[],
#callback para novos
insert,
#ballback para removidos
delete)
#zeitgeistclient.remove_monitor(monitor)
mloop.run()
A parte de remover o monitor esta comentada, mas fica para fins instrutivos.
Perceba que passei um Template em branco: '[ ]', mas como descrito sobre busca, pode ser criado um ou vários Templates que definam quais eventos
devem ser recebidos.