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 | ||
| ![greenkeeper[bot]](/assets/img/avatar_default.png)  | 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