Skip to content

Commit e653080

Browse files
authored
Tune Instance Moderation (#4462)
* wip * flag-info * menu
1 parent d91d188 commit e653080

File tree

8 files changed

+53
-40
lines changed

8 files changed

+53
-40
lines changed

locales/en-US.yml

+6-5
Original file line numberDiff line numberDiff line change
@@ -1392,7 +1392,7 @@ admin/views/index.vue:
13921392
abuse: "Abuse"
13931393
queue: "Job Queue"
13941394
logs: "Logs"
1395-
instanceblocks: "Instance blocks"
1395+
instancemoderation: "Instance moderation"
13961396
back-to-misskey: "Back to Misskey"
13971397
admin/views/invitations.vue:
13981398
addTitle: "New invitation"
@@ -1694,8 +1694,9 @@ admin/views/federation.vue:
16941694
latest-request-received-at: "Last request received at"
16951695
remove-all-following: "Withold all followers"
16961696
remove-all-following-info: "Unfollow all accounts from {host}. Please run this if the instance no longer exists."
1697-
block: "Block"
1697+
ignore: "Ignore instance"
16981698
marked-as-closed: "Marked as closed"
1699+
flag-info: "Ignore stops sending, receiving, and fetching. Close only stops sending. The flag is automatically updated according to the communication status."
16991700
lookup: "Look up"
17001701
instances: "Federated"
17011702
instance-not-registered: "The instance has not been discovered"
@@ -1720,7 +1721,7 @@ admin/views/federation.vue:
17201721
state: "Sort"
17211722
states:
17221723
all: "All"
1723-
blocked: "Blocked"
1724+
ignored: "Ignored"
17241725
not-responding: "Without response"
17251726
marked-as-closed: "Marked as closed"
17261727
result-is-truncated: "Displaying the top {n} items."
@@ -1742,8 +1743,8 @@ admin/views/federation.vue:
17421743
day: "Daily"
17431744

17441745
admin/views/instanceblocks.vue:
1745-
instanceblocks: "Instance block"
1746-
blockedInstances-info: "One host per line. You can use /RegExp/."
1746+
ignoredInstances: "Ignored instances"
1747+
ignoredInstances-info: "One host per line. You can use /RegExp/."
17471748

17481749
admin/views/relay.vue:
17491750
add-relay: "Add relay"

locales/ja-JP.yml

+6-5
Original file line numberDiff line numberDiff line change
@@ -1531,7 +1531,7 @@ admin/views/index.vue:
15311531
abuse: "スパム報告"
15321532
queue: "ジョブキュー"
15331533
logs: "ログ"
1534-
instanceblocks: "インスタンスブロック"
1534+
instancemoderation: "インスタンスモデレーション"
15351535
back-to-misskey: "Misskeyに戻る"
15361536

15371537
admin/views/invitations.vue:
@@ -1857,8 +1857,9 @@ admin/views/federation.vue:
18571857
latest-request-received-at: "直近のリクエスト受信"
18581858
remove-all-following: "フォローを全解除"
18591859
remove-all-following-info: "{host}からのフォローをすべて解除します。そのインスタンスがもう存在しなくなった場合などに実行してください。"
1860-
block: "ブロック"
1860+
ignore: "インスタンスを無視"
18611861
marked-as-closed: "閉鎖されているとマーク"
1862+
flag-info: "無視はそのインスタンスとの送受信と取得を停止します。閉鎖は送信のみを停止します。フラグは疎通状況によって自動更新されます。"
18621863
lookup: "照会"
18631864
instances: "連合"
18641865
instance-not-registered: "そのインスタンスは登録されていません"
@@ -1883,7 +1884,7 @@ admin/views/federation.vue:
18831884
state: "状態"
18841885
states:
18851886
all: "すべて"
1886-
blocked: "ブロック"
1887+
ignored: "無視済み"
18871888
not-responding: "応答なし"
18881889
marked-as-closed: "閉鎖とマーク済み"
18891890
result-is-truncated: "上位{n}件を表示しています。"
@@ -1905,8 +1906,8 @@ admin/views/federation.vue:
19051906
day: "1日ごと"
19061907

19071908
admin/views/instanceblocks.vue:
1908-
instanceblocks: "インスタンスブロック"
1909-
blockedInstances-info: "1行に1ホスト記述します。/正規表現/ が使えます。"
1909+
ignoredInstances: "インスタンスの無視"
1910+
ignoredInstances-info: "1行に1ホスト記述します。/正規表現/ が使えます。"
19101911

19111912
admin/views/relay.vue:
19121913
add-relay: "リレーの追加"

src/client/app/admin/views/federation.vue

+24-16
Original file line numberDiff line numberDiff line change
@@ -81,8 +81,9 @@
8181
<span>{{ $t('maintainerEmail') }}</span>
8282
</ui-input>
8383
</ui-horizon-group>
84-
<ui-switch v-model="instance.isBlocked" @change="updateInstance()" :disabled="!$store.getters.isAdminOrModerator">{{ $t('block') }}</ui-switch>
84+
<ui-switch v-model="instance.isBlocked" @change="updateInstance()" :disabled="!$store.getters.isAdminOrModerator">{{ $t('ignore') }}</ui-switch>
8585
<ui-switch v-model="instance.isMarkedAsClosed" @change="updateInstance()" :disabled="!$store.getters.isAdminOrModerator">{{ $t('marked-as-closed') }}</ui-switch>
86+
<ui-info>{{ $t('flag-info') }}</ui-info>
8687
<details :open="true">
8788
<summary>{{ $t('charts') }}</summary>
8889
<ui-horizon-group inputs>
@@ -106,11 +107,13 @@
106107
</ui-horizon-group>
107108
<div ref="chart"></div>
108109
</details>
110+
<!--
109111
<details v-if="$store.getters.isAdminOrModerator">
110112
<summary>{{ $t('remove-all-following') }}</summary>
111113
<ui-button @click="removeAllFollowing()" style="margin-top: 16px;"><fa :icon="faMinusCircle"/> {{ $t('remove-all-following') }}</ui-button>
112114
<ui-info warn>{{ $t('remove-all-following-info', { host: instance.host }) }}</ui-info>
113115
</details>
116+
-->
114117
</div>
115118
</section>
116119
</ui-card>
@@ -141,7 +144,7 @@
141144
<ui-select v-model="state">
142145
<template #label>{{ $t('state') }}</template>
143146
<option value="all">{{ $t('states.all') }}</option>
144-
<option value="blocked">{{ $t('states.blocked') }}</option>
147+
<option value="blocked">{{ $t('states.ignored') }}</option>
145148
<option value="notResponding">{{ $t('states.not-responding') }}</option>
146149
<option value="markedAsClosed">{{ $t('states.marked-as-closed') }}</option>
147150
</ui-select>
@@ -189,7 +192,7 @@
189192
</template>
190193

191194
<script lang="ts">
192-
import Vue from 'vue';
195+
import Vue, { defineComponent, getCurrentInstance } from 'vue';
193196
import i18n from '../../i18n';
194197
import { faPaperPlane } from '@fortawesome/free-regular-svg-icons';
195198
import { faGlobe, faTerminal, faSearch, faMinusCircle, faServer, faCrosshairs, faEnvelopeOpenText, faUsers, faCaretDown, faCaretUp, faTrafficLight, faInbox } from '@fortawesome/free-solid-svg-icons';
@@ -201,7 +204,7 @@ const chartLimit = 90;
201204
const sum = (...arr) => arr.reduce((r, a) => r.map((b, i) => a[i] + b));
202205
const negate = arr => arr.map(x => -x);
203206
204-
export default Vue.extend({
207+
export default defineComponent({
205208
i18n: i18n('admin/views/federation.vue'),
206209
207210
filters: {
@@ -210,20 +213,22 @@ export default Vue.extend({
210213
211214
data() {
212215
return {
213-
instance: null,
214-
target: null,
216+
$root: getCurrentInstance() as any,
217+
instance: null as Record<string, any> | null,
218+
target: null as any,
215219
sort: '+lastCommunicatedAt',
216220
state: 'all',
217221
softwareName: '',
218222
softwareVersion: '',
219223
cc: '',
220224
limit: 200,
221-
instances: [],
222-
chart: null,
225+
instances: [] as Record<string, any>[],
226+
chart: null as Record<string, any> | null,
223227
chartSrc: 'requests',
224228
chartSpan: 'day',
225-
chartInstance: null,
229+
chartInstance: null as any,
226230
urlQuery,
231+
now: null as Date | null,
227232
faGlobe, faTerminal, faSearch, faMinusCircle, faServer, faCrosshairs, faEnvelopeOpenText, faUsers, faCaretDown, faCaretUp, faPaperPlane, faTrafficLight, faInbox
228233
};
229234
},
@@ -246,10 +251,10 @@ export default Vue.extend({
246251
}
247252
},
248253
249-
stats(): any[] {
254+
stats(): any {
250255
const stats =
251-
this.chartSpan == 'day' ? this.chart.perDay :
252-
this.chartSpan == 'hour' ? this.chart.perHour :
256+
this.chartSpan == 'day' ? this.chart?.perDay :
257+
this.chartSpan == 'hour' ? this.chart?.perHour :
253258
null;
254259
255260
return stats;
@@ -266,6 +271,7 @@ export default Vue.extend({
266271
},
267272
268273
async instance() {
274+
if (!this.instance) return;
269275
this.now = new Date();
270276
271277
const [perHour, perDay] = await Promise.all([
@@ -302,9 +308,9 @@ export default Vue.extend({
302308
303309
methods: {
304310
showInstance(target?: string) {
305-
this.$root.api('federation/show-instance', {
311+
this.$root.api('admin/federation/show-instance', {
306312
host: target || this.target
307-
}).then(instance => {
313+
}).then((instance: any) => {
308314
if (instance == null) {
309315
this.$root.dialog({
310316
type: 'error',
@@ -319,7 +325,7 @@ export default Vue.extend({
319325
320326
fetchInstances() {
321327
this.instances = [];
322-
this.$root.api('federation/instances', {
328+
this.$root.api('admin/federation/instances', {
323329
softwareName: this.softwareName,
324330
softwareVersion: this.softwareVersion,
325331
cc: this.cc,
@@ -328,12 +334,13 @@ export default Vue.extend({
328334
markedAsClosed: this.state === 'markedAsClosed' ? true : null,
329335
sort: this.sort,
330336
limit: this.limit
331-
}).then(instances => {
337+
}).then((instances: any) => {
332338
this.instances = instances;
333339
});
334340
},
335341
336342
removeAllFollowing() {
343+
if (!this.instance) return;
337344
this.$root.api('admin/federation/remove-all-following', {
338345
host: this.instance.host
339346
}).then(() => {
@@ -345,6 +352,7 @@ export default Vue.extend({
345352
},
346353
347354
updateInstance() {
355+
if (!this.instance) return;
348356
this.$root.api('admin/federation/update-instance', {
349357
host: this.instance.host,
350358
isBlocked: this.instance.isBlocked || false,

src/client/app/admin/views/index.vue

+2-2
Original file line numberDiff line numberDiff line change
@@ -31,14 +31,14 @@
3131
<li><router-link to="/moderators" active-class="active" v-if="$store.getters.isAdminOrModerator"><fa :icon="faHeadset" fixed-width/>{{ $t('moderators') }}</router-link></li>
3232
<li><router-link to="/users" active-class="active" v-if="$store.getters.isAdminOrModerator"><fa icon="users" fixed-width/>{{ $t('users') }}</router-link></li>
3333
<li><router-link to="/drive" active-class="active" v-if="$store.getters.isAdminOrModerator"><fa icon="cloud" fixed-width/>{{ $t('@.drive') }}</router-link></li>
34-
<li><router-link to="/federation" active-class="active"><fa :icon="faGlobe" fixed-width/>{{ $t('federation') }}</router-link></li>
34+
<li><router-link to="/federation" active-class="active" v-if="$store.getters.isAdminOrModerator"><fa :icon="faGlobe" fixed-width/>{{ $t('federation') }}</router-link></li>
3535
<li><router-link to="/relays" active-class="active" v-if="$store.getters.isAdminOrModerator"><fa :icon="faProjectDiagram" fixed-width/>{{ $t('relays') }}</router-link></li>
3636
<li><router-link to="/emoji" active-class="active" v-if="$store.getters.isAdminOrModerator"><fa :icon="faGrin" fixed-width/>{{ $t('emoji') }}</router-link></li>
3737
<li><router-link to="/invitations" active-class="active" v-if="$store.getters.isAdminOrModerator"><fa :icon="faUserFriends" fixed-width/>{{ $t('invitations') }}</router-link></li>
3838
<li><router-link to="/announcements" active-class="active" v-if="$store.getters.isAdmin"><fa icon="broadcast-tower" fixed-width/>{{ $t('announcements') }}</router-link></li>
3939
<li><router-link to="/hashtags" active-class="active" v-if="$store.getters.isAdmin"><fa icon="hashtag" fixed-width/>{{ $t('hashtags') }}</router-link></li>
4040
<li><router-link to="/abuse" active-class="active" v-if="$store.getters.isAdminOrModerator"><fa :icon="faExclamationCircle" fixed-width/>{{ $t('abuse') }}</router-link></li>
41-
<li><router-link to="/instanceblocks" active-class="active" v-if="$store.getters.isAdmin"><fa icon="ban" fixed-width/>{{ $t('instanceblocks') }}</router-link></li>
41+
<li><router-link to="/instanceblocks" active-class="active" v-if="$store.getters.isAdmin"><fa icon="ban" fixed-width/>{{ $t('instancemoderation') }}</router-link></li>
4242
</ul>
4343
<div class="back-to-misskey">
4444
<a href="/"><fa :icon="faArrowLeft"/> {{ $t('back-to-misskey') }}</a>

src/client/app/admin/views/instanceblocks.vue

+5-4
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,25 @@
11
<template>
22
<div>
33
<ui-card>
4-
<template #title>{{ $t('instanceblocks') }}</template>
4+
<template #title>{{ $t('ignoredInstances') }}</template>
55
<section class="fit-top">
66
<ui-textarea v-model="blockedInstances"></ui-textarea>
7-
<ui-info>{{ $t('blockedInstances-info') }}</ui-info>
7+
<ui-info>{{ $t('ignoredInstances-info') }}</ui-info>
88
<ui-button @click="save">{{ $t('@._settings.save') }}</ui-button>
99
</section>
1010
</ui-card>
1111
</div>
1212
</template>
1313

1414
<script lang="ts">
15-
import Vue from 'vue';
15+
import { defineComponent, getCurrentInstance } from 'vue';
1616
import i18n from '../../i18n';
1717
18-
export default Vue.extend({
18+
export default defineComponent({
1919
i18n: i18n('admin/views/instanceblocks.vue'),
2020
data() {
2121
return {
22+
$root: getCurrentInstance() as any,
2223
blockedInstances: '',
2324
};
2425
},

src/server/api/endpoints/federation/instances.ts src/server/api/endpoints/admin/federation/instances.ts

+4-3
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,13 @@
11
import $ from 'cafy';
2-
import define from '../../define';
3-
import Instance from '../../../../models/instance';
2+
import define from '../../../define';
3+
import Instance from '../../../../../models/instance';
44
import * as escapeRegexp from 'escape-regexp';
55

66
export const meta = {
77
tags: ['federation'],
88

9-
requireCredential: false,
9+
requireCredential: true,
10+
requireModerator: true,
1011

1112
params: {
1213
blocked: {

src/server/api/endpoints/federation/show-instance.ts src/server/api/endpoints/admin/federation/show-instance.ts

+4-3
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,12 @@
11
import $ from 'cafy';
2-
import define from '../../define';
3-
import Instance from '../../../../models/instance';
2+
import define from '../../../define';
3+
import Instance from '../../../../../models/instance';
44

55
export const meta = {
66
tags: ['federation'],
77

8-
requireCredential: false,
8+
requireCredential: true,
9+
requireModerator: true,
910

1011
params: {
1112
host: {

src/server/api/files.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,9 @@ export default [
1111
"admin/emoji/list",
1212
"admin/emoji/remove",
1313
"admin/emoji/update",
14+
"admin/federation/instances",
1415
"admin/federation/remove-all-following",
16+
"admin/federation/show-instance",
1517
"admin/federation/update-instance",
1618
"admin/invitations/create",
1719
"admin/invitations/delete",
@@ -89,8 +91,6 @@ export default [
8991
"emojis/recommendation",
9092
"endpoint",
9193
"endpoints",
92-
"federation/instances",
93-
"federation/show-instance",
9494
"following/create",
9595
"following/delete",
9696
"following/invalidate",

0 commit comments

Comments
 (0)