summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMeiMei <30769358+mei23@users.noreply.github.com>2018-12-11 20:18:12 +0900
committersyuilo <Syuilotan@yahoo.co.jp>2018-12-11 20:18:12 +0900
commit638d81b66ee48bab0264ab9bb71fd3feddad5a14 (patch)
treed2301331fef5df8eded0b7b065173045d9121a6f /src
parentUpdate ja-JP.yml (diff)
downloadsharkey-638d81b66ee48bab0264ab9bb71fd3feddad5a14.tar.gz
sharkey-638d81b66ee48bab0264ab9bb71fd3feddad5a14.tar.bz2
sharkey-638d81b66ee48bab0264ab9bb71fd3feddad5a14.zip
Show user fields (#3590)
Diffstat (limited to 'src')
-rw-r--r--src/client/app/desktop/views/pages/deck/deck.user-column.vue33
-rw-r--r--src/client/app/desktop/views/pages/user/user.header.vue35
-rw-r--r--src/client/app/mobile/views/pages/user.vue35
-rw-r--r--src/mfm/html-to-mfm.ts2
-rw-r--r--src/models/user.ts4
-rw-r--r--src/remote/activitypub/models/person.ts23
-rw-r--r--src/remote/activitypub/models/tag.ts1
7 files changed, 132 insertions, 1 deletions
diff --git a/src/client/app/desktop/views/pages/deck/deck.user-column.vue b/src/client/app/desktop/views/pages/deck/deck.user-column.vue
index ddfb4310bc..6f0b38434f 100644
--- a/src/client/app/desktop/views/pages/deck/deck.user-column.vue
+++ b/src/client/app/desktop/views/pages/deck/deck.user-column.vue
@@ -26,6 +26,14 @@
<div class="description">
<misskey-flavored-markdown v-if="user.description" :text="user.description" :author="user" :i="$store.state.i" :custom-emojis="user.emojis"/>
</div>
+ <div class="fields" v-if="user.fields">
+ <dl class="field" v-for="(field, i) in user.fields" :key="i">
+ <dt class="name">{{ field.name }}</dt>
+ <dd class="value">
+ <misskey-flavored-markdown :text="field.value" :author="user" :i="$store.state.i" :custom-emojis="user.emojis"/>
+ </dd>
+ </dl>
+ </div>
<div class="counts">
<div>
<b>{{ user.notesCount | number }}</b>
@@ -416,6 +424,31 @@ export default Vue.extend({
border-right solid 16px transparent
border-bottom solid 16px var(--face)
+ > .fields
+ margin-top 8px
+
+ > .field
+ display flex
+ padding 0
+ margin 0
+
+ > .name
+ padding 4px
+ margin 4px
+ width 30%
+ overflow hidden
+ white-space nowrap
+ text-overflow ellipsis
+ font-weight bold
+
+ > .value
+ padding 4px
+ margin 4px
+ width 70%
+ overflow hidden
+ white-space nowrap
+ text-overflow ellipsis
+
> .counts
display grid
grid-template-columns 1fr 1fr 1fr
diff --git a/src/client/app/desktop/views/pages/user/user.header.vue b/src/client/app/desktop/views/pages/user/user.header.vue
index e451e770c3..f9b4f53aed 100644
--- a/src/client/app/desktop/views/pages/user/user.header.vue
+++ b/src/client/app/desktop/views/pages/user/user.header.vue
@@ -18,6 +18,14 @@
<div class="description">
<misskey-flavored-markdown v-if="user.description" :text="user.description" :author="user" :i="$store.state.i" :custom-emojis="user.emojis"/>
</div>
+ <div class="fields" v-if="user.fields">
+ <dl class="field" v-for="(field, i) in user.fields" :key="i">
+ <dt class="name">{{ field.name }}</dt>
+ <dd class="value">
+ <misskey-flavored-markdown :text="field.value" :author="user" :i="$store.state.i" :custom-emojis="user.emojis"/>
+ </dd>
+ </dl>
+ </div>
<div class="info">
<span class="location" v-if="user.host === null && user.profile.location"><fa icon="map-marker"/> {{ user.profile.location }}</span>
<span class="birthday" v-if="user.host === null && user.profile.birthday"><fa icon="birthday-cake"/> {{ user.profile.birthday.replace('-', $t('year')).replace('-', $t('month')) + $t('day') }} ({{ $t('years-old', { age }) }})</span>
@@ -174,6 +182,33 @@ export default Vue.extend({
padding 16px 16px 16px 154px
color var(--text)
+ > .fields
+ margin-top 16px
+
+ > .field
+ display flex
+ padding 0
+ margin 0
+
+ > .name
+ border-right solid 1px var(--faceDivider)
+ padding 4px
+ margin 4px
+ width 30%
+ overflow hidden
+ white-space nowrap
+ text-overflow ellipsis
+ font-weight bold
+ text-align center
+
+ > .value
+ padding 4px
+ margin 4px
+ width 70%
+ overflow hidden
+ white-space nowrap
+ text-overflow ellipsis
+
> .info
margin-top 16px
padding-top 16px
diff --git a/src/client/app/mobile/views/pages/user.vue b/src/client/app/mobile/views/pages/user.vue
index 804168a187..dc03f10f91 100644
--- a/src/client/app/mobile/views/pages/user.vue
+++ b/src/client/app/mobile/views/pages/user.vue
@@ -24,6 +24,14 @@
<div class="description">
<misskey-flavored-markdown v-if="user.description" :text="user.description" :author="user" :i="$store.state.i" :custom-emojis="user.emojis"/>
</div>
+ <div class="fields" v-if="user.fields">
+ <dl class="field" v-for="(field, i) in user.fields" :key="i">
+ <dt class="name">{{ field.name }}</dt>
+ <dd class="value">
+ <misskey-flavored-markdown :text="field.value" :author="user" :i="$store.state.i" :custom-emojis="user.emojis"/>
+ </dd>
+ </dl>
+ </div>
<div class="info">
<p class="location" v-if="user.host === null && user.profile.location">
<fa icon="map-marker"/>{{ user.profile.location }}
@@ -301,6 +309,33 @@ main
margin 8px 0
color var(--mobileUserPageDescription)
+ > .fields
+ margin 8px 0
+
+ > .field
+ display flex
+ padding 0
+ margin 0
+
+ > .name
+ padding 4px
+ margin 4px
+ width 30%
+ overflow hidden
+ white-space nowrap
+ text-overflow ellipsis
+ font-weight bold
+ color var(--mobileUserPageStatusHighlight)
+
+ > .value
+ padding 4px
+ margin 4px
+ width 70%
+ overflow hidden
+ white-space nowrap
+ text-overflow ellipsis
+ color var(--mobileUserPageStatusHighlight)
+
> .info
margin 8px 0
diff --git a/src/mfm/html-to-mfm.ts b/src/mfm/html-to-mfm.ts
index aa887c5560..9a9fbbb86c 100644
--- a/src/mfm/html-to-mfm.ts
+++ b/src/mfm/html-to-mfm.ts
@@ -41,7 +41,7 @@ export default function(html: string): string {
if ((rel && rel.value.match('tag') !== null) || !href || href.value == txt) {
text += txt;
// メンション
- } else if (txt.startsWith('@')) {
+ } else if (txt.startsWith('@') && !rel || !rel.value.match(/^me /)) {
const part = txt.split('@');
if (part.length == 2) {
diff --git a/src/models/user.ts b/src/models/user.ts
index 90c74fe279..0b19ffa7ba 100644
--- a/src/models/user.ts
+++ b/src/models/user.ts
@@ -109,6 +109,10 @@ export interface ILocalUser extends IUserBase {
birthday: string; // 'YYYY-MM-DD'
tags: string[];
};
+ fields?: {
+ name: string;
+ value: string;
+ }[];
isCat: boolean;
isAdmin?: boolean;
isModerator?: boolean;
diff --git a/src/remote/activitypub/models/person.ts b/src/remote/activitypub/models/person.ts
index 9bbc41e628..6f62da5ca7 100644
--- a/src/remote/activitypub/models/person.ts
+++ b/src/remote/activitypub/models/person.ts
@@ -17,6 +17,7 @@ import registerInstance from '../../../services/register-instance';
import Instance from '../../../models/instance';
import getDriveFileUrl from '../../../misc/get-drive-file-url';
import { IEmoji } from '../../../models/emoji';
+import { ITag } from './tag';
const log = debug('misskey:activitypub');
@@ -135,6 +136,10 @@ export async function createPerson(uri: string, resolver?: Resolver): Promise<IU
const host = toUnicode(new URL(object.id).hostname.toLowerCase());
+ const fields = await extractFields(person.attachment).catch(e => {
+ console.log(`cat not extract fields: ${e}`);
+ });
+
const isBot = object.type == 'Service';
// Create user
@@ -164,6 +169,7 @@ export async function createPerson(uri: string, resolver?: Resolver): Promise<IU
endpoints: person.endpoints,
uri: person.id,
url: person.url,
+ fields,
isBot: isBot,
isCat: (person as any).isCat === true
}) as IRemoteUser;
@@ -325,6 +331,10 @@ export async function updatePerson(uri: string, resolver?: Resolver, hint?: obje
const emojiNames = emojis.map(emoji => emoji.name);
+ const fields = await extractFields(person.attachment).catch(e => {
+ console.log(`cat not extract fields: ${e}`);
+ });
+
// Update user
await User.update({ _id: exist._id }, {
$set: {
@@ -346,6 +356,7 @@ export async function updatePerson(uri: string, resolver?: Resolver, hint?: obje
name: person.name,
url: person.url,
endpoints: person.endpoints,
+ fields,
isBot: object.type == 'Service',
isCat: (person as any).isCat === true,
isLocked: person.manuallyApprovesFollowers,
@@ -382,6 +393,18 @@ export async function resolvePerson(uri: string, verifier?: string, resolver?: R
return await createPerson(uri, resolver);
}
+export async function extractFields(attachments: ITag[]) {
+ if (!attachments) return [];
+
+ return attachments.filter(a => a.type === 'PropertyValue' && a.name && a.value)
+ .map(a => {
+ return {
+ name: a.name,
+ value: htmlToMFM(a.value)
+ };
+ });
+}
+
export async function updateFeatured(userId: mongo.ObjectID) {
const user = await User.findOne({ _id: userId });
if (!isRemoteUser(user)) return;
diff --git a/src/remote/activitypub/models/tag.ts b/src/remote/activitypub/models/tag.ts
index 5cdbfa43b1..7c9b41eb22 100644
--- a/src/remote/activitypub/models/tag.ts
+++ b/src/remote/activitypub/models/tag.ts
@@ -7,6 +7,7 @@ export type ITag = {
id: string;
type: string;
name?: string;
+ value?: string;
updated?: Date;
icon?: IIcon;
};