mirror of
				https://github.com/pierre42100/ComunicWeb
				synced 2025-11-04 04:04:20 +00:00 
			
		
		
		
	Start to migrate conversation system
This commit is contained in:
		@@ -94,6 +94,9 @@ class UserWebSocket {
 | 
				
			|||||||
	static async Closed(e) {
 | 
						static async Closed(e) {
 | 
				
			||||||
		console.error("WS closed", e)
 | 
							console.error("WS closed", e)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							// Notify the application
 | 
				
			||||||
 | 
							SendEvent("wsClosed");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		// Reset requests queue
 | 
							// Reset requests queue
 | 
				
			||||||
		requests = {};
 | 
							requests = {};
 | 
				
			||||||
		
 | 
							
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -11,6 +11,11 @@ ComunicWeb.components.conversations.interface = {
 | 
				
			|||||||
	 */
 | 
						 */
 | 
				
			||||||
	__conversationsList: {},
 | 
						__conversationsList: {},
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/**
 | 
				
			||||||
 | 
						 * @var {any} __registeredList The list of conversatins
 | 
				
			||||||
 | 
						 */
 | 
				
			||||||
 | 
						__registeredList: {},
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/**
 | 
						/**
 | 
				
			||||||
	 * Get and return the list of available conversations
 | 
						 * Get and return the list of available conversations
 | 
				
			||||||
	 * 
 | 
						 * 
 | 
				
			||||||
@@ -363,6 +368,62 @@ ComunicWeb.components.conversations.interface = {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/**
 | 
				
			||||||
 | 
						 * Asynchronoulsy refresh a single conversation
 | 
				
			||||||
 | 
						 * 
 | 
				
			||||||
 | 
						 * @param convID The ID of the target conversation
 | 
				
			||||||
 | 
						 * @param lastMessageID The ID of the last known message
 | 
				
			||||||
 | 
						 */
 | 
				
			||||||
 | 
						asyncRefreshSingle: function(convID, lastMessageID) {
 | 
				
			||||||
 | 
							return new Promise((res, err) => {
 | 
				
			||||||
 | 
								this.refreshSingleConversation(convID, lastMessageID, (list) => {
 | 
				
			||||||
 | 
									if(list.error)
 | 
				
			||||||
 | 
										err(list.error);
 | 
				
			||||||
 | 
									else
 | 
				
			||||||
 | 
										res(list);
 | 
				
			||||||
 | 
								})
 | 
				
			||||||
 | 
							});
 | 
				
			||||||
 | 
						},
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/**
 | 
				
			||||||
 | 
						 * Register a conversation remotly
 | 
				
			||||||
 | 
						 * 
 | 
				
			||||||
 | 
						 * @param {Number} convID 
 | 
				
			||||||
 | 
						 */
 | 
				
			||||||
 | 
						register: async function(convID) {
 | 
				
			||||||
 | 
							if(this.__registeredList.hasOwnProperty(convID))
 | 
				
			||||||
 | 
								this.__registeredList[convID]++;
 | 
				
			||||||
 | 
							
 | 
				
			||||||
 | 
							else {
 | 
				
			||||||
 | 
								this.__registeredList[convID] = 1;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								await ws("$main/register_conv", {
 | 
				
			||||||
 | 
									convID: convID
 | 
				
			||||||
 | 
								});
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						},
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/**
 | 
				
			||||||
 | 
						 * Unregister to new messages of a conversation
 | 
				
			||||||
 | 
						 * 
 | 
				
			||||||
 | 
						 * @param {Number} convID 
 | 
				
			||||||
 | 
						 */
 | 
				
			||||||
 | 
						unregister: async function(convID) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							if(!this.__registeredList.hasOwnProperty(convID))
 | 
				
			||||||
 | 
								return;
 | 
				
			||||||
 | 
							
 | 
				
			||||||
 | 
							this.__registeredList[convID]--;
 | 
				
			||||||
 | 
							
 | 
				
			||||||
 | 
							if(this.__registeredList[convID] == 0) {
 | 
				
			||||||
 | 
								delete this.__registeredList[convID];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								await ws("$main/unregister_conv", {
 | 
				
			||||||
 | 
									convID: convID
 | 
				
			||||||
 | 
								});
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						},
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/**
 | 
						/**
 | 
				
			||||||
	 * Intend to update the content of a single message
 | 
						 * Intend to update the content of a single message
 | 
				
			||||||
	 * 
 | 
						 * 
 | 
				
			||||||
@@ -426,4 +487,8 @@ ComunicWeb.components.conversations.interface = {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
//Register conversations cache cleaning function
 | 
					//Register conversations cache cleaning function
 | 
				
			||||||
ComunicWeb.common.cacheManager.registerCacheCleaner("ComunicWeb.components.conversations.interface.emptyCache");
 | 
					ComunicWeb.common.cacheManager.registerCacheCleaner("ComunicWeb.components.conversations.interface.emptyCache");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					document.addEventListener("wsClosed", () => {
 | 
				
			||||||
 | 
						ComunicWeb.components.conversations.interface.__registeredList = {};
 | 
				
			||||||
 | 
					})
 | 
				
			||||||
@@ -7,21 +7,11 @@
 | 
				
			|||||||
 */
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
ComunicWeb.components.conversations.service = {
 | 
					ComunicWeb.components.conversations.service = {
 | 
				
			||||||
	
 | 
					 | 
				
			||||||
	/**
 | 
					 | 
				
			||||||
	 * @var {Integer} __intervalID The ID of the current service interval
 | 
					 | 
				
			||||||
	 */
 | 
					 | 
				
			||||||
	__intervalID: false,
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/**
 | 
						/**
 | 
				
			||||||
	 * @var {Object} __serviceCache The service cache
 | 
						 * @var {Object} __serviceCache The service cache
 | 
				
			||||||
	 */
 | 
						 */
 | 
				
			||||||
	__serviceCache: false,
 | 
						__serviceCache: false,
 | 
				
			||||||
 | 
					 | 
				
			||||||
	/**
 | 
					 | 
				
			||||||
	 * @var {Boolean} __serviceLock Specify whether the service is already in use or not
 | 
					 | 
				
			||||||
	 */
 | 
					 | 
				
			||||||
	__serviceLock: false,
 | 
					 | 
				
			||||||
	
 | 
						
 | 
				
			||||||
	/**
 | 
						/**
 | 
				
			||||||
	 * Initializate conversation service
 | 
						 * Initializate conversation service
 | 
				
			||||||
@@ -29,155 +19,9 @@ ComunicWeb.components.conversations.service = {
 | 
				
			|||||||
	 * @return {Boolean} True for a success
 | 
						 * @return {Boolean} True for a success
 | 
				
			||||||
	 */
 | 
						 */
 | 
				
			||||||
	init: function(){
 | 
						init: function(){
 | 
				
			||||||
 | 
					 | 
				
			||||||
		//Make sure the cache is empty
 | 
							//Make sure the cache is empty
 | 
				
			||||||
		this.emptyCache();
 | 
							this.emptyCache();
 | 
				
			||||||
 | 
					 | 
				
			||||||
		//Check if an interval already exists or not
 | 
					 | 
				
			||||||
		if(this.__intervalID)
 | 
					 | 
				
			||||||
			clearInterval(this.__intervalID); //Remove old interval
 | 
					 | 
				
			||||||
		
 | 
							
 | 
				
			||||||
		//Force the service to unlock
 | 
					 | 
				
			||||||
		this.__serviceLock = false;
 | 
					 | 
				
			||||||
		
 | 
					 | 
				
			||||||
		//Initializate interval
 | 
					 | 
				
			||||||
		this.__intervalID = setInterval(function(){
 | 
					 | 
				
			||||||
			ComunicWeb.components.conversations.service.call();
 | 
					 | 
				
			||||||
		}, 2000);
 | 
					 | 
				
			||||||
		ComunicWeb.common.cacheManager.registerInterval(this.__intervalID);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		//Success
 | 
					 | 
				
			||||||
		return true;
 | 
					 | 
				
			||||||
	},
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	/**
 | 
					 | 
				
			||||||
	 * Call this service
 | 
					 | 
				
			||||||
	 * 
 | 
					 | 
				
			||||||
	 * @return {Boolean} True for a success
 | 
					 | 
				
			||||||
	 */
 | 
					 | 
				
			||||||
	call: function(){
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		//Check if the conversation element still exists or not
 | 
					 | 
				
			||||||
		if(!byId("conversationsElem")){
 | 
					 | 
				
			||||||
			ComunicWeb.debug.logMessage("Conversation Service : Couldn't locate conversations element, unregistering service !");
 | 
					 | 
				
			||||||
			clearInterval(this.__intervalID);
 | 
					 | 
				
			||||||
			return false;
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		//Check at least one conversation is opened
 | 
					 | 
				
			||||||
		if(!this.__serviceCache){
 | 
					 | 
				
			||||||
			ComunicWeb.debug.logMessage("Conversation Service : task skipped : the service cache is empty (equals to false).");
 | 
					 | 
				
			||||||
			return false;
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		if(JSON.stringify(this.__serviceCache) == "{}"){
 | 
					 | 
				
			||||||
			ComunicWeb.debug.logMessage("Conversation Service : task skipped : the service cache is empty. (equals to {})");
 | 
					 | 
				
			||||||
			return false;
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		//Check if the service is locked or not
 | 
					 | 
				
			||||||
		if(this.__serviceLock){
 | 
					 | 
				
			||||||
			ComunicWeb.debug.logMessage("Conversation Service : task skipped : the service is locked.");
 | 
					 | 
				
			||||||
			return false;
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		//Lock service
 | 
					 | 
				
			||||||
		this.__serviceLock = true;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		//Perform service task
 | 
					 | 
				
			||||||
		this.performTask();
 | 
					 | 
				
			||||||
	},
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	/**
 | 
					 | 
				
			||||||
	 * Perform service task
 | 
					 | 
				
			||||||
	 *
 | 
					 | 
				
			||||||
	 * @return {Boolean} True for a success
 | 
					 | 
				
			||||||
	 */
 | 
					 | 
				
			||||||
	performTask: function(){
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		//Prepare interface request
 | 
					 | 
				
			||||||
		var newConversations = [];
 | 
					 | 
				
			||||||
		var conversationsToRefresh = {}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		//Process each conversation
 | 
					 | 
				
			||||||
		var i;
 | 
					 | 
				
			||||||
		for(i in this.__serviceCache){
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			//Extract conversation ID
 | 
					 | 
				
			||||||
			var processConversation = this.__serviceCache[i].conversationID;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			//Check if it is new conversation
 | 
					 | 
				
			||||||
			if(this.__serviceCache[i].last_message_id === 0)
 | 
					 | 
				
			||||||
				newConversations.push(processConversation);
 | 
					 | 
				
			||||||
			
 | 
					 | 
				
			||||||
			//Else perform a simple update of the conversation
 | 
					 | 
				
			||||||
			else {
 | 
					 | 
				
			||||||
				conversationsToRefresh["conversation-"+processConversation] = {
 | 
					 | 
				
			||||||
					last_message_id: this.__serviceCache[i].last_message_id,
 | 
					 | 
				
			||||||
				};
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		//Perform a request on the interface
 | 
					 | 
				
			||||||
		ComunicWeb.components.conversations.interface.refreshConversations(
 | 
					 | 
				
			||||||
			newConversations,
 | 
					 | 
				
			||||||
			conversationsToRefresh,
 | 
					 | 
				
			||||||
			function(result){
 | 
					 | 
				
			||||||
				//Call callback function
 | 
					 | 
				
			||||||
				ComunicWeb.components.conversations.service.callback(result);
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
		);
 | 
					 | 
				
			||||||
		
 | 
					 | 
				
			||||||
		//Success
 | 
					 | 
				
			||||||
		return true;
 | 
					 | 
				
			||||||
	},
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	/**
 | 
					 | 
				
			||||||
	 * Service callback function
 | 
					 | 
				
			||||||
	 * 
 | 
					 | 
				
			||||||
	 * @param {Object} result The result of the request
 | 
					 | 
				
			||||||
	 * @return {Boolean} True for a success
 | 
					 | 
				
			||||||
	 */
 | 
					 | 
				
			||||||
	callback: function(result){
 | 
					 | 
				
			||||||
		
 | 
					 | 
				
			||||||
		//Check for errors
 | 
					 | 
				
			||||||
		if(result.error){
 | 
					 | 
				
			||||||
			ComunicWeb.debug.logMessage("Conversations Service : Couldn't update conversations !");
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			//Display a notification
 | 
					 | 
				
			||||||
			ComunicWeb.common.notificationSystem.showNotification("An error occured while trying to refresh conversations system !", "danger", 1.5);
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		else {
 | 
					 | 
				
			||||||
			//We can continue with the result
 | 
					 | 
				
			||||||
			//Process each conversation
 | 
					 | 
				
			||||||
			var i;
 | 
					 | 
				
			||||||
			for(i in result){
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
				//Check if new entries are available
 | 
					 | 
				
			||||||
				if(result[i].length === 0 || !this.__serviceCache[i])
 | 
					 | 
				
			||||||
					continue; //Nothing to be done
 | 
					 | 
				
			||||||
				
 | 
					 | 
				
			||||||
				//Extract conversation ID
 | 
					 | 
				
			||||||
				var conversationID = this.__serviceCache[i].conversationID;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
				//Extract conversation ID
 | 
					 | 
				
			||||||
				var messages = result[i];
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
				//We update first and last message ID with the last message ID
 | 
					 | 
				
			||||||
				if(messages[0].ID < this.__serviceCache[i].first_message_id || this.__serviceCache[i].first_message_id == 0)
 | 
					 | 
				
			||||||
					this.__serviceCache[i].first_message_id = messages[0].ID;
 | 
					 | 
				
			||||||
				this.__serviceCache[i].last_message_id = messages[messages.length-1].ID;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
				//We process each message by calling chat windows script to ask it to add messages
 | 
					 | 
				
			||||||
				var j;
 | 
					 | 
				
			||||||
				for(j in messages)
 | 
					 | 
				
			||||||
					ComunicWeb.components.conversations.chatWindows.addMessage(conversationID, messages[j]);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		//Unlock service
 | 
					 | 
				
			||||||
		this.__serviceLock = false;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		//Success
 | 
							//Success
 | 
				
			||||||
		return true;
 | 
							return true;
 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
@@ -188,21 +32,33 @@ ComunicWeb.components.conversations.service = {
 | 
				
			|||||||
	 * @param {Integer} conversationID The ID of the conversation to register
 | 
						 * @param {Integer} conversationID The ID of the conversation to register
 | 
				
			||||||
	 * @return {Boolean} True for a success
 | 
						 * @return {Boolean} True for a success
 | 
				
			||||||
	 */
 | 
						 */
 | 
				
			||||||
	registerConversation: function(conversationID){
 | 
						registerConversation: async function(conversationID){
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		//Create conversation object
 | 
							try {
 | 
				
			||||||
		if(!this.__serviceCache)
 | 
					 | 
				
			||||||
			this.__serviceCache = {}; //Create service cache object
 | 
					 | 
				
			||||||
		
 | 
					 | 
				
			||||||
		//Register conversation
 | 
					 | 
				
			||||||
		this.__serviceCache['conversation-' + conversationID] = {
 | 
					 | 
				
			||||||
			conversationID: conversationID,
 | 
					 | 
				
			||||||
			first_message_id: 0,
 | 
					 | 
				
			||||||
			last_message_id: 0,
 | 
					 | 
				
			||||||
		};
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
		//Success
 | 
								//Create conversation object
 | 
				
			||||||
		return true;
 | 
								if(!this.__serviceCache)
 | 
				
			||||||
 | 
									this.__serviceCache = {}; //Create service cache object
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								// Get the last messages of the conversations
 | 
				
			||||||
 | 
								const list = await ComunicWeb.components.conversations.interface.asyncRefreshSingle(conversationID, 0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								//Register conversation locally
 | 
				
			||||||
 | 
								this.__serviceCache['conversation-' + conversationID] = {
 | 
				
			||||||
 | 
									conversationID: conversationID,
 | 
				
			||||||
 | 
									first_message_id: list.length == 0 ? 0 : list[0].ID,
 | 
				
			||||||
 | 
								};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								// Register conversation remotly
 | 
				
			||||||
 | 
								await ComunicWeb.components.conversations.interface.register(conversationID)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								for(const msg of list)
 | 
				
			||||||
 | 
									ComunicWeb.components.conversations.chatWindows.addMessage(conversationID, msg);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							} catch(e) {
 | 
				
			||||||
 | 
								console.error(e);
 | 
				
			||||||
 | 
								notify("Could not open conversation!", "danger");
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/**
 | 
						/**
 | 
				
			||||||
@@ -211,19 +67,17 @@ ComunicWeb.components.conversations.service = {
 | 
				
			|||||||
	 * @param {Integer} conversationID The ID of the conversation to remove
 | 
						 * @param {Integer} conversationID The ID of the conversation to remove
 | 
				
			||||||
	 * @return {Boolean} True for a success
 | 
						 * @return {Boolean} True for a success
 | 
				
			||||||
	 */
 | 
						 */
 | 
				
			||||||
	unregisterConversation: function(conversationID){
 | 
						unregisterConversation: async function(conversationID){
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		//Log action
 | 
							//Log action
 | 
				
			||||||
		ComunicWeb.debug.logMessage("Unregistering conversation " + conversationID + " from service.");
 | 
							ComunicWeb.debug.logMessage("Unregistering conversation " + conversationID + " from service.");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		if(this.__serviceCache){
 | 
							if(this.__serviceCache && this.__serviceCache['conversation-'+conversationID]){
 | 
				
			||||||
			if(this.__serviceCache['conversation-'+conversationID]){
 | 
								delete this.__serviceCache['conversation-'+conversationID]; //Remove conversation
 | 
				
			||||||
				delete this.__serviceCache['conversation-'+conversationID]; //Remove conversation
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		//Success
 | 
							// Unregister remotly
 | 
				
			||||||
		return true;
 | 
							await ComunicWeb.components.conversations.interface.unregister(conversationID)
 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/**
 | 
						/**
 | 
				
			||||||
@@ -271,13 +125,11 @@ ComunicWeb.components.conversations.service = {
 | 
				
			|||||||
			clearObject(this.__serviceCache);
 | 
								clearObject(this.__serviceCache);
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		//Unlock service
 | 
					 | 
				
			||||||
		this.__serviceLock = false;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		//Success
 | 
							//Success
 | 
				
			||||||
		return true;
 | 
							return true;
 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
//Register service cache
 | 
					//Register service cache
 | 
				
			||||||
ComunicWeb.common.cacheManager.registerCacheCleaner("ComunicWeb.components.conversations.service.emptyCache");
 | 
					ComunicWeb.common.cacheManager.registerCacheCleaner("ComunicWeb.components.conversations.service.emptyCache");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user