Merge branch 'develop'

This commit is contained in:
syuilo 2023-01-22 21:01:52 +09:00
commit 09f4b9e546
13 changed files with 205 additions and 56 deletions

View file

@ -9,6 +9,12 @@
You should also include the user name that made the change. You should also include the user name that made the change.
--> -->
## 13.1.7 (2023/01/22)
### Improvements
- 新たな実績を追加
- MFMにscaleタグを追加
## 13.1.4 (2023/01/22) ## 13.1.4 (2023/01/22)
### Improvements ### Improvements

View file

@ -95,7 +95,7 @@ follow: "Segui"
followRequest: "Richiesta di follow" followRequest: "Richiesta di follow"
followRequests: "Richieste di follow" followRequests: "Richieste di follow"
unfollow: "Smetti di seguire" unfollow: "Smetti di seguire"
followRequestPending: "La richiesta di follow deve essere approvata" followRequestPending: "Richiesta in approvazione"
enterEmoji: "Inserisci emoji" enterEmoji: "Inserisci emoji"
renote: "Rinota" renote: "Rinota"
unrenote: "Annulla rinota" unrenote: "Annulla rinota"
@ -1048,6 +1048,9 @@ _achievements:
_noteFavorited1: _noteFavorited1:
title: "Guarda le stelle" title: "Guarda le stelle"
description: "Aggiungi una Nota ai preferiti per la prima volta" description: "Aggiungi una Nota ai preferiti per la prima volta"
_myNoteFavorited1:
title: "Fornitura stelline"
description: "Qualcuno ha preferito una delle tue Note"
_profileFilled: _profileFilled:
title: "Perfettamente" title: "Perfettamente"
description: "Imposta il tuo profilo" description: "Imposta il tuo profilo"

View file

@ -1105,6 +1105,9 @@ _achievements:
title: "I Love Misskey" title: "I Love Misskey"
description: "\"I ❤ #Misskey\"を投稿した" description: "\"I ❤ #Misskey\"を投稿した"
flavor: "Misskeyを使ってくださりありがとうございます by 開発チーム" flavor: "Misskeyを使ってくださりありがとうございます by 開発チーム"
_foundTreasure:
title: "宝探し"
description: "隠されたお宝を発見した"
_client30min: _client30min:
title: "ひとやすみ" title: "ひとやすみ"
description: "クライアントを起動してから30分以上経過した" description: "クライアントを起動してから30分以上経過した"
@ -1125,6 +1128,9 @@ _achievements:
_htl20npm: _htl20npm:
title: "流れるTL" title: "流れるTL"
description: "ホームタイムラインの流速が20npmを越す" description: "ホームタイムラインの流速が20npmを越す"
_viewInstanceChart:
title: "アナリスト"
description: "インスタンスのチャートを表示した"
_outputHelloWorldOnScratchpad: _outputHelloWorldOnScratchpad:
title: "Hello, world!" title: "Hello, world!"
description: "スクラッチパッドで hello world を出力した" description: "スクラッチパッドで hello world を出力した"

View file

@ -899,6 +899,15 @@ unlike: "Не вподобати"
numberOfLikes: "Вподобання" numberOfLikes: "Вподобання"
show: "Відображення" show: "Відображення"
color: "Колір" color: "Колір"
achievements: "Досягнення"
_achievements:
_types:
_notes1:
title: "налаштовую свій msky"
description: "Перша нотатка"
flavor: "Приємного часу з Misskey!"
_notes10:
title: "Декілька нотаток"
_role: _role:
priority: "Пріоритет" priority: "Пріоритет"
_priority: _priority:

View file

@ -956,7 +956,7 @@ _achievements:
title: "满是帖子" title: "满是帖子"
description: "发布了500篇帖子" description: "发布了500篇帖子"
_notes1000: _notes1000:
title: "成山" title: "帖成山"
description: "发布了1,000篇帖子" description: "发布了1,000篇帖子"
_notes5000: _notes5000:
title: "帖如泉涌" title: "帖如泉涌"

View file

