Hmm, let's see.
Usually, the users don't customize settings (make good defaults, that's the trick), so let's see what information the user needs.
- in some cases, users want to be notified if a certain person does something. The easiest part is "tell me if X is seen in the room [as I need to speak to him/her]" - if you've ever fallen in love through chat, you know it's pretty important :)
- In other cases, there might be only the network effect which we want to see (3 people left together for a bar)
- In other cases, we just want to see a summary of events after switching back to the chat (either focusing on the window again, or literally re-joining)
- In other cases, as channel moderators or other "staff-like" persons, we just want to see stats on what happened in the chat
You should analyze facebook and chat clients (Adium, kvirc, mirc, xchat) on this, as well as IRC statistics bots and programs. For some (all of the mentioned) you can find even the sourcecode - like, check how adium handles event collation.
You have basically atomic events (protocol events), then you have the detailed events, and then the summarized events.
- Protocol events aren't likely to be stored at all, they're analyzed by the detailed events processor. They live only in the memory as a standard protocol entity.
- detailed events are what could be used by multiple subsystems to display and analyze. They're likely stored short-term, like, about a day, or last 100. Detailed events are processed "raw" events", and they're a short struct.
- summarized events, which are stored for record-keeping, summarized events are in fact, processed detailed events.
I strongly suggest you separate display and storage of detailed events: you never know what data you need later.
If you want to collate events (like, "5 people left"), then you'll have to have a "detailed events"-display processor, which has a bit of memory, separated by types.
The collation could go either only-if-uninterrupted (A leaves, B leaves, then something else happens, then C leaves -> "2 people left, something, C left"), in a certain period (2 people left since you last checked in), grouped by type (A went offline, A came online, A went offline, A came online - result: A came online - example, Adium), or simply superpositioning (2 people like Dr House - example: Facebook!)
These are, in fact, storage strategies, so you could employ GoF design patterns here.
This processor might need to be able to overwrite its last displayed data (remember at least last line, and be able to change it to a collated version)
Search for files containing 'Event' in name in Adium's source perhaps
Hope this helps.