From d21b5cccfecf306dd0734e3dde291c7bdf3e3a3b Mon Sep 17 00:00:00 2001 From: Andreas Neue Date: Sun, 21 Aug 2016 23:58:38 +0200 Subject: [PATCH] Preparations for service infrastructure --- service.go | 46 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) create mode 100644 service.go diff --git a/service.go b/service.go new file mode 100644 index 0000000..7084ffc --- /dev/null +++ b/service.go @@ -0,0 +1,46 @@ +// vim:ts=4:sts=4:sw=4:noet:tw=72 + +package ircd + +import ( + "time" + + "code.dnix.de/an/irc" +) + +type Service struct { + recvq chan *irc.Message + handlers map[string]func(*irc.Message) +} + +func NewService() *Service { + recvq := make(chan *irc.Message, 1024) + handlers := make(map[string]func(*irc.Message)) + return &Service{recvq: recvq, handlers: handlers} +} + +func (svc *Service) Run() { + go svc.dispatcher() +} + +func (svc *Service) Dispatch(msg *irc.Message) { + svc.recvq <- msg +} + +func (svc *Service) Handler(cmd string, fn func(*irc.Message)) { + svc.handlers[cmd] = fn +} + +func (svc *Service) dispatcher() { + for { + select { + case msg := <-svc.recvq: + if fn, exists := sv.handlers[msg.Pre]; exists { + fn(msg) + } + default: + time.Sleep(100 * time.Microsecond) + } + } + return +}