@ -1047,25 +1047,59 @@ _achievements:
description: "第一次將貼文收進摘錄" description: "第一次將貼文收進摘錄"
_noteFavorited1: _noteFavorited1:
title: "觀星者" title: "觀星者"
description: "第一次將貼文收進我的最愛" description: "第一次將貼文收藏至我的最愛"
_myNoteFavorited1:
title: "想要星星"
description: "自己的貼文被他人收藏至「我的最愛」了"
_profileFilled: _profileFilled:
title: "有備而來" title: "有備而來"
description: "設定了個人檔案" description: "設定了個人檔案"
_markedAsCat: _markedAsCat:
title: "我是貓" title: "我是貓"
description: "已將帳戶設定為貓" description: "已將帳戶設定為貓"
flavor: "還沒有名字。"
_following1:
title: "首次追隨"
description: "首次追隨了"
_following10:
title: "跟著跟著"
description: "跟隨超過10人了"
_following50:
title: "朋友很多"
description: "跟隨超過50人了"
_following100:
title: "100位朋友"
description: "跟隨超過100人了"
_following300:
title: "朋友過多"
description: "跟隨超過300人了"
_followers1:
title: "第一個追隨者"
description: "第一次被追隨"
_followers10:
title: "Follow me!"
description: "跟隨者超過10人了"
_followers50:
title: "成群結隊"
description: "跟隨者超過50人了"
_followers100:
title: "紅人"
description: "跟隨者超過100人了"
_followers300:
title: "請排成一排"
description: "跟隨者超過300人了"
_followers500: _followers500:
title: "基站" title: "基站"
description: "超過500名追隨者" description: "超過500名追隨者"
_followers1000: _followers1000:
title: "影響者" title: "影響者"
description: "超過1000名追隨者" description: "超過1000名追隨者"
_collectAchievements30: _collectAchievements30:
title: "成就收藏家" title: "成就收藏家"
description: "獲得30個以上的成就" description: "獲得30個以上的成就"
_viewAchievements3min: _viewAchievements3min:
title: "喜愛成就" title: "喜愛成就"
description: "看成就列表要花了3分鐘以上" description: "看成就列表要花3分鐘以上"
_iLoveMisskey: _iLoveMisskey:
title: "I Love Misskey" title: "I Love Misskey"
description: "發布「I ❤ #Misskey」" description: "發布「I ❤ #Misskey」"
@ -1083,6 +1117,7 @@ _achievements:
_postedAt0min0sec: _postedAt0min0sec:
title: "報時" title: "報時"
description: "在0分0秒發佈貼文" description: "在0分0秒發佈貼文"
flavor: "啵.啵.啵.嗶ー"
_selfQuote: _selfQuote:
title: "自我引用" title: "自我引用"
description: "引用了自己的貼文" description: "引用了自己的貼文"
@ -1094,7 +1129,7 @@ _achievements:
description: "在暫存記憶體輸出了 hello world" description: "在暫存記憶體輸出了 hello world"
_open3windows: _open3windows:
title: "多重視窗" title: "多重視窗"
description: "開啟3個以上的視窗" description: "開啟3個以上的視窗"
_driveFolderCircularReference: _driveFolderCircularReference:
title: "循環引用" title: "循環引用"
description: "試圖遞迴套入雲端硬碟資料夾" description: "試圖遞迴套入雲端硬碟資料夾"
@ -1110,6 +1145,30 @@ _achievements:
_setNameToSyuilo: _setNameToSyuilo:
title: "神的情結" title: "神的情結"
description: "將名稱設定為 syuilo" description: "將名稱設定為 syuilo"
_passedSinceAccountCreated1:
title: "一周年"
description: "自建立帳戶開始過了1年"
_passedSinceAccountCreated2:
title: "二周年"
description: "自建立帳戶開始過了2年"
_passedSinceAccountCreated3:
title: "三周年"
description: "自建立帳戶開始過了3年"
_loggedInOnBirthday:
title: "生日快樂"
description: "在生日當天登入了"
_loggedInOnNewYearsDay:
title: "新年快樂"
description: "在元旦當天登入了"
flavor: "今年也請對敝實例多多指教"
_cookieClicked:
title: "點擊餅乾的遊戲"
description: "點擊了餅乾"
flavor: "是不是軟體有問題?"
_brainDiver:
title: "Brain Driver"
description: "發佈了Brain Driver的連結"
flavor: "Misskey-Misskey La-Tu-Ma"
_role: _role:
new: "建立角色" new: "建立角色"
edit: "編輯角色" edit: "編輯角色"
@ -1759,6 +1818,7 @@ _notification:
pollEnded: "問卷調查已產生結果" pollEnded: "問卷調查已產生結果"
unreadAntennaNote: "天線 {name}" unreadAntennaNote: "天線 {name}"
emptyPushNotificationMessage: "推送通知已更新" emptyPushNotificationMessage: "推送通知已更新"
achievementEarned: "獲得成就"
_types: _types:
all: "全部 " all: "全部 "
follow: "追隨中" follow: "追隨中"

