summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authordakkar <dakkar@thenautilus.net>2024-10-18 22:00:07 +0100
committerdakkar <dakkar@thenautilus.net>2024-10-18 22:00:07 +0100
commit52e291af67e6cbfa4ac338e02c8beb6dfd7e113a (patch)
tree5454b299a585b9d423b4a9e421debd0069b7151f
parentadd scripts to run eslint on all packages (diff)
parentmerge: Free up Usernames after deny/decline (!696) (diff)
downloadsharkey-52e291af67e6cbfa4ac338e02c8beb6dfd7e113a.tar.gz
sharkey-52e291af67e6cbfa4ac338e02c8beb6dfd7e113a.tar.bz2
sharkey-52e291af67e6cbfa4ac338e02c8beb6dfd7e113a.zip
Merge branch 'develop' into feature/2024.9.0
-rw-r--r--locales/en-US.yml1
-rw-r--r--locales/index.d.ts4
-rw-r--r--locales/ja-JP.yml1
-rw-r--r--packages/backend/src/server/api/EndpointsModule.ts4
-rw-r--r--packages/backend/src/server/api/endpoints.ts2
-rw-r--r--packages/backend/src/server/api/endpoints/admin/decline-user.ts75
-rw-r--r--packages/backend/src/types.ts6
-rw-r--r--packages/frontend/src/components/SkApprovalUser.vue18
-rw-r--r--packages/frontend/src/pages/admin/modlog.ModLog.vue2
-rw-r--r--packages/frontend/src/pages/settings/general.vue3
-rw-r--r--packages/frontend/src/store.ts4
-rw-r--r--packages/frontend/src/ui/_common_/common.vue11
-rw-r--r--packages/misskey-js/etc/misskey-js.api.md9
-rw-r--r--packages/misskey-js/src/autogen/apiClientJSDoc.ts11
-rw-r--r--packages/misskey-js/src/autogen/endpoint.ts2
-rw-r--r--packages/misskey-js/src/autogen/entities.ts1
-rw-r--r--packages/misskey-js/src/autogen/types.ts61
-rw-r--r--packages/misskey-js/src/consts.ts6
-rw-r--r--packages/misskey-js/src/entities.ts3
19 files changed, 206 insertions, 18 deletions
diff --git a/locales/en-US.yml b/locales/en-US.yml
index 90ce449e74..427cd8a2a6 100644
--- a/locales/en-US.yml
+++ b/locales/en-US.yml
@@ -1229,6 +1229,7 @@ refreshing: "Refreshing..."
pullDownToRefresh: "Pull down to refresh"
disableStreamingTimeline: "Disable real-time timeline updates"
useGroupedNotifications: "Display grouped notifications"
+allowClickingNotifications: "Allow clicking on pop-up notifications"
signupPendingError: "There was a problem verifying the email address. The link may have expired."
cwNotationRequired: "If \"Hide content\" is enabled, a description must be provided."
doReaction: "Add reaction"
diff --git a/locales/index.d.ts b/locales/index.d.ts
index f27793b860..89a929d054 100644
--- a/locales/index.d.ts
+++ b/locales/index.d.ts
@@ -4944,6 +4944,10 @@ export interface Locale extends ILocale {
*/
"useGroupedNotifications": string;
/**
+ * ポップアップ通知のクリックを許可する
+ */
+ "allowClickingNotifications": string;
+ /**
* メールアドレスの確認中に問題が発生しました。リンクの有効期限が切れている可能性があります。
*/
"signupPendingError": string;
diff --git a/locales/ja-JP.yml b/locales/ja-JP.yml
index 4d22aa87d1..04ff7982ad 100644
--- a/locales/ja-JP.yml
+++ b/locales/ja-JP.yml
@@ -1231,6 +1231,7 @@ refreshing: "リロード中"
pullDownToRefresh: "引っ張ってリロード"
disableStreamingTimeline: "タイムラインのリアルタイム更新を無効にする"
useGroupedNotifications: "通知をグルーピングして表示する"
+allowClickingNotifications: "ポップアップ通知のクリックを許可する"
signupPendingError: "メールアドレスの確認中に問題が発生しました。リンクの有効期限が切れている可能性があります。"
cwNotationRequired: "「内容を隠す」がオンの場合は注釈の記述が必要です。"
doReaction: "リアクションする"
diff --git a/packages/backend/src/server/api/EndpointsModule.ts b/packages/backend/src/server/api/EndpointsModule.ts
index 6d70f35883..2ff07b2679 100644
--- a/packages/backend/src/server/api/EndpointsModule.ts
+++ b/packages/backend/src/server/api/EndpointsModule.ts
@@ -79,6 +79,7 @@ import * as ep___admin_silenceUser from './endpoints/admin/silence-user.js';
import * as ep___admin_unsilenceUser from './endpoints/admin/unsilence-user.js';
import * as ep___admin_suspendUser from './endpoints/admin/suspend-user.js';
import * as ep___admin_approveUser from './endpoints/admin/approve-user.js';
+import * as ep___admin_declineUser from './endpoints/admin/decline-user.js';
import * as ep___admin_unsuspendUser from './endpoints/admin/unsuspend-user.js';
import * as ep___admin_updateMeta from './endpoints/admin/update-meta.js';
import * as ep___admin_deleteAccount from './endpoints/admin/delete-account.js';
@@ -479,6 +480,7 @@ const $admin_silenceUser: Provider = { provide: 'ep:admin/silence-user', useClas
const $admin_unsilenceUser: Provider = { provide: 'ep:admin/unsilence-user', useClass: ep___admin_unsilenceUser.default };
const $admin_suspendUser: Provider = { provide: 'ep:admin/suspend-user', useClass: ep___admin_suspendUser.default };
const $admin_approveUser: Provider = { provide: 'ep:admin/approve-user', useClass: ep___admin_approveUser.default };
+const $admin_declineUser: Provider = { provide: 'ep:admin/decline-user', useClass: ep___admin_declineUser.default };
const $admin_unsuspendUser: Provider = { provide: 'ep:admin/unsuspend-user', useClass: ep___admin_unsuspendUser.default };
const $admin_updateMeta: Provider = { provide: 'ep:admin/update-meta', useClass: ep___admin_updateMeta.default };
const $admin_deleteAccount: Provider = { provide: 'ep:admin/delete-account', useClass: ep___admin_deleteAccount.default };
@@ -883,6 +885,7 @@ const $reversi_verify: Provider = { provide: 'ep:reversi/verify', useClass: ep__
$admin_unsilenceUser,
$admin_suspendUser,
$admin_approveUser,
+ $admin_declineUser,
$admin_unsuspendUser,
$admin_updateMeta,
$admin_deleteAccount,
@@ -1281,6 +1284,7 @@ const $reversi_verify: Provider = { provide: 'ep:reversi/verify', useClass: ep__
$admin_unsilenceUser,
$admin_suspendUser,
$admin_approveUser,
+ $admin_declineUser,
$admin_unsuspendUser,
$admin_updateMeta,
$admin_deleteAccount,
diff --git a/packages/backend/src/server/api/endpoints.ts b/packages/backend/src/server/api/endpoints.ts
index 75a72eb063..3c46843992 100644
--- a/packages/backend/src/server/api/endpoints.ts
+++ b/packages/backend/src/server/api/endpoints.ts
@@ -85,6 +85,7 @@ import * as ep___admin_silenceUser from './endpoints/admin/silence-user.js';
import * as ep___admin_unsilenceUser from './endpoints/admin/unsilence-user.js';
import * as ep___admin_suspendUser from './endpoints/admin/suspend-user.js';
import * as ep___admin_approveUser from './endpoints/admin/approve-user.js';
+import * as ep___admin_declineUser from './endpoints/admin/decline-user.js';
import * as ep___admin_unsuspendUser from './endpoints/admin/unsuspend-user.js';
import * as ep___admin_updateMeta from './endpoints/admin/update-meta.js';
import * as ep___admin_deleteAccount from './endpoints/admin/delete-account.js';
@@ -483,6 +484,7 @@ const eps = [
['admin/unsilence-user', ep___admin_unsilenceUser],
['admin/suspend-user', ep___admin_suspendUser],
['admin/approve-user', ep___admin_approveUser],
+ ['admin/decline-user', ep___admin_declineUser],
['admin/unsuspend-user', ep___admin_unsuspendUser],
['admin/update-meta', ep___admin_updateMeta],
['admin/delete-account', ep___admin_deleteAccount],
diff --git a/packages/backend/src/server/api/endpoints/admin/decline-user.ts b/packages/backend/src/server/api/endpoints/admin/decline-user.ts
new file mode 100644
index 0000000000..0a75dd977d
--- /dev/null
+++ b/packages/backend/src/server/api/endpoints/admin/decline-user.ts
@@ -0,0 +1,75 @@
+import { Inject, Injectable } from '@nestjs/common';
+import { Endpoint } from '@/server/api/endpoint-base.js';
+import type { UsedUsernamesRepository, UserProfilesRepository, UsersRepository } from '@/models/_.js';
+import { ModerationLogService } from '@/core/ModerationLogService.js';
+import { DI } from '@/di-symbols.js';
+import { EmailService } from '@/core/EmailService.js';
+import { DeleteAccountService } from '@/core/DeleteAccountService.js';
+
+export const meta = {
+ tags: ['admin'],
+
+ requireCredential: true,
+ requireModerator: true,
+ kind: 'write:admin:decline-user',
+} as const;
+
+export const paramDef = {
+ type: 'object',
+ properties: {
+ userId: { type: 'string', format: 'misskey:id' },
+ },
+ required: ['userId'],
+} as const;
+
+@Injectable()
+export default class extends Endpoint<typeof meta, typeof paramDef> { // eslint-disable-line import/no-default-export
+ constructor(
+ @Inject(DI.usersRepository)
+ private usersRepository: UsersRepository,
+
+ @Inject(DI.userProfilesRepository)
+ private userProfilesRepository: UserProfilesRepository,
+
+ @Inject(DI.usedUsernamesRepository)
+ private usedUsernamesRepository: UsedUsernamesRepository,
+
+ private moderationLogService: ModerationLogService,
+ private emailService: EmailService,
+ private deleteAccountService: DeleteAccountService,
+ ) {
+ super(meta, paramDef, async (ps, me) => {
+ const user = await this.usersRepository.findOneBy({ id: ps.userId });
+
+ if (user == null || user.isDeleted) {
+ throw new Error('user not found or already deleted');
+ }
+
+ if (user.approved) {
+ throw new Error('user is already approved');
+ }
+
+ if (user.host) {
+ throw new Error('user is not local');
+ }
+
+ const profile = await this.userProfilesRepository.findOneBy({ userId: ps.userId });
+
+ if (profile?.email) {
+ this.emailService.sendEmail(profile.email, 'Account Declined',
+ 'Your Account has been declined!',
+ 'Your Account has been declined!');
+ }
+
+ await this.usedUsernamesRepository.delete({ username: user.username });
+
+ await this.deleteAccountService.deleteAccount(user);
+
+ this.moderationLogService.log(me, 'decline', {
+ userId: user.id,
+ userUsername: user.username,
+ userHost: user.host,
+ });
+ });
+ }
+}
diff --git a/packages/backend/src/types.ts b/packages/backend/src/types.ts
index d2ddbafdb3..2aa4f279ea 100644
--- a/packages/backend/src/types.ts
+++ b/packages/backend/src/types.ts
@@ -72,6 +72,7 @@ export const moderationLogTypes = [
'updateServerSettings',
'suspend',
'approve',
+ 'decline',
'unsuspend',
'updateUserNote',
'addCustomEmoji',
@@ -139,6 +140,11 @@ export type ModerationLogPayloads = {
userUsername: string;
userHost: string | null;
};
+ decline: {
+ userId: string;
+ userUsername: string;
+ userHost: string | null;
+ };
unsuspend: {
userId: string;
userUsername: string;
diff --git a/packages/frontend/src/components/SkApprovalUser.vue b/packages/frontend/src/components/SkApprovalUser.vue
index 20059f139d..1ef0ac5b17 100644
--- a/packages/frontend/src/components/SkApprovalUser.vue
+++ b/packages/frontend/src/components/SkApprovalUser.vue
@@ -69,22 +69,10 @@ async function deleteAccount() {
});
if (confirm.canceled) return;
- const typed = await os.inputText({
- text: i18n.t('typeToConfirm', { x: props.user.username }),
+ await os.apiWithDialog('admin/decline-user', {
+ userId: props.user.id,
});
- if (typed.canceled) return;
-
- if (typed.result === props.user.username) {
- await os.apiWithDialog('admin/delete-account', {
- userId: props.user.id,
- });
- emits('deleted', props.user.id);
- } else {
- os.alert({
- type: 'error',
- text: 'input not match',
- });
- }
+ emits('deleted', props.user.id);
}
async function approveAccount() {
diff --git a/packages/frontend/src/pages/admin/modlog.ModLog.vue b/packages/frontend/src/pages/admin/modlog.ModLog.vue
index 9fe804b2bd..6c81155c51 100644
--- a/packages/frontend/src/pages/admin/modlog.ModLog.vue
+++ b/packages/frontend/src/pages/admin/modlog.ModLog.vue
@@ -31,6 +31,7 @@ SPDX-License-Identifier: AGPL-3.0-only
[$style.logRed]: [
'suspend',
'approve',
+ 'decline',
'deleteRole',
'deleteGlobalAnnouncement',
'deleteUserAnnouncement',
@@ -51,6 +52,7 @@ SPDX-License-Identifier: AGPL-3.0-only
<span v-if="log.type === 'updateUserNote'">: @{{ log.info.userUsername }}{{ log.info.userHost ? '@' + log.info.userHost : '' }}</span>
<span v-else-if="log.type === 'suspend'">: @{{ log.info.userUsername }}{{ log.info.userHost ? '@' + log.info.userHost : '' }}</span>
<span v-else-if="log.type === 'approve'">: @{{ log.info.userUsername }}{{ log.info.userHost ? '@' + log.info.userHost : '' }}</span>
+ <span v-else-if="log.type === 'decline'">: @{{ log.info.userUsername }}{{ log.info.userHost ? '@' + log.info.userHost : '' }}</span>
<span v-else-if="log.type === 'unsuspend'">: @{{ log.info.userUsername }}{{ log.info.userHost ? '@' + log.info.userHost : '' }}</span>
<span v-else-if="log.type === 'resetPassword'">: @{{ log.info.userUsername }}{{ log.info.userHost ? '@' + log.info.userHost : '' }}</span>
<span v-else-if="log.type === 'assignRole'">: @{{ log.info.userUsername }}{{ log.info.userHost ? '@' + log.info.userHost : '' }} <i class="ti ti-arrow-right"></i> {{ log.info.roleName }}</span>
diff --git a/packages/frontend/src/pages/settings/general.vue b/packages/frontend/src/pages/settings/general.vue
index 27607322ee..e1068132b7 100644
--- a/packages/frontend/src/pages/settings/general.vue
+++ b/packages/frontend/src/pages/settings/general.vue
@@ -170,6 +170,8 @@ SPDX-License-Identifier: AGPL-3.0-only
<option value="horizontal"><i class="ti ti-carousel-horizontal"></i> {{ i18n.ts.horizontal }}</option>
</MkRadios>
+ <MkSwitch v-model="notificationClickable">{{ i18n.ts.allowClickingNotifications }}</MkSwitch>
+
<MkButton @click="testNotification">{{ i18n.ts._notification.checkNotificationBehavior }}</MkButton>
</div>
</FormSection>
@@ -414,6 +416,7 @@ const showAvatarDecorations = computed(defaultStore.makeGetterSetter('showAvatar
const mediaListWithOneImageAppearance = computed(defaultStore.makeGetterSetter('mediaListWithOneImageAppearance'));
const notificationPosition = computed(defaultStore.makeGetterSetter('notificationPosition'));
const notificationStackAxis = computed(defaultStore.makeGetterSetter('notificationStackAxis'));
+const notificationClickable = computed(defaultStore.makeGetterSetter('notificationClickable'));
const keepScreenOn = computed(defaultStore.makeGetterSetter('keepScreenOn'));
const disableStreamingTimeline = computed(defaultStore.makeGetterSetter('disableStreamingTimeline'));
const useGroupedNotifications = computed(defaultStore.makeGetterSetter('useGroupedNotifications'));
diff --git a/packages/frontend/src/store.ts b/packages/frontend/src/store.ts
index a00afcd79a..8f356c557b 100644
--- a/packages/frontend/src/store.ts
+++ b/packages/frontend/src/store.ts
@@ -481,6 +481,10 @@ export const defaultStore = markRaw(new Storage('base', {
where: 'device',
default: 'horizontal' as 'vertical' | 'horizontal',
},
+ notificationClickable: {
+ where: 'device',
+ default: false,
+ },
enableCondensedLine: {
where: 'device',
default: true,
diff --git a/packages/frontend/src/ui/_common_/common.vue b/packages/frontend/src/ui/_common_/common.vue
index e9baa0eab4..a8ff2a4c8d 100644
--- a/packages/frontend/src/ui/_common_/common.vue
+++ b/packages/frontend/src/ui/_common_/common.vue
@@ -30,7 +30,11 @@ SPDX-License-Identifier: AGPL-3.0-only
:enterFromClass="defaultStore.state.animation ? $style.transition_notification_enterFrom : ''"
:leaveToClass="defaultStore.state.animation ? $style.transition_notification_leaveTo : ''"
>
- <div v-for="notification in notifications" :key="notification.id" :class="$style.notification">
+ <div
+ v-for="notification in notifications" :key="notification.id" :class="$style.notification" :style="{
+ pointerEvents: getPointerEvents()
+ }"
+ >
<XNotification :notification="notification"/>
</div>
</TransitionGroup>
@@ -101,6 +105,10 @@ if ($i) {
swInject();
}
}
+
+function getPointerEvents() {
+ return defaultStore.state.notificationClickable ? undefined : 'none';
+}
</script>
<style lang="scss" module>
@@ -122,7 +130,6 @@ if ($i) {
position: fixed;
z-index: 3900000;
padding: 0 var(--margin);
- pointer-events: none;
display: flex;
&.notificationsPosition_leftTop {
diff --git a/packages/misskey-js/etc/misskey-js.api.md b/packages/misskey-js/etc/misskey-js.api.md
index f611930727..d0fffadbdb 100644
--- a/packages/misskey-js/etc/misskey-js.api.md
+++ b/packages/misskey-js/etc/misskey-js.api.md
@@ -134,6 +134,9 @@ type AdminAvatarDecorationsListResponse = operations['admin___avatar-decorations
type AdminAvatarDecorationsUpdateRequest = operations['admin___avatar-decorations___update']['requestBody']['content']['application/json'];
// @public (undocumented)
+type AdminDeclineUserRequest = operations['admin___decline-user']['requestBody']['content']['application/json'];
+
+// @public (undocumented)
type AdminDeleteAccountRequest = operations['admin___delete-account']['requestBody']['content']['application/json'];
// @public (undocumented)
@@ -1328,6 +1331,7 @@ declare namespace entities {
AdminUnsilenceUserRequest,
AdminSuspendUserRequest,
AdminApproveUserRequest,
+ AdminDeclineUserRequest,
AdminUnsuspendUserRequest,
AdminUpdateMetaRequest,
AdminDeleteAccountRequest,
@@ -2488,6 +2492,9 @@ type ModerationLog = {
type: 'approve';
info: ModerationLogPayloads['approve'];
} | {
+ type: 'decline';
+ info: ModerationLogPayloads['decline'];
+} | {
type: 'suspend';
info: ModerationLogPayloads['suspend'];
} | {
@@ -2926,7 +2933,7 @@ type PartialRolePolicyOverride = Partial<{
}>;
// @public (undocumented)
-export const permissions: readonly ["read:account", "write:account", "read:blocks", "write:blocks", "read:drive", "write:drive", "read:favorites", "write:favorites", "read:following", "write:following", "read:messaging", "write:messaging", "read:mutes", "write:mutes", "write:notes", "read:notifications", "write:notifications", "read:reactions", "write:reactions", "write:votes", "read:pages", "write:pages", "write:page-likes", "read:page-likes", "read:user-groups", "write:user-groups", "read:channels", "write:channels", "read:gallery", "write:gallery", "read:gallery-likes", "write:gallery-likes", "read:flash", "write:flash", "read:flash-likes", "write:flash-likes", "read:admin:abuse-user-reports", "write:admin:delete-account", "write:admin:delete-all-files-of-a-user", "read:admin:index-stats", "read:admin:table-stats", "read:admin:user-ips", "read:admin:meta", "write:admin:reset-password", "write:admin:resolve-abuse-user-report", "write:admin:send-email", "read:admin:server-info", "read:admin:show-moderation-log", "read:admin:show-user", "write:admin:suspend-user", "write:admin:approve-user", "write:admin:nsfw-user", "write:admin:unnsfw-user", "write:admin:silence-user", "write:admin:unsilence-user", "write:admin:unset-user-avatar", "write:admin:unset-user-banner", "write:admin:unsuspend-user", "write:admin:meta", "write:admin:user-note", "write:admin:roles", "read:admin:roles", "write:admin:relays", "read:admin:relays", "write:admin:invite-codes", "read:admin:invite-codes", "write:admin:announcements", "read:admin:announcements", "write:admin:avatar-decorations", "read:admin:avatar-decorations", "write:admin:federation", "write:admin:account", "read:admin:account", "write:admin:emoji", "read:admin:emoji", "write:admin:queue", "read:admin:queue", "write:admin:promo", "write:admin:drive", "read:admin:drive", "write:admin:ad", "read:admin:ad", "write:invite-codes", "read:invite-codes", "write:clip-favorite", "read:clip-favorite", "read:federation", "write:report-abuse"];
+export const permissions: readonly ["read:account", "write:account", "read:blocks", "write:blocks", "read:drive", "write:drive", "read:favorites", "write:favorites", "read:following", "write:following", "read:messaging", "write:messaging", "read:mutes", "write:mutes", "write:notes", "read:notifications", "write:notifications", "read:reactions", "write:reactions", "write:votes", "read:pages", "write:pages", "write:page-likes", "read:page-likes", "read:user-groups", "write:user-groups", "read:channels", "write:channels", "read:gallery", "write:gallery", "read:gallery-likes", "write:gallery-likes", "read:flash", "write:flash", "read:flash-likes", "write:flash-likes", "read:admin:abuse-user-reports", "write:admin:delete-account", "write:admin:delete-all-files-of-a-user", "read:admin:index-stats", "read:admin:table-stats", "read:admin:user-ips", "read:admin:meta", "write:admin:reset-password", "write:admin:resolve-abuse-user-report", "write:admin:send-email", "read:admin:server-info", "read:admin:show-moderation-log", "read:admin:show-user", "write:admin:suspend-user", "write:admin:approve-user", "write:admin:decline-user", "write:admin:nsfw-user", "write:admin:unnsfw-user", "write:admin:silence-user", "write:admin:unsilence-user", "write:admin:unset-user-avatar", "write:admin:unset-user-banner", "write:admin:unsuspend-user", "write:admin:meta", "write:admin:user-note", "write:admin:roles", "read:admin:roles", "write:admin:relays", "read:admin:relays", "write:admin:invite-codes", "read:admin:invite-codes", "write:admin:announcements", "read:admin:announcements", "write:admin:avatar-decorations", "read:admin:avatar-decorations", "write:admin:federation", "write:admin:account", "read:admin:account", "write:admin:emoji", "read:admin:emoji", "write:admin:queue", "read:admin:queue", "write:admin:promo", "write:admin:drive", "read:admin:drive", "write:admin:ad", "read:admin:ad", "write:invite-codes", "read:invite-codes", "write:clip-favorite", "read:clip-favorite", "read:federation", "write:report-abuse"];
// @public (undocumented)
type PingResponse = operations['ping']['responses']['200']['content']['application/json'];
diff --git a/packages/misskey-js/src/autogen/apiClientJSDoc.ts b/packages/misskey-js/src/autogen/apiClientJSDoc.ts
index eed8a20678..f7e0c4673f 100644
--- a/packages/misskey-js/src/autogen/apiClientJSDoc.ts
+++ b/packages/misskey-js/src/autogen/apiClientJSDoc.ts
@@ -815,6 +815,17 @@ declare module '../api.js' {
/**
* No description provided.
*
+ * **Credential required**: *Yes* / **Permission**: *write:admin:decline-user*
+ */
+ request<E extends 'admin/decline-user', P extends Endpoints[E]['req']>(
+ endpoint: E,
+ params: P,
+ credential?: string | null,
+ ): Promise<SwitchCaseResponseType<E, P>>;
+
+ /**
+ * No description provided.
+ *
* **Credential required**: *Yes* / **Permission**: *write:admin:unsuspend-user*
*/
request<E extends 'admin/unsuspend-user', P extends Endpoints[E]['req']>(
diff --git a/packages/misskey-js/src/autogen/endpoint.ts b/packages/misskey-js/src/autogen/endpoint.ts
index 466e791f98..e6470ab68f 100644
--- a/packages/misskey-js/src/autogen/endpoint.ts
+++ b/packages/misskey-js/src/autogen/endpoint.ts
@@ -97,6 +97,7 @@ import type {
AdminUnsilenceUserRequest,
AdminSuspendUserRequest,
AdminApproveUserRequest,
+ AdminDeclineUserRequest,
AdminUnsuspendUserRequest,
AdminUpdateMetaRequest,
AdminDeleteAccountRequest,
@@ -668,6 +669,7 @@ export type Endpoints = {
'admin/unsilence-user': { req: AdminUnsilenceUserRequest; res: EmptyResponse };
'admin/suspend-user': { req: AdminSuspendUserRequest; res: EmptyResponse };
'admin/approve-user': { req: AdminApproveUserRequest; res: EmptyResponse };
+ 'admin/decline-user': { req: AdminDeclineUserRequest; res: EmptyResponse };
'admin/unsuspend-user': { req: AdminUnsuspendUserRequest; res: EmptyResponse };
'admin/update-meta': { req: AdminUpdateMetaRequest; res: EmptyResponse };
'admin/delete-account': { req: AdminDeleteAccountRequest; res: EmptyResponse };
diff --git a/packages/misskey-js/src/autogen/entities.ts b/packages/misskey-js/src/autogen/entities.ts
index d55da6cd01..e33baaf000 100644
--- a/packages/misskey-js/src/autogen/entities.ts
+++ b/packages/misskey-js/src/autogen/entities.ts
@@ -100,6 +100,7 @@ export type AdminSilenceUserRequest = operations['admin___silence-user']['reques
export type AdminUnsilenceUserRequest = operations['admin___unsilence-user']['requestBody']['content']['application/json'];
export type AdminSuspendUserRequest = operations['admin___suspend-user']['requestBody']['content']['application/json'];
export type AdminApproveUserRequest = operations['admin___approve-user']['requestBody']['content']['application/json'];
+export type AdminDeclineUserRequest = operations['admin___decline-user']['requestBody']['content']['application/json'];
export type AdminUnsuspendUserRequest = operations['admin___unsuspend-user']['requestBody']['content']['application/json'];
export type AdminUpdateMetaRequest = operations['admin___update-meta']['requestBody']['content']['application/json'];
export type AdminDeleteAccountRequest = operations['admin___delete-account']['requestBody']['content']['application/json'];
diff --git a/packages/misskey-js/src/autogen/types.ts b/packages/misskey-js/src/autogen/types.ts
index 10fb4e53fb..34c91af84a 100644
--- a/packages/misskey-js/src/autogen/types.ts
+++ b/packages/misskey-js/src/autogen/types.ts
@@ -675,6 +675,15 @@ export type paths = {
*/
post: operations['admin___approve-user'];
};
+ '/admin/decline-user': {
+ /**
+ * admin/decline-user
+ * @description No description provided.
+ *
+ * **Credential required**: *Yes* / **Permission**: *write:admin:decline-user*
+ */
+ post: operations['admin___decline-user'];
+ };
'/admin/unsuspend-user': {
/**
* admin/unsuspend-user
@@ -9713,6 +9722,58 @@ export type operations = {
};
};
/**
+ * admin/decline-user
+ * @description No description provided.
+ *
+ * **Credential required**: *Yes* / **Permission**: *write:admin:decline-user*
+ */
+ 'admin___decline-user': {
+ requestBody: {
+ content: {
+ 'application/json': {
+ /** Format: misskey:id */
+ userId: string;
+ };
+ };
+ };
+ responses: {
+ /** @description OK (without any results) */
+ 204: {
+ content: never;
+ };
+ /** @description Client error */
+ 400: {
+ content: {
+ 'application/json': components['schemas']['Error'];
+ };
+ };
+ /** @description Authentication error */
+ 401: {
+ content: {
+ 'application/json': components['schemas']['Error'];
+ };
+ };
+ /** @description Forbidden error */
+ 403: {
+ content: {
+ 'application/json': components['schemas']['Error'];
+ };
+ };
+ /** @description I'm Ai */
+ 418: {
+ content: {
+ 'application/json': components['schemas']['Error'];
+ };
+ };
+ /** @description Internal server error */
+ 500: {
+ content: {
+ 'application/json': components['schemas']['Error'];
+ };
+ };
+ };
+ };
+ /**
* admin/unsuspend-user
* @description No description provided.
*
diff --git a/packages/misskey-js/src/consts.ts b/packages/misskey-js/src/consts.ts
index 890b43639d..c99b8f5570 100644
--- a/packages/misskey-js/src/consts.ts
+++ b/packages/misskey-js/src/consts.ts
@@ -78,6 +78,7 @@ export const permissions = [
'read:admin:show-user',
'write:admin:suspend-user',
'write:admin:approve-user',
+ 'write:admin:decline-user',
'write:admin:nsfw-user',
'write:admin:unnsfw-user',
'write:admin:silence-user',
@@ -204,6 +205,11 @@ export type ModerationLogPayloads = {
userUsername: string;
userHost: string | null;
};
+ decline: {
+ userId: string;
+ userUsername: string;
+ userHost: string | null;
+ };
unsuspend: {
userId: string;
userUsername: string;
diff --git a/packages/misskey-js/src/entities.ts b/packages/misskey-js/src/entities.ts
index bfba8b4a87..f85574d9d5 100644
--- a/packages/misskey-js/src/entities.ts
+++ b/packages/misskey-js/src/entities.ts
@@ -51,6 +51,9 @@ export type ModerationLog = {
type: 'approve';
info: ModerationLogPayloads['approve'];
} | {
+ type: 'decline';
+ info: ModerationLogPayloads['decline'];
+} | {
type: 'suspend';
info: ModerationLogPayloads['suspend'];
} | {