Compare commits
26 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
9c32118b77 | ||
|
|
ecf2eb4738 | ||
|
|
699879d95d | ||
|
|
6677508ba7 | ||
|
|
58da32358b | ||
|
|
b9eafeee3f | ||
|
|
c56ff5d88d | ||
|
|
9a295a85b1 | ||
|
|
7135c0e308 | ||
|
|
1962bfb4a5 | ||
|
|
a1fca2550e | ||
|
|
fa7c8cfe5b | ||
|
|
08a59591ae | ||
|
|
a09a244242 | ||
|
|
483a61d90d | ||
|
|
385fb7586b | ||
|
|
2488d40421 | ||
|
|
bf7875bfaa | ||
|
|
a84fa30774 | ||
|
|
c19a763b3d | ||
|
|
0875460974 | ||
|
|
f0b08d3936 | ||
|
|
16520c7b4c | ||
|
|
65549d06d9 | ||
|
|
ce2d2a10c1 | ||
|
|
0ebe801af4 |
@@ -138,3 +138,6 @@ drive:
|
||||
|
||||
# Clustering
|
||||
# clusterLimit: 1
|
||||
|
||||
# Summaly proxy
|
||||
# summalyProxy: "http://example.com"
|
||||
|
||||
@@ -732,6 +732,7 @@ desktop/views/components/settings.vue:
|
||||
gradient-window-header: "ウィンドウのタイトルバーにグラデーションを使用"
|
||||
post-form-on-timeline: "タイムライン上部に投稿フォームを表示する"
|
||||
suggest-recent-hashtags: "最近のハッシュタグを投稿フォームに表示する"
|
||||
show-clock-on-header: "右上に時計を表示する"
|
||||
show-reply-target: "リプライ先を表示する"
|
||||
show-my-renotes: "自分の行ったRenoteをタイムラインに表示する"
|
||||
show-renoted-my-notes: "自分の投稿のRenoteをタイムラインに表示する"
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
{
|
||||
"name": "misskey",
|
||||
"author": "syuilo <i@syuilo.com>",
|
||||
"version": "8.12.0",
|
||||
"clientVersion": "1.0.8981",
|
||||
"version": "8.14.0",
|
||||
"clientVersion": "1.0.9022",
|
||||
"codename": "nighthike",
|
||||
"main": "./built/index.js",
|
||||
"private": true,
|
||||
@@ -194,7 +194,7 @@
|
||||
"stylus": "0.54.5",
|
||||
"stylus-loader": "3.0.2",
|
||||
"summaly": "2.1.4",
|
||||
"systeminformation": "3.42.9",
|
||||
"systeminformation": "3.43.0",
|
||||
"syuilo-password-strength": "0.0.1",
|
||||
"textarea-caret": "3.1.0",
|
||||
"tmp": "0.0.33",
|
||||
|
||||
@@ -51,8 +51,9 @@
|
||||
}
|
||||
}
|
||||
|
||||
if (settings) {
|
||||
if (settings.device.lang) lang = settings.device.lang;
|
||||
if (settings && settings.device.lang &&
|
||||
LANGS.includes(settings.device.lang)) {
|
||||
lang = settings.device.lang;
|
||||
}
|
||||
//#endregion
|
||||
|
||||
|
||||
@@ -26,8 +26,8 @@ export default Vue.extend({
|
||||
},
|
||||
created() {
|
||||
(this as any).os.getMeta().then(meta => {
|
||||
if (meta.repositoryUrl) this.repositoryUrl = meta.repositoryUrl;
|
||||
if (meta.feedbackUrl) this.feedbackUrl = meta.feedbackUrl;
|
||||
if (meta.maintainer.repository_url) this.repositoryUrl = meta.maintainer.repository_url;
|
||||
if (meta.maintainer.feedback_url) this.feedbackUrl = meta.maintainer.feedback_url;
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
@@ -394,7 +394,7 @@ export default Vue.extend({
|
||||
yAxes: [{
|
||||
ticks: {
|
||||
callback: value => {
|
||||
return Vue.filter('bytes')(value);
|
||||
return Vue.filter('bytes')(value, 1);
|
||||
}
|
||||
}
|
||||
}]
|
||||
@@ -403,7 +403,7 @@ export default Vue.extend({
|
||||
callbacks: {
|
||||
label: (tooltipItem, data) => {
|
||||
const label = data.datasets[tooltipItem.datasetIndex].label || '';
|
||||
return `${label}: ${Vue.filter('bytes')(tooltipItem.yLabel)}`;
|
||||
return `${label}: ${Vue.filter('bytes')(tooltipItem.yLabel, 1)}`;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -49,6 +49,7 @@
|
||||
</div>
|
||||
<mk-switch v-model="$store.state.settings.showPostFormOnTopOfTl" @change="onChangeShowPostFormOnTopOfTl" text="%i18n:@post-form-on-timeline%"/>
|
||||
<mk-switch v-model="$store.state.settings.suggestRecentHashtags" @change="onChangeSuggestRecentHashtags" text="%i18n:@suggest-recent-hashtags%"/>
|
||||
<mk-switch v-model="$store.state.settings.showClockOnHeader" @change="onChangeShowClockOnHeader" text="%i18n:@show-clock-on-header%"/>
|
||||
<mk-switch v-model="$store.state.settings.showReplyTarget" @change="onChangeShowReplyTarget" text="%i18n:@show-reply-target%"/>
|
||||
<mk-switch v-model="$store.state.settings.showMyRenotes" @change="onChangeShowMyRenotes" text="%i18n:@show-my-renotes%"/>
|
||||
<mk-switch v-model="$store.state.settings.showRenotedMyNotes" @change="onChangeShowRenotedMyNotes" text="%i18n:@show-renoted-my-notes%"/>
|
||||
@@ -333,6 +334,12 @@ export default Vue.extend({
|
||||
value: v
|
||||
});
|
||||
},
|
||||
onChangeShowClockOnHeader(v) {
|
||||
this.$store.dispatch('settings/set', {
|
||||
key: 'showClockOnHeader',
|
||||
value: v
|
||||
});
|
||||
},
|
||||
onChangeShowReplyTarget(v) {
|
||||
this.$store.dispatch('settings/set', {
|
||||
key: 'showReplyTarget',
|
||||
|
||||
@@ -17,7 +17,7 @@
|
||||
<x-account v-if="$store.getters.isSignedIn"/>
|
||||
<x-notifications v-if="$store.getters.isSignedIn"/>
|
||||
<x-post v-if="$store.getters.isSignedIn"/>
|
||||
<x-clock/>
|
||||
<x-clock v-if="$store.state.settings.showClockOnHeader"/>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -48,7 +48,7 @@ export default Vue.extend({
|
||||
this.open();
|
||||
});
|
||||
} else {
|
||||
const query = this.user[0] == '@' ?
|
||||
const query = this.user.startsWith('@') ?
|
||||
parseAcct(this.user.substr(1)) :
|
||||
{ userId: this.user };
|
||||
|
||||
|
||||
@@ -4,8 +4,8 @@
|
||||
<div v-if="stats" class="stats">
|
||||
<div><b>%fa:user% {{ stats.originalUsersCount | number }}</b><span>%i18n:@original-users%</span></div>
|
||||
<div><span>%fa:user% {{ stats.usersCount | number }}</span><span>%i18n:@all-users%</span></div>
|
||||
<div><b>%fa:pen% {{ stats.originalNotesCount | number }}</b><span>%i18n:@original-notes%</span></div>
|
||||
<div><span>%fa:pen% {{ stats.notesCount | number }}</span><span>%i18n:@all-notes%</span></div>
|
||||
<div><b>%fa:pencil-alt% {{ stats.originalNotesCount | number }}</b><span>%i18n:@original-notes%</span></div>
|
||||
<div><span>%fa:pencil-alt% {{ stats.notesCount | number }}</span><span>%i18n:@all-notes%</span></div>
|
||||
</div>
|
||||
<div class="cpu-memory">
|
||||
<x-cpu-memory :connection="connection"/>
|
||||
|
||||
@@ -16,7 +16,7 @@ import Vue from 'vue';
|
||||
export default Vue.extend({
|
||||
data() {
|
||||
return {
|
||||
name: (this as any).os.instanceName,
|
||||
name: null,
|
||||
posted: false,
|
||||
text: new URLSearchParams(location.search).get('text')
|
||||
};
|
||||
@@ -25,6 +25,11 @@ export default Vue.extend({
|
||||
close() {
|
||||
window.close();
|
||||
}
|
||||
},
|
||||
mounted() {
|
||||
(this as any).os.getMeta().then(meta => {
|
||||
this.name = meta.name;
|
||||
});
|
||||
}
|
||||
});
|
||||
</script>
|
||||
|
||||
@@ -3,8 +3,8 @@
|
||||
<div v-if="stats" class="stats">
|
||||
<div><b>%fa:user% {{ stats.originalUsersCount | number }}</b><span>%i18n:@original-users%</span></div>
|
||||
<div><span>%fa:user% {{ stats.usersCount | number }}</span><span>%i18n:@all-users%</span></div>
|
||||
<div><b>%fa:pen% {{ stats.originalNotesCount | number }}</b><span>%i18n:@original-notes%</span></div>
|
||||
<div><span>%fa:pen% {{ stats.notesCount | number }}</span><span>%i18n:@all-notes%</span></div>
|
||||
<div><b>%fa:pencil-alt% {{ stats.originalNotesCount | number }}</b><span>%i18n:@original-notes%</span></div>
|
||||
<div><span>%fa:pencil-alt% {{ stats.notesCount | number }}</span><span>%i18n:@all-notes%</span></div>
|
||||
</div>
|
||||
<div>
|
||||
<x-charts/>
|
||||
|
||||
@@ -16,7 +16,7 @@ import Vue from 'vue';
|
||||
export default Vue.extend({
|
||||
data() {
|
||||
return {
|
||||
name: (this as any).os.instanceName,
|
||||
name: null,
|
||||
posted: false,
|
||||
text: new URLSearchParams(location.search).get('text')
|
||||
};
|
||||
@@ -25,6 +25,11 @@ export default Vue.extend({
|
||||
close() {
|
||||
window.close();
|
||||
}
|
||||
},
|
||||
mounted() {
|
||||
(this as any).os.getMeta().then(meta => {
|
||||
this.name = meta.name;
|
||||
});
|
||||
}
|
||||
});
|
||||
</script>
|
||||
|
||||
@@ -13,6 +13,7 @@ const defaultSettings = {
|
||||
showMaps: true,
|
||||
showPostFormOnTopOfTl: false,
|
||||
suggestRecentHashtags: true,
|
||||
showClockOnHeader: false,
|
||||
circleIcons: true,
|
||||
gradientWindowHeader: false,
|
||||
showReplyTarget: true,
|
||||
|
||||
@@ -62,6 +62,8 @@ export type Source = {
|
||||
*/
|
||||
ghost?: string;
|
||||
|
||||
summalyProxy?: string;
|
||||
|
||||
accesslog?: string;
|
||||
twitter?: {
|
||||
consumer_key: string;
|
||||
|
||||
@@ -197,7 +197,7 @@ const elements: Element[] = [
|
||||
|
||||
if (thisIsNotARegexp) return null;
|
||||
if (regexp == '') return null;
|
||||
if (regexp[0] == ' ' && regexp[regexp.length - 1] == ' ') return null;
|
||||
if (regexp.startsWith(' ') && regexp.endsWith(' ')) return null;
|
||||
|
||||
return {
|
||||
html: `<span class="regexp">/${escape(regexp)}/</span>`,
|
||||
|
||||
@@ -10,7 +10,7 @@ export type TextElementHashtag = {
|
||||
|
||||
export default function(text: string, i: number) {
|
||||
if (!(/^\s#[^\s]+/.test(text) || (i == 0 && /^#[^\s]+/.test(text)))) return null;
|
||||
const isHead = text[0] == '#';
|
||||
const isHead = text.startsWith('#');
|
||||
const hashtag = text.match(/^\s?#[^\s]+/)[0];
|
||||
const res: any[] = !isHead ? [{
|
||||
type: 'text',
|
||||
|
||||
@@ -13,7 +13,7 @@ export type TextElementLink = {
|
||||
export default function(text: string) {
|
||||
const match = text.match(/^\??\[([^\[\]]+?)\]\((https?:\/\/[\w\/:%#@\$&\?!\(\)\[\]~\.=\+\-]+?)\)/);
|
||||
if (!match) return null;
|
||||
const silent = text[0] == '?';
|
||||
const silent = text.startsWith('?');
|
||||
const link = match[0];
|
||||
const title = match[1];
|
||||
const url = match[2];
|
||||
|
||||
@@ -25,9 +25,9 @@ export const replacement = (match: string, key: string) => {
|
||||
arg == 'S' ? 'fas' :
|
||||
arg == 'B' ? 'fab' :
|
||||
'';
|
||||
} else if (arg[0] == '.') {
|
||||
} else if (arg.startsWith('.')) {
|
||||
classes.push('fa-' + arg.substr(1));
|
||||
} else if (arg[0] == '-') {
|
||||
} else if (arg.startsWith('-')) {
|
||||
transform = arg.substr(1).split('|').join(' ');
|
||||
} else {
|
||||
name = arg;
|
||||
|
||||
@@ -46,7 +46,7 @@ export default async (job: bq.Job, done: any): Promise<void> => {
|
||||
|
||||
// アクティビティを送信してきたユーザーがまだMisskeyサーバーに登録されていなかったら登録する
|
||||
if (user === null) {
|
||||
user = await resolvePerson(signature.keyId) as IRemoteUser;
|
||||
user = await resolvePerson(activity.actor) as IRemoteUser;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -166,8 +166,8 @@ export async function createPerson(value: any, resolver?: Resolver): Promise<IUs
|
||||
|
||||
const avatarId = avatar ? avatar._id : null;
|
||||
const bannerId = banner ? banner._id : null;
|
||||
const avatarUrl = avatar && avatar.metadata.url ? avatar.metadata.url : null;
|
||||
const bannerUrl = banner && banner.metadata.url ? banner.metadata.url : null;
|
||||
const avatarUrl = (avatar && avatar.metadata.thumbnailUrl) ? avatar.metadata.thumbnailUrl : (avatar && avatar.metadata.url) ? avatar.metadata.url : null;
|
||||
const bannerUrl = (banner && banner.metadata.url) ? banner.metadata.url : null;
|
||||
|
||||
await User.update({ _id: user._id }, {
|
||||
$set: {
|
||||
@@ -255,7 +255,7 @@ export async function updatePerson(value: string | IObject, resolver?: Resolver)
|
||||
sharedInbox: person.sharedInbox,
|
||||
avatarId: avatar ? avatar._id : null,
|
||||
bannerId: banner ? banner._id : null,
|
||||
avatarUrl: avatar && avatar.metadata.url ? avatar.metadata.url : null,
|
||||
avatarUrl: (avatar && avatar.metadata.thumbnailUrl) ? avatar.metadata.thumbnailUrl : (avatar && avatar.metadata.url) ? avatar.metadata.url : null,
|
||||
bannerUrl: banner && banner.metadata.url ? banner.metadata.url : null,
|
||||
description: htmlToMFM(person.summary),
|
||||
followersCount,
|
||||
|
||||
@@ -1 +1 @@
|
||||
export default (token: string) => token[0] == '!';
|
||||
export default (token: string) => token.startsWith('!');
|
||||
|
||||
@@ -84,7 +84,7 @@ export default async (params: any, user: ILocalUser, app: IApp) => new Promise(a
|
||||
|
||||
if (avatar == null) return rej('avatar not found');
|
||||
|
||||
updates.avatarUrl = avatar.metadata.url || `${config.drive_url}/${avatar._id}`;
|
||||
updates.avatarUrl = avatar.metadata.thumbnailUrl || avatar.metadata.url || `${config.drive_url}/${avatar._id}`;
|
||||
|
||||
if (avatar.metadata.properties.avgColor) {
|
||||
updates.avatarColor = avatar.metadata.properties.avgColor;
|
||||
|
||||
@@ -1,11 +1,20 @@
|
||||
import * as Koa from 'koa';
|
||||
import * as request from 'request-promise-native';
|
||||
import summaly from 'summaly';
|
||||
import config from '../../config';
|
||||
|
||||
module.exports = async (ctx: Koa.Context) => {
|
||||
try {
|
||||
const summary = await summaly(ctx.query.url, {
|
||||
const summary = config.summalyProxy ? await request.get({
|
||||
url: config.summalyProxy,
|
||||
qs: {
|
||||
url: ctx.query.url
|
||||
},
|
||||
json: true
|
||||
}) : await summaly(ctx.query.url, {
|
||||
followRedirects: false
|
||||
});
|
||||
|
||||
summary.icon = wrap(summary.icon);
|
||||
summary.thumbnail = wrap(summary.thumbnail);
|
||||
|
||||
|
||||
@@ -8,7 +8,7 @@ export const replacement = (ctx: any, _: any, key: string) => {
|
||||
const client = '/src/client/app/';
|
||||
let name = null;
|
||||
|
||||
if (key[0] == '@') {
|
||||
if (key.startsWith('@')) {
|
||||
name = ctx.src.substr(ctx.src.indexOf(client) + client.length);
|
||||
key = key.substr(1);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user