diff options
| author | syuilo <Syuilotan@yahoo.co.jp> | 2021-10-24 21:02:50 +0900 |
|---|---|---|
| committer | syuilo <Syuilotan@yahoo.co.jp> | 2021-10-24 21:02:50 +0900 |
| commit | 09f4885f8975c935861ddef01f4cdb83c4a185d9 (patch) | |
| tree | b561a408f6683a7cf52b0dfaff57d67310bada35 /src | |
| parent | :art: (diff) | |
| download | sharkey-09f4885f8975c935861ddef01f4cdb83c4a185d9.tar.gz sharkey-09f4885f8975c935861ddef01f4cdb83c4a185d9.tar.bz2 sharkey-09f4885f8975c935861ddef01f4cdb83c4a185d9.zip | |
feat(client): メンションにユーザーのアバターを表示するように
Resolve #350
Diffstat (limited to 'src')
| -rw-r--r-- | src/client/components/mention.vue | 8 | ||||
| -rw-r--r-- | src/models/repositories/user.ts | 10 | ||||
| -rw-r--r-- | src/server/index.ts | 18 |
3 files changed, 34 insertions, 2 deletions
diff --git a/src/client/components/mention.vue b/src/client/components/mention.vue index b9bd6b320b..101a9020ee 100644 --- a/src/client/components/mention.vue +++ b/src/client/components/mention.vue @@ -1,6 +1,7 @@ <template> <MkA class="ldlomzub" :class="{ isMe }" :to="url" v-user-preview="canonical" v-if="url.startsWith('/')"> <span class="me" v-if="isMe">{{ $ts.you }}</span> + <img class="icon" :src="`/avatar/@${username}@${host}`" alt=""> <span class="main"> <span class="username">@{{ username }}</span> <span class="host" v-if="(host != localHost) || $store.state.showFullAcct">@{{ toUnicode(host) }}</span> @@ -76,6 +77,13 @@ export default defineComponent({ vertical-align: top; } + > .icon { + width: 1.5em; + margin: 0 0.2em; + vertical-align: bottom; + border-radius: 100%; + } + > .main { > .host { opacity: 0.5; diff --git a/src/models/repositories/user.ts b/src/models/repositories/user.ts index 2b77b613a8..72cefbaac5 100644 --- a/src/models/repositories/user.ts +++ b/src/models/repositories/user.ts @@ -155,6 +155,14 @@ export class UserRepository extends Repository<User> { ); } + public getAvatarUrl(user: User): string { + if (user.avatarUrl) { + return user.avatarUrl; + } else { + return `${config.url}/random-avatar/${user.id}`; + } + } + public async pack( src: User['id'] | User, me?: { id: User['id'] } | null | undefined, @@ -186,7 +194,7 @@ export class UserRepository extends Repository<User> { name: user.name, username: user.username, host: user.host, - avatarUrl: user.avatarUrl ? user.avatarUrl : config.url + '/avatar/' + user.id, + avatarUrl: this.getAvatarUrl(user), avatarBlurhash: user.avatarBlurhash, avatarColor: null, // 後方互換性のため isAdmin: user.isAdmin || falsy, diff --git a/src/server/index.ts b/src/server/index.ts index c891596140..5e1a12e4d3 100644 --- a/src/server/index.ts +++ b/src/server/index.ts @@ -26,6 +26,7 @@ import { networkChart } from '@/services/chart/index'; import { genAvatar } from '@/misc/gen-avatar'; import { createTemp } from '@/misc/create-temp'; import { publishMainStream } from '@/services/stream'; +import { parseAcct } from '@/misc/acct'; export const serverLogger = new Logger('server', 'gray', false); @@ -68,7 +69,22 @@ router.use(activityPub.routes()); router.use(nodeinfo.routes()); router.use(wellKnown.routes()); -router.get('/avatar/:x', async ctx => { +router.get('/avatar/@:acct', async ctx => { + const { username, host } = parseAcct(ctx.params.acct); + const user = await Users.findOne({ + usernameLower: username.toLowerCase(), + host: host === config.host ? null : host, + isSuspended: false + }); + + if (user) { + ctx.redirect(Users.getAvatarUrl(user)); + } else { + ctx.redirect('/static-assets/user-unknown.png'); + } +}); + +router.get('/random-avatar/:x', async ctx => { const [temp] = await createTemp(); await genAvatar(ctx.params.x, fs.createWriteStream(temp)); ctx.set('Content-Type', 'image/png'); |