Compare commits

...

8 Commits
2.3.0 ... 2.4.0

Author SHA1 Message Date
3f2a7a561e アイコンのレンダリングを改善 2018-05-06 18:04:37 +09:00
332af15e3c Fix 2018-05-06 17:37:50 +09:00
fe184ce84a Fix 2018-05-06 17:36:47 +09:00
661c7f45ba Merge pull request #1570 from m4sk1n/master
i18n: Improve Polish translation
2018-05-06 16:52:50 +09:00
01c0545409 i18n: Improve Polish translation
Signed-off-by: Marcin Mikołajczak <me@m4sk.in>
2018-05-06 09:48:53 +02:00
c6492d3d58 誰もフォローしていないときはローカルタイムラインを表示するように 2018-05-06 14:35:28 +09:00
638a2ab684 2.3.1 2018-05-06 02:08:40 +09:00
650f79d0fd Fix bugs 2018-05-06 02:08:27 +09:00
10 changed files with 141 additions and 25 deletions

View File

@ -95,7 +95,7 @@ common/views/components/nav.vue:
donors: "Sponsorzy" donors: "Sponsorzy"
repository: "Repozytorium" repository: "Repozytorium"
develop: "Autorzy" develop: "Autorzy"
feedback: "Opinie" feedback: "Podziel się opinią"
common/views/components/note-menu.vue: common/views/components/note-menu.vue:
favorite: "Dodaj do ulubionych" favorite: "Dodaj do ulubionych"
@ -232,7 +232,7 @@ desktop/views/components/drive.nav-folder.vue:
desktop/views/components/drive.vue: desktop/views/components/drive.vue:
search: "Szukaj" search: "Szukaj"
load-more: "Załaduj więcej" load-more: "Załaduj więcej"
empty-drive: "Twój dysk jest posty" empty-drive: "Twój dysk jest pusty"
empty-drive-description: "Możesz wysłać plik klikając prawym przyciskiem myszy i wybierając \"Wyślij plik\" lub przeciągnąć plik i upuścić w tym oknie." empty-drive-description: "Możesz wysłać plik klikając prawym przyciskiem myszy i wybierając \"Wyślij plik\" lub przeciągnąć plik i upuścić w tym oknie."
empty-folder: "Ten katalog jest posty" empty-folder: "Ten katalog jest posty"
unable-to-process: "Nie udało się dokończyć działania." unable-to-process: "Nie udało się dokończyć działania."
@ -240,6 +240,7 @@ desktop/views/components/drive.vue:
unhandled-error: "Nieznany błąd" unhandled-error: "Nieznany błąd"
url-upload: "Wyślij z adresu" url-upload: "Wyślij z adresu"
url-of-file: "Adres URL pliku, który chcesz wysłać" url-of-file: "Adres URL pliku, który chcesz wysłać"
url-upload-requested: "Zaplanowano wysyłanie"
may-take-time: "Może trochę potrwać, zanim wysyłanie zostanie ukończone." may-take-time: "Może trochę potrwać, zanim wysyłanie zostanie ukończone."
create-folder: "Utwórz katalog" create-folder: "Utwórz katalog"
folder-name: "Nazwa katalogu" folder-name: "Nazwa katalogu"
@ -254,6 +255,7 @@ desktop/views/components/messaging-window.vue:
desktop/views/components/notes.note.vue: desktop/views/components/notes.note.vue:
reposted-by: "Udostępniono przez {}" reposted-by: "Udostępniono przez {}"
reply: "Odpowiedz" reply: "Odpowiedz"
renote: "Przeredaguj"
add-reaction: "Dodaj reakcję" add-reaction: "Dodaj reakcję"
detail: "Pokaż szczegóły" detail: "Pokaż szczegóły"
@ -267,11 +269,13 @@ desktop/views/components/post-form.vue:
quote-placeholder: "Zacytuj ten wpis…" quote-placeholder: "Zacytuj ten wpis…"
note: "Wyślij" note: "Wyślij"
reply: "Odpowiedz" reply: "Odpowiedz"
posted: "Posted!" renote: "Przeredaguj"
posted: "Opublikowano!"
replied: "Odpowiedziano!" replied: "Odpowiedziano!"
reposted: "Udostępniono!" reposted: "Udostępniono!"
note-failed: "Nie udało się wysłać" note-failed: "Nie udało się wysłać"
reply-failed: "Nie udało się odpowiedzieć" reply-failed: "Nie udało się odpowiedzieć"
renote-failed: "Nie udało się przeredagować"
posting: "Wysyłanie" posting: "Wysyłanie"
attach-media-from-local: "Załącz zawartość multimedialną z komputera" attach-media-from-local: "Załącz zawartość multimedialną z komputera"
attach-media-from-drive: "Załącz zawartość multimedialną z dysku" attach-media-from-drive: "Załącz zawartość multimedialną z dysku"
@ -289,14 +293,19 @@ desktop/views/components/post-form-window.vue:
desktop/views/components/renote-form.vue: desktop/views/components/renote-form.vue:
quote: "Cytuj…" quote: "Cytuj…"
cancel: "Anuluj" cancel: "Anuluj"
renote: "Przeredaguj"
reposting: "Udostępnianie…" reposting: "Udostępnianie…"
success: "Udostępniono!" success: "Udostępniono!"
failure: "Nie udało się przeredagować"
desktop/views/components/renote-form-window.vue:
title: "Czy na pewno chcesz przeredagować ten wpis?"
desktop/views/components/settings.vue: desktop/views/components/settings.vue:
profile: "Profil" profile: "Profil"
notification: "Powiadomienie" notification: "Powiadomienia"
apps: "Aplikacje" apps: "Aplikacje"
mute: "Wycisz" mute: "Wyciszanie"
drive: "Dysk" drive: "Dysk"
security: "Bezpieczeństwo" security: "Bezpieczeństwo"
password: "Hasło" password: "Hasło"
@ -392,7 +401,7 @@ desktop/views/pages/user/user.followers-you-know.vue:
no-users: "Brak użytkowników" no-users: "Brak użytkowników"
desktop/views/pages/user/user.friends.vue: desktop/views/pages/user/user.friends.vue:
title: "Najczęściej odpisujący" title: "Najbardziej aktywni"
loading: "Ładowanie" loading: "Ładowanie"
no-users: "Brak użytkowników" no-users: "Brak użytkowników"

