• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

djthyrax

Dispatcher - How to do it?

6 mensagens neste tópico

Boas.

Como alguns já sabem, estou a fazer um cliente para IRC. Para fazer esse cliente de IRC, tenho uma thread que trata da ligação com o servidor, e, ao receber uma mensagem, vai chamar um dispatcher (outra thread), que vai servir de sistema de "plugins", chamemos-lhe assim. O dispatcher vai receber a mensagem do servidor (vamos tomar como exemplo ":servidor.ptnet.org JOIN #p@p"), e vai pegar no comando (neste caso é o JOIN) e vai buscar tudo o que está registado como handler do evento associado ao JOIN. A minha questão é mesmo obter ideias de como fazer o registo dos eventos, ter uma forma simples/prática e rápida de pesquisar neles.

Para quem quiser, está aqui a class que implementa a thread da ligação ao servidor (a ligação ao dispatcher vai ser feita no handleRecv, o código que lá está pode perfeitamente desaparecer):

from threading import Thread
import socket

class conn(Thread):
#todo: write interface to sendBuff
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) #creat socket
serverDetails = () #(hostname, port)
recvBuff = '' #recv buffer
sendBuff = '' #send buffer
stop = False #used to stop listen

def __init__(self, details):
	self.serverDetails = details
	self.startListen()

def run(self):
#todo: write code to quit without doing damage in the server <- URGENT
#      write something that allows to "re-listen"
	while not stop:
		if sendBuff:
			self.sock.send(sendBuff)
			sendBuff = ''
		recvBuff += self.sock.recv(512) #512 is the maximum size of an irc message.
		self.handleRecv()
	#quit

def startListen(self):
	self.sock.connect(self.serverDetails)

def handleRecv(self):
#todo: write dispatcher
	if "\r\n" in self.recvBuff:
		tmp = self.recvBuff.split("\r\n")
		if tmp[-1]: #not ending with \r\n?
			self.recvBuff = tmp[-1]
		else:
			self.recvBuff = ''
		tmp = tmp[:-1]

		for message in tmp:
			continue #Dispatcher(self, command)

conn().start()

Any ideas?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
A minha questão é mesmo obter ideias de como fazer o registo dos eventos, ter uma forma simples/prática e rápida de pesquisar neles.

Saber se chamaste o evento A ou B? Ou fazer um "trace" da informação?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Com registo de eventos digo registar handlers para um determinado evento. Do género, dispatcher.addHandler('onJoin', bot.handleOnJoin)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

function temp(a,b,c):
  # code here
dispatcher['onJoin'] = temp

function addHandler(f,**arg):
  try:
     dispatcher.arg[f](**arg)
  except:
     pass

Penso que dá para perceber a ideia...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Nah, não é isso que vou fazer. Tive a pensar e acho que vou recorrer a um dict, coisa que não me apetecia muito... O que vou fazer é:

class Dispatcher:
events = {}
def __init__(self, events):
  self.events = events
def addHandler(self, event, handler):
  self.events[event].append(handler)
def trigger(self, event, message):
  for handler in self.events[event]:
   handler(message)


def f(x):
print x

disp = Dispatcher({'onJoin': [], 'onPart': []})
disp.addHandler('onJoin', f)
disp.trigger('onJoin', 'lulz')

Mais sugestões?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Era o que te podia sugerir, mesmo sem ter percebido muito bem o que tu querias. Um dict penso que é a maneira mais simples de resolver o teu problema :P

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora