[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) }
|
[mod] clean model-view-control
Christian Fraß authored 2 years ago
|
source/model.ts 196) case "message_channel":
source/model.ts 197) {
source/model.ts 198) model.channels[event.data["channel"]].entries.push
source/model.ts 199) ({
source/model.ts 200) "timestamp": event.timestamp,
|
[mod] added view for info e...
Christian Fraß authored 2 years ago
|
source/logic/model.ts 201) "kind": enum_entrykind.message,
|
[mod] wait for server side...
Christian Fraß authored 2 years ago
|
source/logic/model.ts 202) "sender": (event.data["sender"] ?? model.nickname),
|
[mod] clean model-view-control
Christian Fraß authored 2 years ago
|
source/model.ts 203) "content": event.data["content"],
source/model.ts 204) });
source/model.ts 205) shall_update_entries = true;
source/model.ts 206) break;
source/model.ts 207) }
source/model.ts 208) case "message_query":
source/model.ts 209) {
source/model.ts 210) if (! model.queries.hasOwnProperty(event.data["user_name"]))
source/model.ts 211) {
source/model.ts 212) model.queries[event.data["user_name"]] = {"entries": []};
source/model.ts 213) shall_update_spots = true;
source/model.ts 214) }
source/model.ts 215) else
source/model.ts 216) {
source/model.ts 217) // do nothing
source/model.ts 218) }
source/model.ts 219) model.queries[event.data["user_name"]].entries.push
source/model.ts 220) ({
source/model.ts 221) "timestamp": event.timestamp,
|
[mod] added view for info e...
Christian Fraß authored 2 years ago
|
source/logic/model.ts 222) "kind": enum_entrykind.message,
|
[mod] wait for server side...
Christian Fraß authored 2 years ago
|
source/logic/model.ts 223) "sender": (event.data["sender"] ?? model.nickname),
|
[mod] clean model-view-control
Christian Fraß authored 2 years ago
|
source/model.ts 224) "content": event.data["content"],
source/model.ts 225) });
source/model.ts 226) shall_update_entries = true;
source/model.ts 227) break;
source/model.ts 228) }
source/model.ts 229) }
source/model.ts 230) }
source/model.ts 231)
source/model.ts 232) if (shall_update_spots) notify(model, "spots_changed");
source/model.ts 233) if (shall_update_entries) notify(model, "entries_changed");
source/model.ts 234) if (shall_update_users) notify(model, "users_changed");
source/model.ts 235) }
source/model.ts 236)
source/model.ts 237)
source/model.ts 238) /**
source/model.ts 239) * establishes the connection
source/model.ts 240) */
source/model.ts 241) export async function connect
source/model.ts 242) (
source/model.ts 243) conf: type_conf,
source/model.ts 244) model: type_model,
source/model.ts 245) nickname: string,
source/model.ts 246) channel_names: Array<string>
source/model.ts 247) ): Promise<void>
source/model.ts 248) {
source/model.ts 249) set_state(model, enum_state.connecting);
source/model.ts 250) const connection_id: string = await backend_call
source/model.ts 251) (
source/model.ts 252) conf,
source/model.ts 253) model.connection_id,
source/model.ts 254) "connect",
source/model.ts 255) {
source/model.ts 256) "server": conf.irc.server,
source/model.ts 257) "channels": channel_names,
source/model.ts 258) "nickname": nickname,
source/model.ts 259) }
source/model.ts 260) );
source/model.ts 261) model.connection_id = connection_id;
source/model.ts 262) model.nickname = nickname;
source/model.ts 263) for (const channel_name of channel_names)
source/model.ts 264) {
source/model.ts 265) model.channels[channel_name] =
source/model.ts 266) {
source/model.ts 267) "users": [],
source/model.ts 268) "entries": [],
source/model.ts 269) };
source/model.ts 270) }
source/model.ts 271) if (channel_names.length > 0)
source/model.ts 272) {
source/model.ts 273) set_active(model, {"kind": "channel", "name": channel_names[0]});
source/model.ts 274) }
source/model.ts 275) return Promise.resolve<void>(undefined);
source/model.ts 276) }
source/model.ts 277)
source/model.ts 278)
source/model.ts 279) /**
source/model.ts 280) * closes the connection
source/model.ts 281) */
source/model.ts 282) export async function disconnect
source/model.ts 283) (
source/model.ts 284) conf: type_conf,
source/model.ts 285) model: type_model
source/model.ts 286) ): Promise<void>
source/model.ts 287) {
source/model.ts 288) await backend_call
source/model.ts 289) (
source/model.ts 290) conf,
source/model.ts 291) model.connection_id,
source/model.ts 292) "disconnect",
source/model.ts 293) null
source/model.ts 294) );
source/model.ts 295) set_state(model, enum_state.offline);
source/model.ts 296) model.connection_id = null;
source/model.ts 297) return Promise.resolve<void>(undefined);
source/model.ts 298) }
source/model.ts 299)
source/model.ts 300)
source/model.ts 301) /**
source/model.ts 302) * adds a client side message
source/model.ts 303) */
source/model.ts 304) export function send
source/model.ts 305) (
source/model.ts 306) conf: type_conf,
source/model.ts 307) model: type_model,
source/model.ts 308) content: string
source/model.ts 309) ): void
source/model.ts 310) {
source/model.ts 311) switch (model.active.kind)
source/model.ts 312) {
source/model.ts 313) case "channel":
source/model.ts 314) {
source/model.ts 315) backend_call
source/model.ts 316) (
source/model.ts 317) conf,
source/model.ts 318) model.connection_id,
source/model.ts 319) "send_channel",
source/model.ts 320) {
source/model.ts 321) "channel": model.active.name,
source/model.ts 322) "content": content,
source/model.ts 323) }
source/model.ts 324) );
|
[mod] wait for server side...
Christian Fraß authored 2 years ago
|
source/logic/model.ts 325) /*
|
[mod] clean model-view-control
Christian Fraß authored 2 years ago
|
source/model.ts 326) const event: type_event =
source/model.ts 327) {
source/model.ts 328) "timestamp": get_timestamp(),
source/model.ts 329) "kind": "message_channel",
source/model.ts 330) "data":
source/model.ts 331) {
source/model.ts 332) "channel": model.active.name,
source/model.ts 333) "sender": model.nickname,
source/model.ts 334) "content": content,
source/model.ts 335) }
source/model.ts 336) };
source/model.ts 337) process_events(model, [event]);
source/model.ts 338) notify(model, "entries_changed");
|
[mod] wait for server side...
Christian Fraß authored 2 years ago
|
source/logic/model.ts 339) */
|
[mod] clean model-view-control
Christian Fraß authored 2 years ago
|
source/model.ts 340) notify(model, "message_sent");
source/model.ts 341) break;
source/model.ts 342) }
source/model.ts 343) case "query":
source/model.ts 344) {
source/model.ts 345) backend_call
source/model.ts 346) (
source/model.ts 347) conf,
source/model.ts 348) model.connection_id,
source/model.ts 349) "send_query",
source/model.ts 350) {
source/model.ts 351) "receiver": model.active.name,
source/model.ts 352) "content": content,
source/model.ts 353) }
source/model.ts 354) );
|
[mod] wait for server side...
Christian Fraß authored 2 years ago
|
source/logic/model.ts 355) /*
|
[mod] clean model-view-control
Christian Fraß authored 2 years ago
|
source/model.ts 356) const event: type_event =
source/model.ts 357) {
source/model.ts 358) "timestamp": get_timestamp(),
source/model.ts 359) "kind": "message_query",
source/model.ts 360) "data":
source/model.ts 361) {
source/model.ts 362) "user_name": model.active.name,
source/model.ts 363) "sender": model.nickname,
source/model.ts 364) "content": content,
source/model.ts 365) }
source/model.ts 366) };
source/model.ts 367) process_events(model, [event]);
source/model.ts 368) notify(model, "entries_changed");
|
[mod] wait for server side...
Christian Fraß authored 2 years ago
|
source/logic/model.ts 369) */
|
[mod] clean model-view-control
Christian Fraß authored 2 years ago
|
source/model.ts 370) notify(model, "message_sent");
source/model.ts 371) break;
source/model.ts 372) }
source/model.ts 373) }
source/model.ts 374) }
source/model.ts 375)
source/model.ts 376)
|
[add] possibility to open q...
Christian Fraß authored 2 years ago
|
source/logic/model.ts 377) /**
source/logic/model.ts 378) * adds a query to a user as spot
source/logic/model.ts 379) */
source/logic/model.ts 380) export function open_query
source/logic/model.ts 381) (
source/logic/model.ts 382) model: type_model,
source/logic/model.ts 383) user_name: string
source/logic/model.ts 384) ): void
source/logic/model.ts 385) {
source/logic/model.ts 386) if ((user_name !== model.nickname) && (! model.queries.hasOwnProperty(user_name)))
source/logic/model.ts 387) {
source/logic/model.ts 388) model.queries[user_name] = {"entries": []};
source/logic/model.ts 389) notify(model, "spots_changed");
source/logic/model.ts 390) }
source/logic/model.ts 391) else
source/logic/model.ts 392) {
source/logic/model.ts 393) // do nothing
source/logic/model.ts 394) }
source/logic/model.ts 395) }
source/logic/model.ts 396)
source/logic/model.ts 397)
|