69
migration/2.4.0.js Normal file
View File

@ -0,0 +1,69 @@
// for Node.js interpret
const chalk = require('chalk');
const sequential = require('promise-sequential');
const { default: User } = require('../built/models/user');
const { default: DriveFile } = require('../built/models/drive-file');
async function main() {
const promiseGens = [];
const count = await User.count({});
let prev;
for (let i = 0; i < count; i++) {
promiseGens.push(() => {
const promise = new Promise(async (res, rej) => {
const user = await User.findOne(prev ? {
_id: { $gt: prev._id }
} : {}, {
sort: {
_id: 1
}
});
prev = user;
const set = {};
if (user.avatarId != null) {
const file = await DriveFile.findOne({ _id: user.avatarId });
if (file && file.metadata.properties.avgColor) {
set.avatarColor = file.metadata.properties.avgColor;
}
}
if (user.bannerId != null) {
const file = await DriveFile.findOne({ _id: user.bannerId });
if (file && file.metadata.properties.avgColor) {
set.bannerColor = file.metadata.properties.avgColor;
}
}
User.update({
_id: user._id
}, {
$set: set
}).then(() => {
res([i, user]);
}).catch(rej);
});
promise.then(([i, user]) => {
console.log(chalk`{gray ${i}} {green done: {bold ${user._id}} @${user.username}}`);
});
return promise;
});
}
return await sequential(promiseGens);
}
main().then(() => {
console.log('ALL DONE');
}).catch(console.error);

View File

