[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] support user join/par...
Christian Fraß authored 2 years ago
|
source/logic/model.ts 98) case "user_list":
|
[mod] clean model-view-control
Christian Fraß authored 2 years ago
|
source/model.ts 99) {
source/model.ts 100) model.channels[event.data["channel"]].users = event.data["users"];
source/model.ts 101) shall_update_users = true;
source/model.ts 102) break;
source/model.ts 103) }
|
[mod] support user join/par...
Christian Fraß authored 2 years ago
|
source/logic/model.ts 104) case "user_joined":
source/logic/model.ts 105) {
|
[fix] info entries
Christian Fraß authored 2 years ago
|
source/logic/model.ts 106) if (model.channels.hasOwnProperty(event.data["channel"]))
source/logic/model.ts 107) {
source/logic/model.ts 108) model.channels[event.data["channel"]].users.push({"name": event.data["user_name"], "role": ""});
source/logic/model.ts 109) model.channels[event.data["channel"]].entries.push
source/logic/model.ts 110) ({
source/logic/model.ts 111) "timestamp": event.timestamp,
source/logic/model.ts 112) "kind": enum_entrykind.info,
source/logic/model.ts 113) "sender": null,
source/logic/model.ts 114) "content": `${event.data["user_name"]} joined`,
source/logic/model.ts 115) });
source/logic/model.ts 116) shall_update_users = true;
source/logic/model.ts 117) shall_update_entries = true;
source/logic/model.ts 118) }
source/logic/model.ts 119) else
source/logic/model.ts 120) {
source/logic/model.ts 121) // do nothing
source/logic/model.ts 122) }
|
[mod] support user join/par...
Christian Fraß authored 2 years ago
|
source/logic/model.ts 123) break;
source/logic/model.ts 124) }
source/logic/model.ts 125) case "user_parted":
source/logic/model.ts 126) {
|
[fix] info entries
Christian Fraß authored 2 years ago
|
source/logic/model.ts 127) if (model.channels.hasOwnProperty(event.data["channel"]))
source/logic/model.ts 128) {
source/logic/model.ts 129) model.channels[event.data["channel"]].users = model.channels[event.data["channel"]].users.filter
source/logic/model.ts 130) (
source/logic/model.ts 131) (user) => (user.name != event.data["user_name"])
source/logic/model.ts 132) );
source/logic/model.ts 133) model.channels[event.data["channel"]].entries.push
source/logic/model.ts 134) ({
source/logic/model.ts 135) "timestamp": event.timestamp,
source/logic/model.ts 136) "kind": enum_entrykind.info,
source/logic/model.ts 137) "sender": null,
source/logic/model.ts 138) "content": `${event.data["user_name"]} left`,
source/logic/model.ts 139) });
source/logic/model.ts 140) shall_update_users = true;
source/logic/model.ts 141) shall_update_entries = true;
source/logic/model.ts 142) }
source/logic/model.ts 143) else
source/logic/model.ts 144) {
source/logic/model.ts 145) // do nothing
source/logic/model.ts 146) }
|
[mod] support user join/par...
Christian Fraß authored 2 years ago
|
source/logic/model.ts 147) break;
source/logic/model.ts 148) }
source/logic/model.ts 149) case "user_kicked":
source/logic/model.ts 150) {
|
[fix] info entries
Christian Fraß authored 2 years ago
|
source/logic/model.ts 151) if (model.channels.hasOwnProperty(event.data["channel"]))
source/logic/model.ts 152) {
source/logic/model.ts 153) model.channels[event.data["channel"]].users = model.channels[event.data["channel"]].users.filter
source/logic/model.ts 154) (
source/logic/model.ts 155) (user) => (user.name != event.data["user_name"])
source/logic/model.ts 156) );
source/logic/model.ts 157) model.channels[event.data["channel"]].entries.push
source/logic/model.ts 158) ({
source/logic/model.ts 159) "timestamp": event.timestamp,
source/logic/model.ts 160) "kind": enum_entrykind.info,
source/logic/model.ts 161) "sender": null,
source/logic/model.ts 162) "content": `${event.data["user_name"]} was kicked by ${event.data["op_name"]}: ${event.data["reason"]}`,
source/logic/model.ts 163) });
source/logic/model.ts 164) shall_update_users = true;
source/logic/model.ts 165) shall_update_entries = true;
source/logic/model.ts 166) }
source/logic/model.ts 167) else
source/logic/model.ts 168) {
source/logic/model.ts 169) // do nothing
source/logic/model.ts 170) }
|
[mod] support user join/par...
Christian Fraß authored 2 years ago
|
source/logic/model.ts 171) break;
source/logic/model.ts 172) }
source/logic/model.ts 173) case "user_quit":
source/logic/model.ts 174) {
source/logic/model.ts 175) for (let channel_name of event.data["channels"])
source/logic/model.ts 176) {
source/logic/model.ts 177) if (model.channels.hasOwnProperty(channel_name))
source/logic/model.ts 178) {
|
[fix] info entries
Christian Fraß authored 2 years ago
|
source/logic/model.ts 179) model.channels[channel_name].users = model.channels[channel_name].users.filter
|
[mod] support user join/par...
Christian Fraß authored 2 years ago
|
source/logic/model.ts 180) (
source/logic/model.ts 181) (user) => (user.name != event.data["user_name"])
source/logic/model.ts 182) );
|
[fix] info entries
Christian Fraß authored 2 years ago
|
source/logic/model.ts 183) model.channels[channel_name].entries.push
source/logic/model.ts 184) ({
source/logic/model.ts 185) "timestamp": event.timestamp,
source/logic/model.ts 186) "kind": enum_entrykind.info,
source/logic/model.ts 187) "sender": null,
source/logic/model.ts 188) "content": `${event.data["user_name"]} quit`,
source/logic/model.ts 189) });
source/logic/model.ts 190) shall_update_entries = true;
source/logic/model.ts 191) shall_update_users = true;
|
[mod] support user join/par...
Christian Fraß authored 2 years ago
|
source/logic/model.ts 192) }
source/logic/model.ts 193) }
source/logic/model.ts 194) break;
source/logic/model.ts 195) }
|
[add] handling of "topic" e...
Christian Fraß authored 2 years ago
|
source/logic/model.ts 196) case "topic":
source/logic/model.ts 197) {
source/logic/model.ts 198) if (model.channels.hasOwnProperty(event.data["channel"]))
source/logic/model.ts 199) {
source/logic/model.ts 200) // model.channels[event.data["channel"]].topic = event.data["content"];
source/logic/model.ts 201) model.channels[event.data["channel"]].entries.push
source/logic/model.ts 202) ({
source/logic/model.ts 203) "timestamp": event.timestamp,
source/logic/model.ts 204) "kind": enum_entrykind.info,
source/logic/model.ts 205) "sender": null,
source/logic/model.ts 206) "content": `channel topic: ${event.data["content"]}`,
source/logic/model.ts 207) });
source/logic/model.ts 208) shall_update_entries = true;
source/logic/model.ts 209) }
source/logic/model.ts 210) else
source/logic/model.ts 211) {
source/logic/model.ts 212) // do nothing
source/logic/model.ts 213) }
source/logic/model.ts 214) break;
source/logic/model.ts 215) }
|
[mod] clean model-view-control
Christian Fraß authored 2 years ago
|
source/model.ts 216) case "message_channel":
source/model.ts 217) {
source/model.ts 218) model.channels[event.data["channel"]].entries.push
source/model.ts 219) ({
source/model.ts 220) "timestamp": event.timestamp,
|
[mod] added view for info e...
Christian Fraß authored 2 years ago
|
source/logic/model.ts 221) "kind": enum_entrykind.message,
|
[mod] wait for server side...
Christian Fraß authored 2 years ago
|
source/logic/model.ts 222) "sender": (event.data["sender"] ?? model.nickname),
|
[mod] clean model-view-control
Christian Fraß authored 2 years ago
|
source/model.ts 223) "content": event.data["content"],
source/model.ts 224) });
source/model.ts 225) shall_update_entries = true;
source/model.ts 226) break;
source/model.ts 227) }
source/model.ts 228) case "message_query":
source/model.ts 229) {
source/model.ts 230) if (! model.queries.hasOwnProperty(event.data["user_name"]))
source/model.ts 231) {
source/model.ts 232) model.queries[event.data["user_name"]] = {"entries": []};
source/model.ts 233) shall_update_spots = true;
source/model.ts 234) }
source/model.ts 235) else
source/model.ts 236) {
source/model.ts 237) // do nothing
source/model.ts 238) }
source/model.ts 239) model.queries[event.data["user_name"]].entries.push
source/model.ts 240) ({
source/model.ts 241) "timestamp": event.timestamp,
|
[mod] added view for info e...
Christian Fraß authored 2 years ago
|
source/logic/model.ts 242) "kind": enum_entrykind.message,
|
[mod] wait for server side...
Christian Fraß authored 2 years ago
|
source/logic/model.ts 243) "sender": (event.data["sender"] ?? model.nickname),
|
[mod] clean model-view-control
Christian Fraß authored 2 years ago
|
source/model.ts 244) "content": event.data["content"],
source/model.ts 245) });
source/model.ts 246) shall_update_entries = true;
source/model.ts 247) break;
source/model.ts 248) }
source/model.ts 249) }
source/model.ts 250) }
source/model.ts 251)
source/model.ts 252) if (shall_update_spots) notify(model, "spots_changed");
source/model.ts 253) if (shall_update_entries) notify(model, "entries_changed");
source/model.ts 254) if (shall_update_users) notify(model, "users_changed");
source/model.ts 255) }
source/model.ts 256)
source/model.ts 257)
source/model.ts 258) /**
source/model.ts 259) * establishes the connection
source/model.ts 260) */
source/model.ts 261) export async function connect
source/model.ts 262) (
source/model.ts 263) conf: type_conf,
source/model.ts 264) model: type_model,
source/model.ts 265) nickname: string,
source/model.ts 266) channel_names: Array<string>
source/model.ts 267) ): Promise<void>
source/model.ts 268) {
source/model.ts 269) set_state(model, enum_state.connecting);
source/model.ts 270) const connection_id: string = await backend_call
source/model.ts 271) (
source/model.ts 272) conf,
source/model.ts 273) model.connection_id,
source/model.ts 274) "connect",
source/model.ts 275) {
source/model.ts 276) "server": conf.irc.server,
source/model.ts 277) "channels": channel_names,
source/model.ts 278) "nickname": nickname,
source/model.ts 279) }
source/model.ts 280) );
source/model.ts 281) model.connection_id = connection_id;
source/model.ts 282) model.nickname = nickname;
source/model.ts 283) for (const channel_name of channel_names)
source/model.ts 284) {
source/model.ts 285) model.channels[channel_name] =
source/model.ts 286) {
source/model.ts 287) "users": [],
source/model.ts 288) "entries": [],
source/model.ts 289) };
source/model.ts 290) }
source/model.ts 291) if (channel_names.length > 0)
source/model.ts 292) {
source/model.ts 293) set_active(model, {"kind": "channel", "name": channel_names[0]});
source/model.ts 294) }
source/model.ts 295) return Promise.resolve<void>(undefined);
source/model.ts 296) }
source/model.ts 297)
source/model.ts 298)
source/model.ts 299) /**
source/model.ts 300) * closes the connection
source/model.ts 301) */
source/model.ts 302) export async function disconnect
source/model.ts 303) (
source/model.ts 304) conf: type_conf,
source/model.ts 305) model: type_model
source/model.ts 306) ): Promise<void>
source/model.ts 307) {
source/model.ts 308) await backend_call
source/model.ts 309) (
source/model.ts 310) conf,
source/model.ts 311) model.connection_id,
source/model.ts 312) "disconnect",
source/model.ts 313) null
source/model.ts 314) );
source/model.ts 315) set_state(model, enum_state.offline);
source/model.ts 316) model.connection_id = null;
source/model.ts 317) return Promise.resolve<void>(undefined);
source/model.ts 318) }
source/model.ts 319)
source/model.ts 320)
source/model.ts 321) /**
source/model.ts 322) * adds a client side message
source/model.ts 323) */
source/model.ts 324) export function send
source/model.ts 325) (
source/model.ts 326) conf: type_conf,
source/model.ts 327) model: type_model,
source/model.ts 328) content: string
source/model.ts 329) ): void
source/model.ts 330) {
source/model.ts 331) switch (model.active.kind)
source/model.ts 332) {
source/model.ts 333) case "channel":
source/model.ts 334) {
source/model.ts 335) backend_call
source/model.ts 336) (
source/model.ts 337) conf,
source/model.ts 338) model.connection_id,
source/model.ts 339) "send_channel",
source/model.ts 340) {
source/model.ts 341) "channel": model.active.name,
source/model.ts 342) "content": content,
source/model.ts 343) }
source/model.ts 344) );
|
[mod] wait for server side...
Christian Fraß authored 2 years ago
|
source/logic/model.ts 345) /*
|
[mod] clean model-view-control
Christian Fraß authored 2 years ago
|
source/model.ts 346) const event: type_event =
source/model.ts 347) {
source/model.ts 348) "timestamp": get_timestamp(),
source/model.ts 349) "kind": "message_channel",
source/model.ts 350) "data":
source/model.ts 351) {
source/model.ts 352) "channel": model.active.name,
source/model.ts 353) "sender": model.nickname,
source/model.ts 354) "content": content,
source/model.ts 355) }
source/model.ts 356) };
source/model.ts 357) process_events(model, [event]);
source/model.ts 358) notify(model, "entries_changed");
|
[mod] wait for server side...
Christian Fraß authored 2 years ago
|
source/logic/model.ts 359) */
|
[mod] clean model-view-control
Christian Fraß authored 2 years ago
|
source/model.ts 360) notify(model, "message_sent");
source/model.ts 361) break;
source/model.ts 362) }
source/model.ts 363) case "query":
source/model.ts 364) {
source/model.ts 365) backend_call
source/model.ts 366) (
source/model.ts 367) conf,
source/model.ts 368) model.connection_id,
source/model.ts 369) "send_query",
source/model.ts 370) {
source/model.ts 371) "receiver": model.active.name,
source/model.ts 372) "content": content,
source/model.ts 373) }
source/model.ts 374) );
|
[mod] wait for server side...
Christian Fraß authored 2 years ago
|
source/logic/model.ts 375) /*
|
[mod] clean model-view-control
Christian Fraß authored 2 years ago
|
source/model.ts 376) const event: type_event =
source/model.ts 377) {
source/model.ts 378) "timestamp": get_timestamp(),
source/model.ts 379) "kind": "message_query",
source/model.ts 380) "data":
source/model.ts 381) {
source/model.ts 382) "user_name": model.active.name,
source/model.ts 383) "sender": model.nickname,
source/model.ts 384) "content": content,
source/model.ts 385) }
source/model.ts 386) };
source/model.ts 387) process_events(model, [event]);
source/model.ts 388) notify(model, "entries_changed");
|
[mod] wait for server side...
Christian Fraß authored 2 years ago
|
source/logic/model.ts 389) */
|
[mod] clean model-view-control
Christian Fraß authored 2 years ago
|
source/model.ts 390) notify(model, "message_sent");
source/model.ts 391) break;
source/model.ts 392) }
source/model.ts 393) }
source/model.ts 394) }
source/model.ts 395)
source/model.ts 396)
|
[add] possibility to open q...
Christian Fraß authored 2 years ago
|
source/logic/model.ts 397) /**
source/logic/model.ts 398) * adds a query to a user as spot
source/logic/model.ts 399) */
source/logic/model.ts 400) export function open_query
source/logic/model.ts 401) (
source/logic/model.ts 402) model: type_model,
source/logic/model.ts 403) user_name: string
source/logic/model.ts 404) ): void
source/logic/model.ts 405) {
source/logic/model.ts 406) if ((user_name !== model.nickname) && (! model.queries.hasOwnProperty(user_name)))
source/logic/model.ts 407) {
source/logic/model.ts 408) model.queries[user_name] = {"entries": []};
|
[mod] auto focus on message...
Christian Fraß authored 2 years ago
|
source/logic/model.ts 409) set_active(model, {"kind": "query", "name": user_name});
|
[add] possibility to open q...
Christian Fraß authored 2 years ago
|
source/logic/model.ts 410) }
source/logic/model.ts 411) else
source/logic/model.ts 412) {
source/logic/model.ts 413) // do nothing
source/logic/model.ts 414) }
source/logic/model.ts 415) }
source/logic/model.ts 416)
source/logic/model.ts 417)
|