[mod] clean model-view-control
Christian Fraß authored 2 years ago
|
source/model.ts 1) namespace ns_model
source/model.ts 2) {
source/model.ts 3)
source/model.ts 4) /**
source/model.ts 5) * adds a listener for a certain incident
source/model.ts 6) */
source/model.ts 7) export function listen
source/model.ts 8) (
source/model.ts 9) model: type_model,
source/model.ts 10) incident: string,
source/model.ts 11) handler: (details?: any)=>void
source/model.ts 12) ): void
source/model.ts 13) {
source/model.ts 14) if (! model.listeners.hasOwnProperty(incident))
source/model.ts 15) {
source/model.ts 16) model.listeners[incident] = [];
source/model.ts 17) }
source/model.ts 18) else
source/model.ts 19) {
source/model.ts 20) // do nothing
source/model.ts 21) }
source/model.ts 22) model.listeners[incident].push(handler);
source/model.ts 23) }
source/model.ts 24)
source/model.ts 25)
source/model.ts 26) /**
source/model.ts 27) * sends a notification to all listeners for a certain incident
source/model.ts 28) */
source/model.ts 29) function notify
source/model.ts 30) (
source/model.ts 31) model: type_model,
source/model.ts 32) incident: string,
source/model.ts 33) details: any = null
source/model.ts 34) ): void
source/model.ts 35) {
source/model.ts 36) if (model.listeners.hasOwnProperty(incident))
source/model.ts 37) {
source/model.ts 38) for (const handler of model.listeners[incident])
source/model.ts 39) {
source/model.ts 40) handler(details);
source/model.ts 41) }
source/model.ts 42) }
source/model.ts 43) }
source/model.ts 44)
source/model.ts 45)
source/model.ts 46) /**
source/model.ts 47) * sets the state
source/model.ts 48) */
source/model.ts 49) export function set_state
source/model.ts 50) (
source/model.ts 51) model: type_model,
source/model.ts 52) state: enum_state
source/model.ts 53) ): void
source/model.ts 54) {
source/model.ts 55) model.state = state;
source/model.ts 56) notify(model, "state_changed");
source/model.ts 57) }
source/model.ts 58)
source/model.ts 59)
source/model.ts 60) /**
source/model.ts 61) * sets the active spot (channel or query)
source/model.ts 62) */
source/model.ts 63) export function set_active
source/model.ts 64) (
source/model.ts 65) model: type_model,
source/model.ts 66) spot: type_spot
source/model.ts 67) ): void
source/model.ts 68) {
source/model.ts 69) model.active = spot;
source/model.ts 70) notify(model, "spots_changed");
source/model.ts 71) notify(model, "entries_changed");
source/model.ts 72) notify(model, "users_changed");
source/model.ts 73) }
source/model.ts 74)
source/model.ts 75)
source/model.ts 76) /**
source/model.ts 77) * updates the model according to a list of events
source/model.ts 78) */
source/model.ts 79) function process_events
source/model.ts 80) (
source/model.ts 81) model: type_model,
source/model.ts 82) events: Array<type_event>
source/model.ts 83) ): void
source/model.ts 84) {
source/model.ts 85) let shall_update_spots: boolean = false;
source/model.ts 86) let shall_update_entries: boolean = false;
source/model.ts 87) let shall_update_users: boolean = false;
source/model.ts 88)
source/model.ts 89) for (const event of events)
source/model.ts 90) {
source/model.ts 91) switch (event.kind)
source/model.ts 92) {
source/model.ts 93) default:
source/model.ts 94) {
source/model.ts 95) console.warn("unhandled event kind: " + event.kind);
source/model.ts 96) break;
source/model.ts 97) }
|
[mod] clean model-view-control
Christian Fraß authored 2 years ago
|
source/model.ts 144) case "message_channel":
source/model.ts 145) {
source/model.ts 146) model.channels[event.data["channel"]].entries.push
source/model.ts 147) ({
source/model.ts 148) "timestamp": event.timestamp,
source/model.ts 149) "sender": event.data["sender"],
source/model.ts 150) "content": event.data["content"],
source/model.ts 151) });
source/model.ts 152) shall_update_entries = true;
source/model.ts 153) break;
source/model.ts 154) }
source/model.ts 155) case "message_query":
source/model.ts 156) {
source/model.ts 157) if (! model.queries.hasOwnProperty(event.data["user_name"]))
source/model.ts 158) {
source/model.ts 159) model.queries[event.data["user_name"]] = {"entries": []};
source/model.ts 160) shall_update_spots = true;
source/model.ts 161) }
source/model.ts 162) else
source/model.ts 163) {
source/model.ts 164) // do nothing
source/model.ts 165) }
source/model.ts 166) model.queries[event.data["user_name"]].entries.push
source/model.ts 167) ({
source/model.ts 168) "timestamp": event.timestamp,
source/model.ts 169) "sender": event.data["sender"],
source/model.ts 170) "content": event.data["content"],
source/model.ts 171) });
source/model.ts 172) shall_update_entries = true;
source/model.ts 173) break;
source/model.ts 174) }
source/model.ts 175) }
source/model.ts 176) }
source/model.ts 177)
source/model.ts 178) if (shall_update_spots) notify(model, "spots_changed");
source/model.ts 179) if (shall_update_entries) notify(model, "entries_changed");
source/model.ts 180) if (shall_update_users) notify(model, "users_changed");
source/model.ts 181) }
source/model.ts 182)
source/model.ts 183)
source/model.ts 184) /**
source/model.ts 185) * establishes the connection
source/model.ts 186) */
source/model.ts 187) export async function connect
source/model.ts 188) (
source/model.ts 189) conf: type_conf,
source/model.ts 190) model: type_model,
source/model.ts 191) nickname: string,
source/model.ts 192) channel_names: Array<string>
source/model.ts 193) ): Promise<void>
source/model.ts 194) {
source/model.ts 195) set_state(model, enum_state.connecting);
source/model.ts 196) const connection_id: string = await backend_call
source/model.ts 197) (
source/model.ts 198) conf,
source/model.ts 199) model.connection_id,
source/model.ts 200) "connect",
source/model.ts 201) {
source/model.ts 202) "server": conf.irc.server,
source/model.ts 203) "channels": channel_names,
source/model.ts 204) "nickname": nickname,
source/model.ts 205) }
source/model.ts 206) );
source/model.ts 207) model.connection_id = connection_id;
source/model.ts 208) model.nickname = nickname;
source/model.ts 209) for (const channel_name of channel_names)
source/model.ts 210) {
source/model.ts 211) model.channels[channel_name] =
source/model.ts 212) {
source/model.ts 213) "users": [],
source/model.ts 214) "entries": [],
source/model.ts 215) };
source/model.ts 216) }
source/model.ts 217) if (channel_names.length > 0)
source/model.ts 218) {
source/model.ts 219) set_active(model, {"kind": "channel", "name": channel_names[0]});
source/model.ts 220) }
source/model.ts 221) return Promise.resolve<void>(undefined);
source/model.ts 222) }
source/model.ts 223)
source/model.ts 224)
source/model.ts 225) /**
source/model.ts 226) * closes the connection
source/model.ts 227) */
source/model.ts 228) export async function disconnect
source/model.ts 229) (
source/model.ts 230) conf: type_conf,
source/model.ts 231) model: type_model
source/model.ts 232) ): Promise<void>
source/model.ts 233) {
source/model.ts 234) await backend_call
source/model.ts 235) (
source/model.ts 236) conf,
source/model.ts 237) model.connection_id,
source/model.ts 238) "disconnect",
source/model.ts 239) null
source/model.ts 240) );
source/model.ts 241) set_state(model, enum_state.offline);
source/model.ts 242) model.connection_id = null;
source/model.ts 243) return Promise.resolve<void>(undefined);
source/model.ts 244) }
source/model.ts 245)
source/model.ts 246)
source/model.ts 247) /**
source/model.ts 248) * adds a client side message
source/model.ts 249) */
source/model.ts 250) export function send
source/model.ts 251) (
source/model.ts 252) conf: type_conf,
source/model.ts 253) model: type_model,
source/model.ts 254) content: string
source/model.ts 255) ): void
source/model.ts 256) {
source/model.ts 257) switch (model.active.kind)
source/model.ts 258) {
source/model.ts 259) case "channel":
source/model.ts 260) {
source/model.ts 261) backend_call
source/model.ts 262) (
source/model.ts 263) conf,
source/model.ts 264) model.connection_id,
source/model.ts 265) "send_channel",
source/model.ts 266) {
source/model.ts 267) "channel": model.active.name,
source/model.ts 268) "content": content,
source/model.ts 269) }
source/model.ts 270) );
source/model.ts 271) const event: type_event =
source/model.ts 272) {
source/model.ts 273) "timestamp": get_timestamp(),
source/model.ts 274) "kind": "message_channel",
source/model.ts 275) "data":
source/model.ts 276) {
source/model.ts 277) "channel": model.active.name,
source/model.ts 278) "sender": model.nickname,
source/model.ts 279) "content": content,
source/model.ts 280) }
source/model.ts 281) };
source/model.ts 282) process_events(model, [event]);
source/model.ts 283) notify(model, "entries_changed");
source/model.ts 284) notify(model, "message_sent");
source/model.ts 285) break;
source/model.ts 286) }
source/model.ts 287) case "query":
source/model.ts 288) {
source/model.ts 289) backend_call
source/model.ts 290) (
source/model.ts 291) conf,
source/model.ts 292) model.connection_id,
source/model.ts 293) "send_query",
source/model.ts 294) {
source/model.ts 295) "receiver": model.active.name,
source/model.ts 296) "content": content,
source/model.ts 297) }
source/model.ts 298) );
source/model.ts 299) const event: type_event =
source/model.ts 300) {
source/model.ts 301) "timestamp": get_timestamp(),
source/model.ts 302) "kind": "message_query",
source/model.ts 303) "data":
source/model.ts 304) {
source/model.ts 305) "user_name": model.active.name,
source/model.ts 306) "sender": model.nickname,
source/model.ts 307) "content": content,
source/model.ts 308) }
source/model.ts 309) };
source/model.ts 310) process_events(model, [event]);
source/model.ts 311) notify(model, "entries_changed");
source/model.ts 312) notify(model, "message_sent");
source/model.ts 313) break;
source/model.ts 314) }
source/model.ts 315) }
source/model.ts 316) }
source/model.ts 317)
source/model.ts 318)
|