6de370b2dff776eecef58cffacd6940b3ce0ea20
Christian Fraß [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) 				}
Christian Fraß [mod] support user join/par...

Christian Fraß authored 2 years ago

source/logic/model.ts  98) 				case "user_list":
Christian Fraß [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) 				}
Christian Fraß [mod] support user join/par...

Christian Fraß authored 2 years ago

source/logic/model.ts 104) 				case "user_joined":
source/logic/model.ts 105) 				{
Christian Fraß [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) 					}
Christian Fraß [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) 				{
Christian Fraß [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) 					}
Christian Fraß [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) 				{
Christian Fraß [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) 					}
Christian Fraß [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) 						{
Christian Fraß [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
Christian Fraß [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) 							);
Christian Fraß [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;
Christian Fraß [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) 				}
Christian Fraß [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) 				}
Christian Fraß [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,
Christian Fraß [mod] added view for info e...

Christian Fraß authored 2 years ago

source/logic/model.ts 221) 						"kind": enum_entrykind.message,
Christian Fraß [mod] wait for server side...

Christian Fraß authored 2 years ago

source/logic/model.ts 222) 						"sender": (event.data["sender"] ?? model.nickname),
Christian Fraß [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,
Christian Fraß [mod] added view for info e...

Christian Fraß authored 2 years ago

source/logic/model.ts 242) 						"kind": enum_entrykind.message,
Christian Fraß [mod] wait for server side...

Christian Fraß authored 2 years ago

source/logic/model.ts 243) 						"sender": (event.data["sender"] ?? model.nickname),
Christian Fraß [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) 				);
Christian Fraß [mod] wait for server side...

Christian Fraß authored 2 years ago

source/logic/model.ts 345) 				/*
Christian Fraß [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");
Christian Fraß [mod] wait for server side...

Christian Fraß authored 2 years ago

source/logic/model.ts 359) 				 */
Christian Fraß [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) 				);
Christian Fraß [mod] wait for server side...

Christian Fraß authored 2 years ago

source/logic/model.ts 375) 				/*
Christian Fraß [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");
Christian Fraß [mod] wait for server side...

Christian Fraß authored 2 years ago

source/logic/model.ts 389) 				 */
Christian Fraß [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) 	
Christian Fraß [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": []};
Christian Fraß [mod] auto focus on message...

Christian Fraß authored 2 years ago

source/logic/model.ts 409) 			set_active(model, {"kind": "query", "name": user_name});
Christian Fraß [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)