summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorsyuilo <Syuilotan@yahoo.co.jp>2021-10-24 21:02:50 +0900
committersyuilo <Syuilotan@yahoo.co.jp>2021-10-24 21:02:50 +0900
commit09f4885f8975c935861ddef01f4cdb83c4a185d9 (patch)
treeb561a408f6683a7cf52b0dfaff57d67310bada35 /src
parent:art: (diff)
downloadsharkey-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.vue8
-rw-r--r--src/models/repositories/user.ts10
-rw-r--r--src/server/index.ts18
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');