Skip to content

Instantly share code, notes, and snippets.

@ltlapy
Last active February 20, 2024 02:20
Show Gist options
  • Save ltlapy/f43ac71690cce22b1a4603ff7fdc89f5 to your computer and use it in GitHub Desktop.
Save ltlapy/f43ac71690cce22b1a4603ff7fdc89f5 to your computer and use it in GitHub Desktop.
특정 시점 이전의 계정을 벌크 삭제하는 관리자용 스크립트
let host = 'example.com'
let timeBefore_timestamp = '2100-12-31T23:59:59.999Z'
// ----
var offset = 0
var accounts = []
let timeBefore = Date:parse(timeBefore_timestamp)
<: `{host} 의 계정을 탐색합니다...`
loop {
let res = Mk:api('admin/show-users', {
hostname: host,
limit: 30,
offset: offset,
sort: '+createdAt',
state: 'all'
})
if (res.len == 0) break
if (accounts.len == 0) {
// 해당 시점의 계정을 탐색
each(let account, res) {
if (Date:parse(account.createdAt) < timeBefore) {
accounts.push(account)
}
}
} else {
// 응답의 모든 계정이 주어진 시점의 이전 계정이라고 간주
accounts = accounts.concat(res)
offset = offset + res.len
}
if ((offset % 100) == 0) {
<: `{offset} 번째 계정을 탐색했습니다. 계속해서 탐색합니다... ({accounts.len})`
}
}
<: `조건에 일치하는 계정이 {accounts.len}개 발견되었습니다`
each(let account, accounts) {
<: `{account.id} : @{account.username}@{account.host}`
}
let warning = [
`{accounts.len} 개의 계정을 찾았습니다.`,
`마지막으로 생성된 계정은 @{accounts[0].username}@{accounts[0].host}이며,`
`최초로 생성된 계정은 @{accounts[accounts.len-1].username}@{accounts[accounts.len-1].host} 입니다.`
`해당 범위의 계정을 모두 삭제하시겠습니까?`
].join(Str:lf)
let warning_additional = [
`**제어판과 비교하여 삭제되는 계정의 범위가 기대와 일치하는 지 반드시 비교하십시오.**`
'확인을 누르는 즉시 해당 범위에 대한 삭제 명령이 발동되며, 이는 **취소할 수 없습니다.**'
'---'
''
].join(Str:lf)
if (Mk:confirm('탐색 완료', warning) == true) {
if (Mk:confirm('마지막 경고입니다', `{warning_additional}{warning}`, 'warning') == true) {
<: '요청에 따라 삭제를 실행합니다. 취소할 수 없습니다.'
each(let account, accounts) {
Mk:api('admin/accounts/delete', {
userId: account.id
})
<: `{account.id} : @{account.username}@{account.host}`
}
<: `{accounts.len}개의 계정 삭제 요청을 보냈습니다`
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment