import axios from 'axios'; import $ from 'jquery'; import { isNumber } from 'lodash'; import { TemplateEngine } from '../hwe/ts/util/TemplateEngine'; import { InvalidResponse } from '../hwe/ts/defs'; import { setAxiosXMLHttpRequest } from '../hwe/ts/util/setAxiosXMLHttpRequest'; import { unwrap_any } from '../hwe/ts/util/unwrap_any'; import { convertFormData } from '../hwe/ts/util/convertFormData'; import { exportWindow } from './util/exportWindow'; type UserEntry = { userID: string, userName: string, email: string, authType: string | null, userGrade: number, blockUntil: string | null, nickname: string, icon: string, joinDate: string, loginDate: string, deleteAfter: string | null, } type UserListResponse = { result: true, users: UserEntry[], servers: string[], allowJoin: boolean, allowLogin: boolean, } const userFrame = '\ \ <%userID%>\ <%userName%>\ <%emailFunc(email)%>
(<%authType%>)\ <%userGradeText%>

<%shortDate(blockUntil)%>

\ <%nickname%>\ \ <%slotGeneralList%>\ <%shortDate(joinDate)%>\ <%shortDate(loginDate)%>\ <%shortDate(deleteAfter)%>\ \
\ \ \ \ \ \
\ \ '; function convUserGrade(grade: number): string { const userGradeMap = { 0: '차단', 1: '일반', 4: '특별', 5: '부운영자', 6: '운영자' }; if (grade in userGradeMap) { return userGradeMap[grade as (keyof typeof userGradeMap)]; } return grade.toString(); } function fillAllowJoinLogin(result: UserListResponse) { if (result.allowJoin) { $('#allow_join_y').trigger('click'); } else { $('#allow_join_n').trigger('click'); } if (result.allowLogin) { $('#allow_login_y').trigger('click'); } else { $('#allow_login_n').trigger('click'); } } function fillUserList(result: UserListResponse) { const $user_list = $('#user_list'); $user_list.empty(); const slotGeneralList = $.map(result.servers, function (value) { return ``; }).join('
'); const emailFunc = function (text: string) { return String(text).replace('@', '@
'); } const brFunc = function (text: string) { return String(text).split(' ').join('
'); }; const shortDateFunc = function (date: string | null) { if (!date) { return '-'; } return brFunc(date.substr(2)); } $.each(result.users, function (idx, user) { const templateItem = { ...user, email: user.email ?? '-', br: brFunc, shortDate: shortDateFunc, emailFunc: emailFunc, slotGeneralList: slotGeneralList, userGradeText: convUserGrade(user.userGrade), } $user_list.append( TemplateEngine(userFrame, templateItem) ) }); //TODO: slotGeneralList에 값을 채워야함. ajax로 받아올 필요 있음 } async function changeSystem(action: string, param?: string): Promise { const text = `${action}${param ? (', ' + param) : ''}을 진행합니다.`; if (!confirm(text)) { return; } let result: InvalidResponse | { result: true, affected?: number, }; try { const response = await axios({ url: 'j_set_userlist.php', method: 'post', responseType: 'json', data: convertFormData({ 'action': action, 'param': param ?? null }) }) result = response.data; } catch (e) { console.error(e); alert(`실패했습니다: ${e}`); return; } if (!result.result) { alert(result.reason); return; } if (result.affected) { alert(`${result.affected}건이 처리되었습니다.`); await refreshAll(); } else { alert('완료되었습니다.'); } } async function changeUserStatus(action: string, userID: Element | number, param?: number): Promise { if (userID instanceof Element) { userID = parseInt($(userID).parents('tr').data('id')); } if (!isNumber(userID)) { alert('userID가 올바르게 지정되지 않았습니다!'); return; } if (action == 'set_userlevel') { if (!isNumber(param)) { param = parseInt(prompt('원하는 등급을 입력해주세요.(1:일반, 4:특별, 5:부운영자, 6:운영자)', '1') ?? '0'); } if (param < 1 || param > 6) { alert('올바르지 않습니다.'); return; } } if (action == 'block') { if (!isNumber(param)) { param = parseInt(prompt('블록 기간을 입력해주세요. <= 0은 반영구(50년)입니다.', '7') ?? '7'); } } const userName = unwrap_any($('#userinfo_' + userID).data('username')); const text = `${userName}에 대해서 ${action}${param ? (', ' + param) : ''}을 진행합니다.`; if (!confirm(text)) { return; } let result: InvalidResponse | { result: true, detail?: string, }; try { const response = await axios({ url: 'j_set_userlist.php', method: 'post', responseType: 'json', data: convertFormData({ 'action': action, 'user_id': userID, 'param': param ?? null }) }) result = response.data; } catch (e) { console.error(e); alert(`실패했습니다: ${e}`); return; } if (!result.result) { alert(result.reason); return; } if (result.detail) { alert(`완료되었습니다: ${result.detail}`); } else { alert('완료되었습니다.'); } await refreshAll(); } async function refreshAll() { let result: InvalidResponse | UserListResponse; try { const response = await axios({ url: 'j_get_userlist.php', method: 'post', responseType: 'json', }); result = response.data; } catch (e) { console.error(e); alert(`실패했습니다: ${e}`); return; } if (!result.result) { alert(result.reason); return; } fillAllowJoinLogin(result); fillUserList(result); } $(async function () { setAxiosXMLHttpRequest(); await refreshAll(); $('input[name=allow_join], input[name=allow_login]').on('change', async function () { const $this = $(this); await changeSystem(unwrap_any($this.attr('name')), unwrap_any($this.val())); }) }); exportWindow(changeSystem, 'changeSystem'); exportWindow(changeUserStatus, 'changeUserStatus');