|
|
@ -1,34 +1,61 @@ |
|
|
import { AppDispatch } from "app/store"; |
|
|
import { AppDispatch } from "app/store"; |
|
|
import { userGetAll, userSetAll } from "modules/user/slice"; |
|
|
|
|
|
|
|
|
import { |
|
|
|
|
|
UserState, |
|
|
|
|
|
UserStatus, |
|
|
|
|
|
userGetAll, |
|
|
|
|
|
userSetAll, |
|
|
|
|
|
} from "modules/user/slice"; |
|
|
import { SocketMessage, SocketMessageMiddleware } from "modules/socket/message"; |
|
|
import { SocketMessage, SocketMessageMiddleware } from "modules/socket/message"; |
|
|
|
|
|
|
|
|
function userListRequest(): SocketMessage { |
|
|
function userListRequest(): SocketMessage { |
|
|
return "UserListRequest"; |
|
|
return "UserListRequest"; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
// TODO: Adapt to new response format.
|
|
|
|
|
|
function handleUserListResponse(dispatch: AppDispatch, outerFields: any[]) { |
|
|
|
|
|
if (outerFields.length !== 1) { |
|
|
|
|
|
console.log("UserListResponse has wrong number of fields:", outerFields); |
|
|
|
|
|
return; |
|
|
|
|
|
|
|
|
function convertUserStatus(s: string): UserStatus { |
|
|
|
|
|
switch (s) { |
|
|
|
|
|
case "Offline": |
|
|
|
|
|
return UserStatus.Offline; |
|
|
|
|
|
case "Away": |
|
|
|
|
|
return UserStatus.Away; |
|
|
|
|
|
case "Online": |
|
|
|
|
|
return UserStatus.Online; |
|
|
|
|
|
default: |
|
|
|
|
|
throw new TypeError(`invalid user status ${s}`); |
|
|
} |
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
function convertUserListEntry(entry: any): UserState { |
|
|
|
|
|
return { |
|
|
|
|
|
name: entry.user_name, |
|
|
|
|
|
status: convertUserStatus(entry.status), |
|
|
|
|
|
averageSpeed: entry.average_speed, |
|
|
|
|
|
numDownloads: entry.num_downloads, |
|
|
|
|
|
numFiles: entry.num_files, |
|
|
|
|
|
numFolders: entry.num_folders, |
|
|
|
|
|
numFreeSlots: entry.num_free_slots, |
|
|
|
|
|
country: entry.country, |
|
|
|
|
|
}; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
const { users } = outerFields[0]; |
|
|
|
|
|
|
|
|
function handleUserListResponse(dispatch: AppDispatch, response: any): void { |
|
|
|
|
|
const { users } = response; |
|
|
if (users === undefined) { |
|
|
if (users === undefined) { |
|
|
console.log("UserListResponse field has wrong shape:", outerFields[0]); |
|
|
|
|
|
|
|
|
console.log("UserListResponse has wrong shape:", response); |
|
|
return; |
|
|
return; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
dispatch(userSetAll(users)); |
|
|
|
|
|
|
|
|
const payload = []; |
|
|
|
|
|
for (const [name, user] of users) { |
|
|
|
|
|
payload.push(convertUserListEntry(user)); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
dispatch(userSetAll(payload)); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
export const userSocketMessageMiddleware: SocketMessageMiddleware = { |
|
|
export const userSocketMessageMiddleware: SocketMessageMiddleware = { |
|
|
// TODO: Adapt to new response format.
|
|
|
|
|
|
handleMessage: (dispatch, { variant, fields }) => { |
|
|
|
|
|
switch (variant) { |
|
|
|
|
|
case "UserListResponse": |
|
|
|
|
|
handleUserListResponse(dispatch, fields); |
|
|
|
|
|
break; |
|
|
|
|
|
|
|
|
handleMessage: (dispatch, message) => { |
|
|
|
|
|
if ("UserListResponse" in message) { |
|
|
|
|
|
handleUserListResponse(dispatch, message["UserListResponse"]); |
|
|
} |
|
|
} |
|
|
}, |
|
|
}, |
|
|
|
|
|
|
|
|
|