@ -1,8 +1,8 @@
{ {
"name": "misskey", "name": "misskey",
"author": "syuilo <i@syuilo.com>", "author": "syuilo <i@syuilo.com>",
"version": "2.3.0", "version": "2.4.0",
"clientVersion": "1.0.5207", "clientVersion": "1.0.5215",
"codename": "nighthike", "codename": "nighthike",
"main": "./built/index.js", "main": "./built/index.js",
"private": true, "private": true,

View File

@ -1,8 +1,6 @@
<template> <template>
<router-link class="mk-avatar" :to="user | userPage" :title="user | acct" :target="target" :style="{ borderRadius: clientSettings.circleIcons ? '100%' : null }"> <router-link class="mk-avatar" :to="user | userPage" :title="user | acct" :target="target" :style="style" v-if="disablePreview"></router-link>
<img v-if="disablePreview" :src="`${user.avatarUrl}?thumbnail&size=128`" alt=""/> <router-link class="mk-avatar" :to="user | userPage" :title="user | acct" :target="target" :style="style" v-else v-user-preview="user.id"></router-link>
<img v-else :src="`${user.avatarUrl}?thumbnail&size=128`" alt="" v-user-preview="user.id"/>
</router-link>
</template> </template>
<script lang="ts"> <script lang="ts">
@ -10,6 +8,7 @@ import Vue from 'vue';
export default Vue.extend({ export default Vue.extend({
props: { props: {
user: { user: {
type: Object,
required: true required: true
}, },
target: { target: {
@ -20,6 +19,15 @@ export default Vue.extend({
required: false, required: false,
default: false default: false
} }
},
computed: {
style(): any {
return {
backgroundColor: this.user.avatarColor ? `rgb(${ this.user.avatarColor.join(',') })` : null,
backgroundImage: `url(${ this.user.avatarUrl }?thumbnail)`,
borderRadius: (this as any).clientSettings.circleIcons ? '100%' : null
};
}
} }
}); });
</script> </script>
@ -27,13 +35,7 @@ export default Vue.extend({
<style lang="stylus" scoped> <style lang="stylus" scoped>
.mk-avatar .mk-avatar
display inline-block display inline-block
background-size cover
> img background-position center center
display inline-block transition border-radius 1s ease
width 100%
height 100%
margin 0
border-radius inherit
vertical-align bottom
transition border-radius 1s ease
</style> </style>

View File

@ -31,6 +31,12 @@ export default Vue.extend({
}; };
}, },
created() {
if ((this as any).os.i.followingCount == 0) {
this.src = 'local';
}
},
mounted() { mounted() {
(this.$refs.tl as any).$once('loaded', () => { (this.$refs.tl as any).$once('loaded', () => {
this.$emit('loaded'); this.$emit('loaded');

View File

@ -75,6 +75,12 @@ export default Vue.extend({
} }
}, },
created() {
if ((this as any).os.i.followingCount == 0) {
this.src = 'local';
}
},
mounted() { mounted() {
document.title = 'Misskey'; document.title = 'Misskey';

View File

@ -9,7 +9,7 @@
<div class="body"> <div class="body">
<div class="top"> <div class="top">
<a class="avatar"> <a class="avatar">
<img :src="`${user.avatarUrl}?thumbnail&size=200`" alt="avatar"/> <img :src="user.avatarUrl" alt="avatar"/>
</a> </a>
<mk-follow-button v-if="os.isSignedIn && os.i.id != user.id" :user="user"/> <mk-follow-button v-if="os.isSignedIn && os.i.id != user.id" :user="user"/>
</div> </div>

View File

@ -4,6 +4,7 @@
import $ from 'cafy'; import ID from '../../../../cafy-id'; import $ from 'cafy'; import ID from '../../../../cafy-id';
import User, { isValidName, isValidDescription, isValidLocation, isValidBirthday, pack } from '../../../../models/user'; import User, { isValidName, isValidDescription, isValidLocation, isValidBirthday, pack } from '../../../../models/user';
import event from '../../../../publishers/stream'; import event from '../../../../publishers/stream';
import DriveFile from '../../../../models/drive-file';
/** /**
* Update myself * Update myself
@ -51,12 +52,34 @@ module.exports = async (params, user, app) => new Promise(async (res, rej) => {
if (autoWatchErr) return rej('invalid autoWatch param'); if (autoWatchErr) return rej('invalid autoWatch param');
if (autoWatch != null) user.settings.autoWatch = autoWatch; if (autoWatch != null) user.settings.autoWatch = autoWatch;
if (avatarId) {
const avatar = await DriveFile.findOne({
_id: avatarId
});
if (avatar != null && avatar.metadata.properties.avgColor) {
user.avatarColor = avatar.metadata.properties.avgColor;
}
}
if (bannerId) {
const banner = await DriveFile.findOne({
_id: bannerId
});
if (banner != null && banner.metadata.properties.avgColor) {
user.bannerColor = banner.metadata.properties.avgColor;
}
}
await User.update(user._id, { await User.update(user._id, {
$set: { $set: {
name: user.name, name: user.name,
description: user.description, description: user.description,
avatarId: user.avatarId, avatarId: user.avatarId,
avatarColor: user.avatarColor,
bannerId: user.bannerId, bannerId: user.bannerId,
bannerColor: user.bannerColor,
profile: user.profile, profile: user.profile,
isBot: user.isBot, isBot: user.isBot,
settings: user.settings settings: user.settings

View File

@ -14,6 +14,8 @@ module.exports = async (ctx: Koa.Context) => {
function wrap(url: string): string { function wrap(url: string): string {
return url != null return url != null
? `https://images.weserv.nl/?url=${url.replace(/^https?:\/\//, '')}` ? url.startsWith('https://')
? url
: `https://images.weserv.nl/?url=${url.replace(/^http:\/\//, '')}`
: null; : null;
} }

View File

@ -4,7 +4,6 @@ block vars
- const user = note.user; - const user = note.user;
- const title = user.name ? `${user.name} (@${user.username})` : `@${user.username}`; - const title = user.name ? `${user.name} (@${user.username})` : `@${user.username}`;
- const url = `${config.url}/notes/${note.id}`; - const url = `${config.url}/notes/${note.id}`;
- const img = user.avatarId ? `${config.drive_url}/${user.avatarId}` : null;
block title block title
= `${title} | Misskey` = `${title} | Misskey`
@ -18,7 +17,7 @@ block meta
meta(property='og:title' content= title) meta(property='og:title' content= title)
meta(property='og:description' content= summary) meta(property='og:description' content= summary)
meta(property='og:url' content= url) meta(property='og:url' content= url)
meta(property='og:image' content= img) meta(property='og:image' content= user.avatarUrl)
if note.prev if note.prev
link(rel='prev' href=`${config.url}/notes/${note.prev}`) link(rel='prev' href=`${config.url}/notes/${note.prev}`)