diff options
| author | syuilo <Syuilotan@yahoo.co.jp> | 2023-01-22 21:01:52 +0900 |
|---|---|---|
| committer | syuilo <Syuilotan@yahoo.co.jp> | 2023-01-22 21:01:52 +0900 |
| commit | 09f4b9e5464f7fe15d4ee426452a68bb60495876 (patch) | |
| tree | 8953113f437366f38bc101bd263403cf60d39bc6 | |
| parent | Merge branch 'develop' (diff) | |
| parent | 13.1.7 (diff) | |
| download | misskey-09f4b9e5464f7fe15d4ee426452a68bb60495876.tar.gz misskey-09f4b9e5464f7fe15d4ee426452a68bb60495876.tar.bz2 misskey-09f4b9e5464f7fe15d4ee426452a68bb60495876.zip | |
Merge branch 'develop'
| -rw-r--r-- | CHANGELOG.md | 6 | ||||
| -rw-r--r-- | locales/it-IT.yml | 5 | ||||
| -rw-r--r-- | locales/ja-JP.yml | 6 | ||||
| -rw-r--r-- | locales/uk-UA.yml | 9 | ||||
| -rw-r--r-- | locales/zh-CN.yml | 2 | ||||
| -rw-r--r-- | locales/zh-TW.yml | 70 | ||||
| -rw-r--r-- | package.json | 2 | ||||
| -rw-r--r-- | packages/backend/src/core/AchievementService.ts | 2 | ||||
| -rw-r--r-- | packages/frontend/src/components/mfm.ts | 6 | ||||
| -rw-r--r-- | packages/frontend/src/pages/about-misskey.vue | 117 | ||||
| -rw-r--r-- | packages/frontend/src/pages/about.vue | 9 | ||||
| -rw-r--r-- | packages/frontend/src/scripts/achievements.ts | 15 | ||||
| -rw-r--r-- | packages/frontend/src/scripts/mfm-tags.ts | 2 |
13 files changed, 200 insertions, 51 deletions
diff --git a/CHANGELOG.md b/CHANGELOG.md index c1ff53fd0c..2b820f22c3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,12 @@ 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) ### Improvements diff --git a/locales/it-IT.yml b/locales/it-IT.yml index c5d89a0f55..1726a84ff8 100644 --- a/locales/it-IT.yml +++ b/locales/it-IT.yml @@ -95,7 +95,7 @@ follow: "Segui" followRequest: "Richiesta di follow" followRequests: "Richieste di follow" unfollow: "Smetti di seguire" -followRequestPending: "La richiesta di follow deve essere approvata" +followRequestPending: "Richiesta in approvazione" enterEmoji: "Inserisci emoji" renote: "Rinota" unrenote: "Annulla rinota" @@ -1048,6 +1048,9 @@ _achievements: _noteFavorited1: title: "Guarda le stelle" description: "Aggiungi una Nota ai preferiti per la prima volta" + _myNoteFavorited1: + title: "Fornitura stelline" + description: "Qualcuno ha preferito una delle tue Note" _profileFilled: title: "Perfettamente" description: "Imposta il tuo profilo" diff --git a/locales/ja-JP.yml b/locales/ja-JP.yml index 57296b9857..a241d54b47 100644 --- a/locales/ja-JP.yml +++ b/locales/ja-JP.yml @@ -1105,6 +1105,9 @@ _achievements: title: "I Love Misskey" description: "\"I ❤ #Misskey\"を投稿した" flavor: "Misskeyを使ってくださりありがとうございます! by 開発チーム" + _foundTreasure: + title: "宝探し" + description: "隠されたお宝を発見した" _client30min: title: "ひとやすみ" description: "クライアントを起動してから30分以上経過した" @@ -1125,6 +1128,9 @@ _achievements: _htl20npm: title: "流れるTL" description: "ホームタイムラインの流速が20npmを越す" + _viewInstanceChart: + title: "アナリスト" + description: "インスタンスのチャートを表示した" _outputHelloWorldOnScratchpad: title: "Hello, world!" description: "スクラッチパッドで hello world を出力した" diff --git a/locales/uk-UA.yml b/locales/uk-UA.yml index 6ca8d7059d..ddb13d875d 100644 --- a/locales/uk-UA.yml +++ b/locales/uk-UA.yml @@ -899,6 +899,15 @@ unlike: "Не вподобати" numberOfLikes: "Вподобання" show: "Відображення" color: "Колір" +achievements: "Досягнення" +_achievements: + _types: + _notes1: + title: "налаштовую свій msky" + description: "Перша нотатка" + flavor: "Приємного часу з Misskey!" + _notes10: + title: "Декілька нотаток" _role: priority: "Пріоритет" _priority: diff --git a/locales/zh-CN.yml b/locales/zh-CN.yml index 22c45f5167..433af4c836 100644 --- a/locales/zh-CN.yml +++ b/locales/zh-CN.yml @@ -956,7 +956,7 @@ _achievements: title: "满是帖子" description: "发布了500篇帖子" _notes1000: - title: "帖子成山" + title: "积帖成山" description: "发布了1,000篇帖子" _notes5000: title: "帖如泉涌" diff --git a/locales/zh-TW.yml b/locales/zh-TW.yml index 4c7e5fb19f..a8a06528d2 100644 --- a/locales/zh-TW.yml +++ b/locales/zh-TW.yml @@ -1047,25 +1047,59 @@ _achievements: description: "第一次將貼文收進摘錄" _noteFavorited1: title: "觀星者" - description: "第一次將貼文收進我的最愛" + description: "第一次將貼文收藏至我的最愛" + _myNoteFavorited1: + title: "想要星星" + description: "自己的貼文被他人收藏至「我的最愛」了" _profileFilled: title: "有備而來" description: "設定了個人檔案" _markedAsCat: title: "我是貓" 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: title: "基站" - description: "超過500名追隨者" + description: "超過500名追隨者了" _followers1000: title: "影響者" - description: "超過1000名追隨者" + description: "超過1000名追隨者了" _collectAchievements30: title: "成就收藏家" description: "獲得30個以上的成就" _viewAchievements3min: title: "喜愛成就" - description: "看成就列表要花了3分鐘以上" + description: "看成就列表要花3分鐘以上" _iLoveMisskey: title: "I Love Misskey" description: "發布「I ❤ #Misskey」" @@ -1083,6 +1117,7 @@ _achievements: _postedAt0min0sec: title: "報時" description: "在0分0秒發佈貼文" + flavor: "啵.啵.啵.嗶ー" _selfQuote: title: "自我引用" description: "引用了自己的貼文" @@ -1094,7 +1129,7 @@ _achievements: description: "在暫存記憶體輸出了 hello world" _open3windows: title: "多重視窗" - description: "開啟3個以上的視窗" + description: "開啟了3個以上的視窗" _driveFolderCircularReference: title: "循環引用" description: "試圖遞迴套入雲端硬碟資料夾" @@ -1110,6 +1145,30 @@ _achievements: _setNameToSyuilo: title: "神的情結" 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: new: "建立角色" edit: "編輯角色" @@ -1759,6 +1818,7 @@ _notification: pollEnded: "問卷調查已產生結果" unreadAntennaNote: "天線 {name}" emptyPushNotificationMessage: "推送通知已更新" + achievementEarned: "獲得成就" _types: all: "全部 " follow: "追隨中" diff --git a/package.json b/package.json index 7c1db9cc66..31033bafe3 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "misskey", - "version": "13.1.6", + "version": "13.1.7", "codename": "nasubi", "repository": { "type": "git", diff --git a/packages/backend/src/core/AchievementService.ts b/packages/backend/src/core/AchievementService.ts index be763e4629..5fd9c451ce 100644 --- a/packages/backend/src/core/AchievementService.ts +++ b/packages/backend/src/core/AchievementService.ts @@ -62,12 +62,14 @@ const ACHIEVEMENT_TYPES = [ 'collectAchievements30', 'viewAchievements3min', 'iLoveMisskey', + 'foundTreasure', 'client30min', 'noteDeletedWithin1min', 'postedAtLateNight', 'postedAt0min0sec', 'selfQuote', 'htl20npm', + 'viewInstanceChart', 'outputHelloWorldOnScratchpad', 'open3windows', 'driveFolderCircularReference', diff --git a/packages/frontend/src/components/mfm.ts b/packages/frontend/src/components/mfm.ts index 9421625c9e..91875de9cf 100644 --- a/packages/frontend/src/components/mfm.ts +++ b/packages/frontend/src/components/mfm.ts @@ -200,6 +200,12 @@ export default defineComponent({ style = `transform: translateX(${x}em) translateY(${y}em);`; 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': { let color = token.props.args.color; if (!/^[0-9a-f]{3,6}$/i.test(color)) color = 'f00'; diff --git a/packages/frontend/src/pages/about-misskey.vue b/packages/frontend/src/pages/about-misskey.vue index 1c3535a833..82f4e30a45 100644 --- a/packages/frontend/src/pages/about-misskey.vue +++ b/packages/frontend/src/pages/about-misskey.vue @@ -4,11 +4,14 @@ <div style="overflow: clip;"> <MkSpacer :content-max="600" :margin-min="20"> <div class="_gaps_m znqjceqz"> - <div ref="containerEl" v-panel class="about" :class="{ playing: easterEggEngine != null }"> - <img src="/client-assets/about-icon.png" alt="" class="icon" draggable="false" @load="iconLoaded" @click="gravity"/> - <div class="misskey">Misskey</div> - <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 v-panel class="about"> + <div ref="containerEl" class="container" :class="{ playing: easterEggEngine != null }"> + <img src="/client-assets/about-icon.png" alt="" class="icon" draggable="false" @load="iconLoaded" @click="gravity"/> + <div class="misskey">Misskey</div> + <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 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> @@ -70,6 +73,8 @@ import { i18n } from '@/i18n'; import { defaultStore } from '@/store'; import * as os from '@/os'; import { definePageMetadata } from '@/scripts/page-metadata'; +import { claimAchievement, claimedAchievements } from '@/scripts/achievements'; +import { $i } from '@/account'; const patrons = [ 'まっちゃとーにゅ', @@ -152,6 +157,8 @@ const patrons = [ 'pixeldesu', ]; +let thereIsTreasure = $ref($i && !claimedAchievements.includes('foundTreasure')); + let easterEggReady = false; let easterEggEmojis = $ref([]); let easterEggEngine = $ref(null); @@ -187,6 +194,11 @@ function iLoveMisskey() { }); } +function getTreasure() { + thereIsTreasure = false; + claimAchievement('foundTreasure'); +} + onBeforeUnmount(() => { if (easterEggEngine) { easterEggEngine.stop(); @@ -207,52 +219,77 @@ definePageMetadata({ .znqjceqz { > .about { position: relative; - text-align: center; - padding: 16px; border-radius: var(--radius); - &.playing { - &, * { - user-select: none; - } - - * { - will-change: transform; - } + > .treasure { + position: absolute; + top: 60px; + left: 0; + right: 0; + margin: 0 auto; + width: min-content; - > .emoji { - visibility: visible; + > .treasureImg { + width: 25px; + vertical-align: bottom; } } - > .icon { - display: block; - width: 80px; - margin: 0 auto; - border-radius: 16px; - } + > .container { + position: relative; + text-align: center; + padding: 16px; - > .misskey { - margin: 0.75em auto 0 auto; - width: max-content; - } + &.playing { + &, * { + user-select: none; + } - > .version { - margin: 0 auto; - width: max-content; - opacity: 0.5; - } + * { + will-change: transform; + } - > .emoji { - position: absolute; - top: 0; - left: 0; - visibility: hidden; + > .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 { - pointer-events: none; - font-size: 24px; - width: 24px; + position: absolute; + z-index: 1; + top: 0; + left: 0; + visibility: hidden; + + > .emoji { + pointer-events: none; + font-size: 24px; + width: 24px; + } } } } diff --git a/packages/frontend/src/pages/about.vue b/packages/frontend/src/pages/about.vue index 4d971c5a9f..e5b9aecc61 100644 --- a/packages/frontend/src/pages/about.vue +++ b/packages/frontend/src/pages/about.vue @@ -86,7 +86,7 @@ </template> <script lang="ts" setup> -import { ref, computed } from 'vue'; +import { ref, computed, watch } from 'vue'; import XEmojis from './about.emojis.vue'; import XFederation from './about.federation.vue'; import { version, instanceName, host } from '@/config'; @@ -100,6 +100,7 @@ import * as os from '@/os'; import number from '@/filters/number'; import { i18n } from '@/i18n'; import { definePageMetadata } from '@/scripts/page-metadata'; +import { claimAchievement } from '@/scripts/achievements'; const props = withDefaults(defineProps<{ initialTab?: string; @@ -110,6 +111,12 @@ const props = withDefaults(defineProps<{ let stats = $ref(null); let tab = $ref(props.initialTab); +watch($$(tab), () => { + if (tab === 'charts') { + claimAchievement('viewInstanceChart'); + } +}); + const initStats = () => os.api('stats', { }).then((res) => { stats = res; diff --git a/packages/frontend/src/scripts/achievements.ts b/packages/frontend/src/scripts/achievements.ts index f511fce3ea..c77f8e12d3 100644 --- a/packages/frontend/src/scripts/achievements.ts +++ b/packages/frontend/src/scripts/achievements.ts @@ -58,12 +58,14 @@ export const ACHIEVEMENT_TYPES = [ 'collectAchievements30', 'viewAchievements3min', 'iLoveMisskey', + 'foundTreasure', 'client30min', 'noteDeletedWithin1min', 'postedAtLateNight', 'postedAt0min0sec', 'selfQuote', 'htl20npm', + 'viewInstanceChart', 'outputHelloWorldOnScratchpad', 'open3windows', 'driveFolderCircularReference', @@ -331,6 +333,11 @@ export const ACHIEVEMENT_BADGES = { bg: 'linear-gradient(0deg, rgb(255 77 77), rgb(247 155 214))', frame: 'silver', }, + 'foundTreasure': { + img: '/fluent-emoji/1f3c6.png', + bg: 'linear-gradient(0deg, rgb(197 69 192), rgb(2 112 155))', + frame: 'gold', + }, 'client30min': { img: '/fluent-emoji/1f552.png', 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))', frame: 'bronze', }, + 'viewInstanceChart': { + img: '/fluent-emoji/1f4ca.png', + bg: 'linear-gradient(0deg, rgb(58 231 198), rgb(37 194 255))', + frame: 'bronze', + }, 'outputHelloWorldOnScratchpad': { img: '/fluent-emoji/1f530.png', 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'; }>; -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>(); export async function claimAchievement(type: typeof ACHIEVEMENT_TYPES[number]) { + if ($i == null) return; if (claimedAchievements.includes(type)) return; claimingQueue.add(type); claimedAchievements.push(type); diff --git a/packages/frontend/src/scripts/mfm-tags.ts b/packages/frontend/src/scripts/mfm-tags.ts index be944a7139..a84198282d 100644 --- a/packages/frontend/src/scripts/mfm-tags.ts +++ b/packages/frontend/src/scripts/mfm-tags.ts @@ -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']; |