View file

@ -1,6 +1,6 @@
{ {
"name": "misskey", "name": "misskey",
"version": "13.1.6", "version": "13.1.7",
"codename": "nasubi", "codename": "nasubi",
"repository": { "repository": {
"type": "git", "type": "git",

View file

@ -62,12 +62,14 @@ const ACHIEVEMENT_TYPES = [
'collectAchievements30', 'collectAchievements30',
'viewAchievements3min', 'viewAchievements3min',
'iLoveMisskey', 'iLoveMisskey',
'foundTreasure',
'client30min', 'client30min',
'noteDeletedWithin1min', 'noteDeletedWithin1min',
'postedAtLateNight', 'postedAtLateNight',
'postedAt0min0sec', 'postedAt0min0sec',
'selfQuote', 'selfQuote',
'htl20npm', 'htl20npm',
'viewInstanceChart',
'outputHelloWorldOnScratchpad', 'outputHelloWorldOnScratchpad',
'open3windows', 'open3windows',
'driveFolderCircularReference', 'driveFolderCircularReference',

View file

@ -200,6 +200,12 @@ export default defineComponent({
style = `transform: translateX(${x}em) translateY(${y}em);`; style = `transform: translateX(${x}em) translateY(${y}em);`;
break; break;
} }
case 'scale': {
const x = Math.min(parseInt(token.props.args.x ?? '1'), 5);
const y = Math.min(parseInt(token.props.args.y ?? '1'), 5);
style = `transform: scale(${x}, ${y});`;
break;
}
case 'fg': { case 'fg': {
let color = token.props.args.color; let color = token.props.args.color;
if (!/^[0-9a-f]{3,6}$/i.test(color)) color = 'f00'; if (!/^[0-9a-f]{3,6}$/i.test(color)) color = 'f00';

View file

@ -4,11 +4,14 @@
<div style="overflow: clip;"> <div style="overflow: clip;">
<MkSpacer :content-max="600" :margin-min="20"> <MkSpacer :content-max="600" :margin-min="20">
<div class="_gaps_m znqjceqz"> <div class="_gaps_m znqjceqz">
<div ref="containerEl" v-panel class="about" :class="{ playing: easterEggEngine != null }"> <div v-panel class="about">
<img src="/client-assets/about-icon.png" alt="" class="icon" draggable="false" @load="iconLoaded" @click="gravity"/> <div ref="containerEl" class="container" :class="{ playing: easterEggEngine != null }">
<div class="misskey">Misskey</div> <img src="/client-assets/about-icon.png" alt="" class="icon" draggable="false" @load="iconLoaded" @click="gravity"/>
<div class="version">v{{ version }}</div> <div class="misskey">Misskey</div>
<span v-for="emoji in easterEggEmojis" :key="emoji.id" class="emoji" :data-physics-x="emoji.left" :data-physics-y="emoji.top" :class="{ _physics_circle_: !emoji.emoji.startsWith(':') }"><MkEmoji class="emoji" :emoji="emoji.emoji" :is-reaction="false" :normal="true" :no-style="true"/></span> <div class="version">v{{ version }}</div>
<span v-for="emoji in easterEggEmojis" :key="emoji.id" class="emoji" :data-physics-x="emoji.left" :data-physics-y="emoji.top" :class="{ _physics_circle_: !emoji.emoji.startsWith(':') }"><MkEmoji class="emoji" :emoji="emoji.emoji" :is-reaction="false" :normal="true" :no-style="true"/></span>
</div>
<button v-if="thereIsTreasure" class="_button treasure" @click="getTreasure"><img src="/fluent-emoji/1f3c6.png" class="treasureImg"></button>
</div> </div>
<div style="text-align: center;"> <div style="text-align: center;">
{{ i18n.ts._aboutMisskey.about }}<br><a href="https://misskey-hub.net/docs/misskey.html" target="_blank" class="_link">{{ i18n.ts.learnMore }}</a> {{ i18n.ts._aboutMisskey.about }}<br><a href="https://misskey-hub.net/docs/misskey.html" target="_blank" class="_link">{{ i18n.ts.learnMore }}</a>
@ -70,6 +73,8 @@ import { i18n } from '@/i18n';
import { defaultStore } from '@/store'; import { defaultStore } from '@/store';
import * as os from '@/os'; import * as os from '@/os';
import { definePageMetadata } from '@/scripts/page-metadata'; import { definePageMetadata } from '@/scripts/page-metadata';
import { claimAchievement, claimedAchievements } from '@/scripts/achievements';
import { $i } from '@/account';
const patrons = [ const patrons = [
'まっちゃとーにゅ', 'まっちゃとーにゅ',
@ -152,6 +157,8 @@ const patrons = [
'pixeldesu', 'pixeldesu',
]; ];
let thereIsTreasure = $ref($i && !claimedAchievements.includes('foundTreasure'));
let easterEggReady = false; let easterEggReady = false;
let easterEggEmojis = $ref([]); let easterEggEmojis = $ref([]);
let easterEggEngine = $ref(null); let easterEggEngine = $ref(null);
@ -187,6 +194,11 @@ function iLoveMisskey() {
}); });
} }
function getTreasure() {
thereIsTreasure = false;
claimAchievement('foundTreasure');
}
onBeforeUnmount(() => { onBeforeUnmount(() => {
if (easterEggEngine) { if (easterEggEngine) {
easterEggEngine.stop(); easterEggEngine.stop();
@ -207,52 +219,77 @@ definePageMetadata({
.znqjceqz { .znqjceqz {
> .about { > .about {
position: relative; position: relative;
text-align: center;
padding: 16px;
border-radius: var(--radius); border-radius: var(--radius);
&.playing { > .treasure {
&, * {
user-select: none;
}
* {
will-change: transform;
}
> .emoji {
visibility: visible;
}
}
> .icon {
display: block;
width: 80px;
margin: 0 auto;
border-radius: 16px;
}
> .misskey {
margin: 0.75em auto 0 auto;
width: max-content;
}
> .version {
margin: 0 auto;
width: max-content;
opacity: 0.5;
}
> .emoji {
position: absolute; position: absolute;
top: 0; top: 60px;
left: 0; left: 0;
visibility: hidden; right: 0;
margin: 0 auto;
width: min-content;
> .treasureImg {
width: 25px;
vertical-align: bottom;
}
}
> .container {
position: relative;
text-align: center;
padding: 16px;
&.playing {
&, * {
user-select: none;
}
* {
will-change: transform;
}
> .emoji {
visibility: visible;
}
}
> .icon {
display: block;
width: 80px;
margin: 0 auto;
border-radius: 16px;
position: relative;
z-index: 1;
}
> .misskey {
margin: 0.75em auto 0 auto;
width: max-content;
position: relative;
z-index: 1;
}
> .version {
margin: 0 auto;
width: max-content;
opacity: 0.5;
position: relative;
z-index: 1;
}
> .emoji { > .emoji {
pointer-events: none; position: absolute;
font-size: 24px; z-index: 1;
width: 24px; top: 0;
left: 0;
visibility: hidden;
> .emoji {
pointer-events: none;
font-size: 24px;
width: 24px;
}
} }
} }
} }

View file

@ -86,7 +86,7 @@
</template> </template>
<script lang="ts" setup> <script lang="ts" setup>
import { ref, computed } from 'vue'; import { ref, computed, watch } from 'vue';
import XEmojis from './about.emojis.vue'; import XEmojis from './about.emojis.vue';
import XFederation from './about.federation.vue'; import XFederation from './about.federation.vue';
import { version, instanceName, host } from '@/config'; import { version, instanceName, host } from '@/config';
@ -100,6 +100,7 @@ import * as os from '@/os';
import number from '@/filters/number'; import number from '@/filters/number';
import { i18n } from '@/i18n'; import { i18n } from '@/i18n';
import { definePageMetadata } from '@/scripts/page-metadata'; import { definePageMetadata } from '@/scripts/page-metadata';
import { claimAchievement } from '@/scripts/achievements';
const props = withDefaults(defineProps<{ const props = withDefaults(defineProps<{
initialTab?: string; initialTab?: string;
@ -110,6 +111,12 @@ const props = withDefaults(defineProps<{
let stats = $ref(null); let stats = $ref(null);
let tab = $ref(props.initialTab); let tab = $ref(props.initialTab);
watch($$(tab), () => {
if (tab === 'charts') {
claimAchievement('viewInstanceChart');
}
});
const initStats = () => os.api('stats', { const initStats = () => os.api('stats', {
}).then((res) => { }).then((res) => {
stats = res; stats = res;

View file

@ -58,12 +58,14 @@ export const ACHIEVEMENT_TYPES = [
'collectAchievements30', 'collectAchievements30',
'viewAchievements3min', 'viewAchievements3min',
'iLoveMisskey', 'iLoveMisskey',
'foundTreasure',
'client30min', 'client30min',
'noteDeletedWithin1min', 'noteDeletedWithin1min',
'postedAtLateNight', 'postedAtLateNight',
'postedAt0min0sec', 'postedAt0min0sec',
'selfQuote', 'selfQuote',
'htl20npm', 'htl20npm',
'viewInstanceChart',
'outputHelloWorldOnScratchpad', 'outputHelloWorldOnScratchpad',
'open3windows', 'open3windows',
'driveFolderCircularReference', 'driveFolderCircularReference',
@ -331,6 +333,11 @@ export const ACHIEVEMENT_BADGES = {
bg: 'linear-gradient(0deg, rgb(255 77 77), rgb(247 155 214))', bg: 'linear-gradient(0deg, rgb(255 77 77), rgb(247 155 214))',
frame: 'silver', frame: 'silver',
}, },
'foundTreasure': {
img: '/fluent-emoji/1f3c6.png',
bg: 'linear-gradient(0deg, rgb(197 69 192), rgb(2 112 155))',
frame: 'gold',
},
'client30min': { 'client30min': {
img: '/fluent-emoji/1f552.png', img: '/fluent-emoji/1f552.png',
bg: 'linear-gradient(0deg, rgb(220 223 225), rgb(172 192 207))', bg: 'linear-gradient(0deg, rgb(220 223 225), rgb(172 192 207))',
@ -361,6 +368,11 @@ export const ACHIEVEMENT_BADGES = {
bg: 'linear-gradient(0deg, rgb(220 223 225), rgb(172 192 207))', bg: 'linear-gradient(0deg, rgb(220 223 225), rgb(172 192 207))',
frame: 'bronze', frame: 'bronze',
}, },
'viewInstanceChart': {
img: '/fluent-emoji/1f4ca.png',
bg: 'linear-gradient(0deg, rgb(58 231 198), rgb(37 194 255))',
frame: 'bronze',
},
'outputHelloWorldOnScratchpad': { 'outputHelloWorldOnScratchpad': {
img: '/fluent-emoji/1f530.png', img: '/fluent-emoji/1f530.png',
bg: 'linear-gradient(0deg, rgb(58 231 198), rgb(37 194 255))', bg: 'linear-gradient(0deg, rgb(58 231 198), rgb(37 194 255))',
@ -437,11 +449,12 @@ export const ACHIEVEMENT_BADGES = {
frame: 'bronze' | 'silver' | 'gold' | 'platinum'; frame: 'bronze' | 'silver' | 'gold' | 'platinum';
}>; }>;
export const claimedAchievements = ($i && $i.achievements) ? $i.achievements.map(x => x.name) : []; export const claimedAchievements: typeof ACHIEVEMENT_TYPES[number][] = ($i && $i.achievements) ? $i.achievements.map(x => x.name) : [];
const claimingQueue = new Set<string>(); const claimingQueue = new Set<string>();
export async function claimAchievement(type: typeof ACHIEVEMENT_TYPES[number]) { export async function claimAchievement(type: typeof ACHIEVEMENT_TYPES[number]) {
if ($i == null) return;
if (claimedAchievements.includes(type)) return; if (claimedAchievements.includes(type)) return;
claimingQueue.add(type); claimingQueue.add(type);
claimedAchievements.push(type); claimedAchievements.push(type);

View file

@ -1 +1 @@
export const MFM_TAGS = ['tada', 'jelly', 'twitch', 'shake', 'spin', 'jump', 'bounce', 'flip', 'x2', 'x3', 'x4', 'position', 'fg', 'bg', 'font', 'blur', 'rainbow', 'sparkle', 'rotate']; export const MFM_TAGS = ['tada', 'jelly', 'twitch', 'shake', 'spin', 'jump', 'bounce', 'flip', 'x2', 'x3', 'x4', 'scale', 'position', 'fg', 'bg', 'font', 'blur', 'rainbow', 'sparkle', 'rotate'];