Scan media entities as well, not just url entities. This should expand more
[bitlbee.git] / doc / HACKING
blob9d064d588d1dfe36b4ce5098ed96c6c0046f2b85
1 BitlBee post-1.x "architecture"
3 DISCLAIMER: The messy architecture is being cleaned up. Although lots of
4 progress was made already, this is still a work in progress, and possibly
5 parts of this document aren't entirely accurate anymore by the time you
6 read this.
8 It's been a while since BitlBee started, as a semi-fork of Gaim (version
9 0.58 at the time). Some people believe nothing changed, but fortunately,
10 many things have.
12 The API is gone for a while already - which wasn't incredibly intrusive,
13 just a few functions renamed for slightly better consistency, added some
14 calls and arguments where that seemed useful, etc.
16 However, up to late in the 1.2 series, the IRC core was still spread accross
17 several files, mostly irc.c + irc_commands.c and pieces and bits in
18 nogaim.c. If you're looking for a textbook example of layer violation, start
19 there.
21 This was all finally redone. Most of the IRC protocol code was rewritten,
22 as was most of the glue between that and the IM modules.
24 The core of BitlBee is now protocols/bee*. Some pieces are still left in
25 protocols/nogaim*. Most stuff in the "root" directory belongs to the IRC
26 UI, which should be considered "a" frontend (although currently, and
27 possibly forever, the only one). Every subdirectory of protocols/ is another
28 IM protocol backend (including purple/ which uses libpurple to define
29 many different protocols).
34 The IRC core has code to show an IRC interface to a user, with contacts,
35 channels, etc. To make channels and contacts do something, you add event
36 handlers (that translate a message sent to a nick into an instant message
37 to an IM contact, or translates joining a channel into joining an IM
38 chatroom).
40 To get events back from the BitlBee core, the bee_t object has a bunch of
41 functions (struct bee_ui_funcs) that catch them and convert them back to
42 IRC.
44 Short description of what all irc*.c files (and some related ones) do:
46 bitlbee.c: BitlBee bootstrap code, doing bits of I/O as well.
47 ipc.c: For inter-process communication - communication between BitlBee
48     sessions. Also used in daemon mode (in which it's not so much inter-
49     process).
50 irc.c: The main core, with bits of I/O handling, parsing, etc.
51 irc_channel.c: Most things related to standard channels (also defines some
52     of the control channel behaviour).
53 irc_commands.c: Defines all IRC commands (JOIN, NICK, PRIVMSG, etc.).
54 irc_im.c: Most of the glue between IRC and the IM core live here. This is
55     where instant messages are converted to IRC and vice versa, contacts
56     coming online is translated to one or more joins and/or mode changes.
57 irc_send.c: Simple functions that send pieces of IRC output. Somewhat
58     random, but if an IRC response is slightly more complicated than just a
59     simple line, make it a function here.
60 irc_user.c: Defines all IRC user details. Mostly defines the user "object".
61 irc_util.c: Misc. stuff. Not much ATM.
62 nick.c: Handling of nicknames: compare, ucase/lcase, generating and storing
63     nicks for IM contacts.
64 set.c: Settings management, used for user-changeable global/account/channel
65     settings. Should really be considered part of the core.
66 storage*.c: Storing user accounts. (The stuff you normally find in
67     /var/lib/bitlbee)
70 /protocols
72 The IM core lives in protocols/. Whenever you write code there, try to avoid
73 using any IRCisms there.
75 Most header files in there have some of their details explained in comments.
76 bee*.c and nogaim.c are the layer between the IM modules and the IRC
77 frontend. They keep track of IM accounts, contacts and their status,
78 groupchats, etc.
80 You can control them by calling functions in there if available, and
81 otherwise by just calling the functions exported via the prpl struct. Most
82 of these functions are briefly explained in the header files, otherwise the
83 best documentation is sadly in irc_im.c and root_commands.c.
85 Events from the IM module go back to the core + frontend via imcb_*
86 functions defined in bee*.c and nogaim.c. They're all described in the
87 header files.
90 /lib
92 BitlBee uses GLib, which is a pretty nifty library adding a bunch of things
93 that make life of a C coder better. Please try to not use features from
94 recent GLib versions as whenever this happens, some people get cranky. :>
96 There's also a whole bunch of nice stuff in lib/ that you can use:
98 arc.c: ARC4 encryption, mostly used for encrypting IM passwords in the XML
99     storage module.
100 base64.c
101 events_*.c: Event handling, using either GLib (default) or libevent (may
102     make non-forking daemon mode with many users a little bit more efficient).
103 ftutil.c: Some small utility functions currently just used for file transfers.
104 http_client.c: A simple (but asynchronous) HTTP(S) client, used by the MSN,
105     Yahoo! and Twitter module by now.
106 ini.c: Simple INI file parser, used to parse bitlbee.conf.
107 md5.c
108 misc.c: What the name says, really.
109 oauth.c: What the name says. If you don't know what OAuth is, ask Google.
110     Currently only used by the Twitter module. Implements just version 1a ATM.
111 proxy.c: Used together with events_*.c for asynchronous I/O directly or via
112     proxies.
113 sha1.c
114 ssl_*.c: SSL client stuff, using GnuTLS (preferred) or OpenSSL. Other modules
115     aren't working well ATM.
116 url.c: URL parser.
117 xmltree.c: Uses the GLib stream parser to build XML parse trees from a stream
118     and convert the same structs back into XML. Good enough to do Jabber but
119     not very aware of stuff like XML namespaces. Used for Jabber and Twitter.
121 This, together with the headerfile comments, is most of the documentation we
122 have right now. If you're trying to make some changes to BitlBee, do feel
123 free to join #bitlbee on irc.oftc.net to ask any question you have. 
124 Suggestions for specific parts to document a little bit more are also
125 welcome.