2c2ebdae7120ea5760fd59ba867343b866c8374e
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) 				{
source/logic/model.ts 106) 					model.channels[event.data["channel"]].users.push({"name": event.data["user_name"], "role": ""});
source/logic/model.ts 107) 					shall_update_users = true;
source/logic/model.ts 108) 					break;
source/logic/model.ts 109) 				}
source/logic/model.ts 110) 				case "user_parted":
source/logic/model.ts 111) 				{
source/logic/model.ts 112) 					model.channels[event.data["channel"]].users = model.channels[event.data["channel"]].users.filter
source/logic/model.ts 113) 					(
source/logic/model.ts 114) 						(user) => (user.name != event.data["user_name"])
source/logic/model.ts 115) 					);
source/logic/model.ts 116) 					shall_update_users = true;
source/logic/model.ts 117) 					break;
source/logic/model.ts 118) 				}
source/logic/model.ts 119) 				case "user_kicked":
source/logic/model.ts 120) 				{
source/logic/model.ts 121) 					model.channels[event.data["channel"]].users = model.channels[event.data["channel"]].users.filter
source/logic/model.ts 122) 					(
source/logic/model.ts 123) 						(user) => (user.name != event.data["user_name"])
source/logic/model.ts 124) 					);
source/logic/model.ts 125) 					shall_update_users = true;
source/logic/model.ts 126) 					break;
source/logic/model.ts 127) 				}
source/logic/model.ts 128) 				case "user_quit":
source/logic/model.ts 129) 				{
source/logic/model.ts 130) 					for (let channel_name of event.data["channels"])
source/logic/model.ts 131) 					{
source/logic/model.ts 132) 						if (model.channels.hasOwnProperty(channel_name))
source/logic/model.ts 133) 						{
source/logic/model.ts 134) 							model.channels[channel_name].users = model.channels[event.data["channel"]].users.filter
source/logic/model.ts 135) 							(
source/logic/model.ts 136) 								(user) => (user.name != event.data["user_name"])
source/logic/model.ts 137) 							);
source/logic/model.ts 138) 						}
source/logic/model.ts 139) 					}
source/logic/model.ts 140) 					shall_update_spots = true;
source/logic/model.ts 141) 					shall_update_users = true;
source/logic/model.ts 142) 					break;
source/logic/model.ts 143) 				}
Christian Fraß [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) 	
Christian Fraß [add] possibility to open q...

Christian Fraß authored 2 years ago

source/logic/model.ts 319) 	/**
source/logic/model.ts 320) 	 * adds a query to a user as spot
source/logic/model.ts 321) 	 */
source/logic/model.ts 322) 	export function open_query
source/logic/model.ts 323) 	(
source/logic/model.ts 324) 		model: type_model,
source/logic/model.ts 325) 		user_name: string
source/logic/model.ts 326) 	): void
source/logic/model.ts 327) 	{
source/logic/model.ts 328) 		if ((user_name !== model.nickname) && (! model.queries.hasOwnProperty(user_name)))
source/logic/model.ts 329) 		{
source/logic/model.ts 330) 			model.queries[user_name] = {"entries": []};
source/logic/model.ts 331) 			notify(model, "spots_changed");
source/logic/model.ts 332) 		}
source/logic/model.ts 333) 		else
source/logic/model.ts 334) 		{
source/logic/model.ts 335) 			// do nothing
source/logic/model.ts 336) 		}
source/logic/model.ts 337) 	}
source/logic/model.ts 338) 	
source/logic/model.ts 339)