import config from "@/config"; import { bus } from "../../main"; import { router } from "./../../router"; import Vue from "vue"; import DesktopNotification from "@/utils/ElectronJS/DesktopNotification"; import isElectron from "@/utils/ElectronJS/isElectron"; import { isMobile } from "@/utils/Mobile"; const state = {}; const actions = { socket_authErr(context) { context.dispatch("logout"); router.push({ path: "/" }); }, socket_connect() { this._vm.$socket.emit("authentication", { token: localStorage.getItem("hauthid") }); }, socket_error(context, error) { // if the token is invalid. if (error === "Authentication error") { context.dispatch("logout"); router.push({ path: "/" }); } }, socket_success(context, data) { const { message, user, serverMembers, dms, notifications, currentFriendStatus, settings } = data; const friendsArr = user.friends; const presence = {}; const friendObj = {}; const memberObj = {}; if (friendsArr) { for (let friend of friendsArr) { const member = friend.recipient; delete friend.recipient; friend.uniqueID = member.uniqueID; friendObj[member.uniqueID] = friend; memberObj[member.uniqueID] = member; } } if (currentFriendStatus) { for (const _presence of currentFriendStatus) { presence[_presence[0]] = _presence[1]; } } context.dispatch("members/addPresences", presence); context.dispatch("members/addMembers", memberObj); // const friendsArray = user.friends; // const friendObject = {}; // // convert array into object and add online status. // if(friendsArray !== undefined && friendsArray.length >=1) { // for (let index = 0; index < friendsArray.length; index++) { // const element = friendsArray[index]; // if (element.recipient) { // friendObject[element.recipient.uniqueID] = element; // for (let currentFriendStatus of currentFriendStatus){ // console.log(currentFriendStatus[0], currentFriendStatus[1]) // if(currentFriendStatus[0] == element.recipient.uniqueID){ // friendObject[element.recipient.uniqueID].recipient.status = currentFriendStatus[1] // } // } // } // } // } let servers = user.servers || []; if (settings.server_position) { // sort server by users order let tempServers = [...servers]; let sortedServers = []; for (let index = 0; index < settings.server_position.length; index++) { const server_id = settings.server_position[index]; const findIndex = tempServers.findIndex((s) => s.server_id == server_id ); if (tempServers[findIndex]) { sortedServers = [...sortedServers, ...[tempServers[findIndex]]]; tempServers.splice(findIndex, 1) } } servers = [...sortedServers.reverse(), ...tempServers]; sortedServers = null; tempServers = null; delete settings.server_position; } // sort server channels by user order. servers.map(s => { if(!s.channel_position) return s; let tempServerChannels = [...s.channels]; let sortedServerChannels = []; for (let index = 0; index < s.channel_position.length; index++) { const channelID = s.channel_position[index]; const findIndex = tempServerChannels.findIndex((c) => c.channelID == channelID ); if (tempServerChannels[findIndex]) { sortedServerChannels = [...sortedServerChannels, ...[tempServerChannels[findIndex]]]; tempServerChannels.splice(findIndex, 1) } } s.channels = [...sortedServerChannels, ...tempServerChannels]; tempServerChannels = null; sortedServerChannels = null; delete s.channel_position; return s; }) //convert array to object for servers servers = servers.reduce((obj, item) => { item.channels.forEach(element => { element.server = undefined; element._id = undefined; element.__v = undefined; element.server_id = item.server_id; context.dispatch("channel", element); context.dispatch("servers/AddChannelsIDs", { serverID: item.server_id, channelsIDs: [element.channelID] }); }); item.channels = undefined; obj[item.server_id] = item; return obj; }, {}); context.dispatch("servers/setServers", servers); data.user.servers = undefined; data.user.friends = friendObj; context.commit("user", data.user); //server members let serverMembersArr = []; let membersObj = {}; for (let serverMember of serverMembers) { const member = serverMember.member; delete serverMember.member; serverMember.uniqueID = member.uniqueID; serverMembersArr.push(serverMember); membersObj[member.uniqueID] = member; } context.dispatch("members/addMembers", membersObj); context.dispatch("servers/addServerMembers", serverMembersArr); // convert dms array to object const channelsObject = {}; if (dms && dms.length >= 1) { for (let channel of dms) { channelsObject[channel.channelID] = channel; } } context.commit("addAllChannels", channelsObject); context.dispatch("addAllNotifications", notifications); context.dispatch("settingsModule/setSettings", settings); }, socket_relationshipAdd(context, friend) { const member = friend.recipient; delete friend.recipient; friend.uniqueID = member.uniqueID; context.dispatch("members/updatePresence", { uniqueID: member.uniqueID, status: member.status }); delete member.status; context.dispatch("members/addMember", member); context.commit("addFriend", friend); }, socket_relationshipAccept(context, uniqueID) { context.commit("acceptFriend", uniqueID); }, socket_relationshipRemove(context, uniqueID) { context.commit("removeFriend", uniqueID); }, socket_receiveMessage(context, data) { if (data.message.type === 1) { if (context.getters.user.uniqueID === data.message.creator.uniqueID){ return; } } if (context.getters.channels[data.message.channelID]) { context.dispatch("updateChannelLastMessage", data.message.channelID); } if (context.getters.messages[data.message.channelID]) { context.dispatch("addMessage", { message: data.message, channelID: data.message.channelID, tempID: data.tempID }); } const currentTab = context.rootGetters.currentTab; if ( context.rootState.channelModule.selectedChannelID == data.message.channelID && document.hasFocus() && (currentTab === 1 || currentTab === 2) ) { this._vm.$socket.emit("notification:dismiss", { channelID: data.message.channelID }); } else { // send notification if other users message the recipient if (data.message.creator.uniqueID === context.getters.user.uniqueID) return; bus.$emit( "title:change", data.message.creator.username + " sent a message." ); desktopNotification(); } const notification = { channelID: data.message.channelID, lastMessageID: data.message.messageID, sender: data.message.creator }; context.dispatch("messageCreatedNotification", notification); function desktopNotification() { // send desktop notification const channel = context.getters.channels[data.message.channelID]; const disableDesktopNotification = context.rootGetters["settingsModule/settings"].notification .disableDesktopNotification; if (isMobile()) return; if (isElectron && disableDesktopNotification === undefined) return sendNotification(); if ( disableDesktopNotification !== undefined && disableDesktopNotification === false ) return sendNotification(); function sendNotification() { if (channel && channel.server_id) { const server = context.getters["servers/servers"][channel.server_id]; DesktopNotification.serverMessage({ serverName: server.name, channelName: channel.name, username: data.message.creator.username, avatarURL: config.domain + "/avatars/" + server.avatar, message: data.message.message }); } else { DesktopNotification.directMessage({ username: data.message.creator.username, avatarURL: config.domain + "/avatars/" + data.message.creator.avatar, message: data.message.message }); } } } }, socket_userStatusChange(context, data) { if (context.rootState.user.user.uniqueID === data.uniqueID) return; context.dispatch("members/updatePresence", { uniqueID: data.uniqueID, status: data.status }); }, socket_multiDeviceStatus(context, data) { context.commit("changeStatus", data.status); }, socket_disconnect(context) { context.commit("user", null); }, socket_multiDeviceUserAvatarChange(context, data) { context.commit("changeAvatar", data.avatarID); }, socket_userAvatarChange(context, data) { context.commit("members/updateAvatar", data); }, ["socket_updateMember"](context, data) { if (context.rootGetters.user.uniqueID === data.uniqueID) { context.dispatch("updateUser", data); } }, ["socket_channel:created"](context, data) { const { channel } = data; // rename to 'channel' to setChannel context.dispatch("channel", channel); }, ["socket_notification:dismiss"](context, data) { const { channelID } = data; context.dispatch("dismissNotification", channelID); }, ["socket_googleDrive:linked"](context) { context.dispatch("setPopoutVisibility", { name: "GDLinkMenu", visibility: false }); context.dispatch("settingsModule/setGDriveLinked", true); }, ["socket_customEmoji:uploaded"](context, emoji) { context.dispatch("settingsModule/addCustomEmoji", emoji); }, ["socket_customEmoji:remove"](context, emoji) { context.dispatch("settingsModule/removeCustomEmoji", emoji); }, ["socket_customEmoji:rename"](context, emoji) { context.dispatch("settingsModule/renameCustomEmoji", emoji); }, ["socket_survey:completed"](context) { context.dispatch("surveyCompleted"); }, ["socket_server:joined"](context, server) { context.dispatch("servers/setServer", server); let channels = server.channels; // sort server channels by order if(server.channel_position) { let tempServerChannels = [...channels]; let sortedServerChannels = []; for (let index = 0; index < server.channel_position.length; index++) { const channelID = server.channel_position[index]; const findIndex = tempServerChannels.findIndex((c) => c.channelID == channelID ); if (tempServerChannels[findIndex]) { sortedServerChannels = [...sortedServerChannels, ...[tempServerChannels[findIndex]]]; tempServerChannels.splice(findIndex, 1) } } channels = [...sortedServerChannels, ...tempServerChannels]; tempServerChannels = null; sortedServerChannels = null; delete server.channel_position; } for (let index = 0; index < channels.length; index++) { const element = channels[index]; element.server = undefined; element.server_id = server.server_id; context.dispatch("channel", element); context.dispatch("servers/AddChannelsIDs", { serverID: server.server_id, channelsIDs: [element.channelID] }); } if (!server.socketID) return; if (this._vm.$socket.id !== server.socketID) return; const defaultChannel = channels.find( c => c.channelID === server.default_channel_id ); context.dispatch("setCurrentTab", 2, { root: true }); context.dispatch("servers/setSelectedServerID", server.server_id, { root: true }); context.dispatch("openChannel", defaultChannel, { root: true }); }, ["socket_server:leave"](context, { server_id }) { const lastSelectedChannel = JSON.parse( localStorage.getItem("selectedChannels") || "{}" ); if (lastSelectedChannel[server_id]) { delete lastSelectedChannel[server_id]; localStorage.setItem( "selectedChannels", JSON.stringify(lastSelectedChannel) ); } // check if server channel selected const serverChannelIDs = context.rootState.servers.channelsIDs[server_id]; const selectedChannelID = context.rootState.channelModule.selectedChannelID; const serverChannelID = context.rootState.channelModule.serverChannelID; const serverID = context.rootState.servers.selectedServerID; if (serverChannelIDs.includes(selectedChannelID)) { context.dispatch("selectedChannelID", null); } if (serverChannelIDs.includes(serverChannelID)) { context.dispatch("setServerChannelID", null); } if (serverID === server_id) { context.dispatch("servers/setSelectedServerID", null); } context.dispatch("servers/removePresences", server_id); context.dispatch("servers/removeServer", server_id); context.dispatch("servers/removeNotifications", server_id); context.dispatch("servers/removeAllServerChannels", server_id); context.dispatch("deleteAllMessages", serverChannelIDs); }, ["socket_server:memberAdd"](context, { serverMember, presence }) { // member_add let sm = Object.assign({}, serverMember); const member = sm.member; delete sm.member; sm.uniqueID = member.uniqueID; context.dispatch("members/updatePresence", { uniqueID: member.uniqueID, status: presence }); context.dispatch("members/addMember", member); context.dispatch("servers/addServerMember", sm); }, ["socket_server:memberRemove"](context, { uniqueID, server_id }) { // member_remove context.dispatch("servers/removeServerMember", { uniqueID, server_id }); }, ["socket_server:members"](context, { serverMembers, memberPresences }) { // members let serverMembersArr = []; let members = {}; for (let serverMember of serverMembers) { const member = serverMember.member; delete serverMember.member; serverMember.uniqueID = member.uniqueID; serverMembersArr.push(serverMember); members[member.uniqueID] = member; } context.dispatch("members/addMembers", members); context.dispatch("servers/addServerMembers", serverMembers); let presences = {}; for (const _presence of memberPresences) { presences[_presence[0]] = _presence[1]; } context.dispatch("members/addPresences", presences); }, ["socket_server:addChannel"](context, { channel }) { // add_channel context.dispatch("channel", channel); context.dispatch("servers/AddChannelsIDs", { serverID: channel.server_id, channelsIDs: [channel.channelID] }); }, ["socket_server:updateChannel"](context, update) { // update_channel context.dispatch("updateChannel", update); }, ["socket_server:removeChannel"](context, { server_id, channelID }) { context.dispatch("servers/removeServerChannel", { server_id, channelID }); context.dispatch("dismissNotification", channelID); }, ["socket_server:updateServer"](context, data) { context.dispatch("servers/updateServer", { server_id: data.server_id, server: data }); }, ["socket_updateMessage"](context, data) { context.dispatch("updateMessage", { channelID: data.channelID, messageID: data.messageID, message: data }); }, ["socket_deleteMessage"](context, { channelID, messageID }) { context.dispatch("deleteMessage", { channelID, messageID }); }, ["socket_self:serverPosition"](context, {server_position}) { const servers = context.rootGetters['servers/servers']; let serverSorted = {}; for (let index = 0; index < server_position.length; index++) { const server_id = server_position[index]; serverSorted = { ...{[server_id]: servers[server_id]}, ...serverSorted}; } context.dispatch("servers/setServers", serverSorted); }, ["socket_server:channelPosition"](context, {serverID, channel_position}) { context.dispatch("servers/setChannelIDs", {serverID, channelIDs: channel_position}) } }; export default { namespace: true, actions };