I started this project to learn Erlang. It started as a IRC robot, but turned into a client the moment I wanted to add a GUI and learn wxErlang.
When I started with the robot, the idea was to hide the IRC protocol using one of the Erlang behaviours. I found that the most suitable was the gen_event behaviour, mostly because of the eventful nature of the IRC protocol.
Although I did try using gen_fsm and gen_server, but it seemed, that these behaviours didn't fit, at least from my point of view.
The idea of hiding the IRC protocol behing a gen_event behaviour remains. Although lately I'm thinking it might not be a good idea or it's wasteful.
The following (ascii)-diagram shows, what's yet to be implemented, how would I hide using gen_event an error msg from the server when trying to subscribe a nick.
+----------+ +----------+ gen_event: +----------+ | | NICK anick | | notify({nick, "anick"}) | wxErlang | |IRC Server| <----------- |gen_event | <---------------------- | GUI | | | | | | | +----------+ +----------+ +----------+ | | State = "sent nick" | \ / ' +----------+ +----------+ +----------+ | | ERR_NICKNAMEINUSE | | | wxErlang | |IRC Server| ----------------> |gen_event | | GUI | | | | | | | +----------+ +----------+ +----------+ | | State = "sent pass" | (or whatever before nick) \ / ' (need some sort of +----------+ +----------+ callback into the GUI) +----------+ | | | | UIPid ! { badnick } | wxErlang | |IRC Server| |gen_event | ---------------------> | GUI | | | | | | | +----------+ +----------+ +----------+
I think it is wasteful because I don't think I need gen_event to hide all this, I could just use the process that controls the socket which talks to gen_event. It might make things simpler.
Anyway I'm looking for comments on the idea and the code.
Thanks.
$ erl Erlang R13B04 (erts-5.7.5) [source] [smp:2:2] [rq:2] [async-threads:0] [hipe] [kernel-poll:false] Eshell V5.7.5 (abort with ^G) 1> c(conn). {ok,conn} 2> c(ircmsg). {ok,ircmsg} 3> c(ircclient). {ok,ircclient} 4> c(dittoui). {ok,dittoui} 5> dittoui:start(). <0.61.0>
- Next File -> Connect,
- with "chat.freenode.net", 6667, <somenick>, <someusername>
Thanks, again.