Compare commits

..

41 Commits
5.5.0 ... 5.6.2

Author SHA1 Message Date
syuilo
23c32f1211 5.6.2 2018-07-28 11:43:11 +09:00
syuilo
c8a5d693ed Merge pull request #2012 from syuilo/l10n_master
New Crowdin translations
2018-07-28 11:42:18 +09:00
syuilo
4a54d01ca8 Merge pull request #2015 from syuilo/greenkeeper/@types/node-10.5.4
Update @types/node to the latest version 🚀
2018-07-28 11:42:11 +09:00
syuilo
359a7a7b98 Merge pull request #2014 from syuilo/greenkeeper/@types/koa-router-7.0.31
Update @types/koa-router to the latest version 🚀
2018-07-28 11:42:04 +09:00
greenkeeper[bot]
aaa25deaa9 fix(package): update @types/node to version 10.5.4 2018-07-28 00:57:57 +00:00
greenkeeper[bot]
cd07ae4d2e fix(package): update @types/koa-router to version 7.0.31 2018-07-28 00:48:10 +00:00
syuilo
1e8c1efe2f Fix #2013 2018-07-28 07:56:33 +09:00
syuilo
ce405fc4f6 Fix #2007 2018-07-28 07:52:48 +09:00
syuilo
50a6efd568 Fix #2000 2018-07-28 07:38:29 +09:00
syuilo
2c6f881093 管理者用パスワードリセットコマンドを実装 2018-07-28 04:02:52 +09:00
syuilo
e4bf0392af クラスタ数を制限するオプションを追加 2018-07-28 03:55:41 +09:00
syuilo
fcb9133f27 New translations ja.yml (French) 2018-07-27 22:12:20 +09:00
syuilo
5c6f24dc39 Merge pull request #2011 from syuilo/greenkeeper/webpack-4.16.3
Update webpack to the latest version 🚀
2018-07-27 19:31:42 +09:00
greenkeeper[bot]
ce562f3bca fix(package): update webpack to version 4.16.3 2018-07-27 10:24:24 +00:00
syuilo
9ef477f04b Merge pull request #2010 from acid-chicken/acid-chicken-patch-1
Minify Mk-III
2018-07-27 19:17:15 +09:00
Acid Chicken (硫酸鶏)
5268fee5b5 Fix bug 2018-07-27 19:15:38 +09:00
Aya Morisawa
68e28faedc 2018-07-27 19:12:16 +09:00
syuilo
12f63db62e 5.6.1 2018-07-27 18:52:07 +09:00
syuilo
08e1c87fa6 oops 2018-07-27 18:50:15 +09:00
syuilo
8ee962b729 5.6.0 2018-07-27 18:43:36 +09:00
syuilo
3d8b45ecdd Use os-utils 2018-07-27 18:42:58 +09:00
syuilo
2347d9cea2 Merge branch 'master' of https://github.com/syuilo/misskey 2018-07-27 18:40:41 +09:00
syuilo
8a57f490ce バギーなのでジョブキュー無効化 2018-07-27 18:40:38 +09:00
syuilo
a880f5cbb8 Merge pull request #2009 from acid-chicken/acid-chicken-patch-1
Minify Mk-II
2018-07-27 18:29:24 +09:00
Acid Chicken (硫酸鶏)
df5a7c7e0c Update calendar.vue 2018-07-27 18:28:06 +09:00
syuilo
b7b82456d8 Merge branch 'master' of https://github.com/syuilo/misskey 2018-07-27 18:18:49 +09:00
syuilo
6b19e54c23 Fix bug 2018-07-27 18:18:05 +09:00
Aya Morisawa
75d04858e6 2018-07-27 17:58:19 +09:00
Aya Morisawa
9332551791 2018-07-27 17:51:40 +09:00
Aya Morisawa
32117a573b Fix bug 2018-07-27 17:47:10 +09:00
Aya Morisawa
d4d3316d18 2018-07-27 17:43:04 +09:00
2vg
43a7eb233c fix: critical memory leak. 2018-07-27 17:33:21 +09:00
2vg
178093861b memory usage excludes buffer and cache. 2018-07-27 17:31:19 +09:00
syuilo
3fb26534b7 Merge pull request #2004 from syuilo/greenkeeper/jsdom-11.12.0
Update jsdom to the latest version 🚀
2018-07-27 14:48:59 +09:00
greenkeeper[bot]
19a9fdfd38 fix(package): update jsdom to version 11.12.0 2018-07-27 04:58:58 +00:00
syuilo
6438e97324 Merge pull request #2002 from yuzulabo/fix/visibility-icon-mobile
#1993 をモバイル版に対応
2018-07-27 13:37:45 +09:00
nzws
b29492e8eb Change VisibilityButton's icon in mobile view 2018-07-27 13:30:46 +09:00
greenkeeper[bot]
5ab4f10230 fix(package): update typescript-eslint-parser to version 17.0.1 2018-07-27 09:39:21 +09:00
syuilo
80b251e12c Merge branch 'master' of https://github.com/syuilo/misskey 2018-07-27 07:29:26 +09:00
syuilo
bfd8b12a4f Clean up 2018-07-27 07:29:24 +09:00
syuilo
1c2e94658b Update README.md 2018-07-27 07:21:03 +09:00
20 changed files with 180 additions and 103 deletions

View File

@@ -131,3 +131,6 @@ drive:
# Ghost account is an account used for the purpose of delegating
# followers when putting users in the list.
# ghost: user-id-of-your-ghost-account
# Clustering
# clusterLimit: 1

View File

@@ -43,9 +43,9 @@ If you want to...
:heart: Backers & Sponsors
----------------------------------------------------------------
| <img src="https://c10.patreonusercontent.com/3/eyJoIjoxMDAsInciOjEwMH0%3D/patreon-media/p/user/619786/32cf01444db24e578cd1982c197f6fc6/1?token-time=2145916800&token-hash=tB1e_r8RlZ5sFL0KV_e8dugapxatNBRK1Z3h67TO1g8%3D"> | <img src="https://c10.patreonusercontent.com/3/eyJoIjoxMDAsInciOjEwMH0%3D/patreon-media/p/user/12378075/0156f769e20f412594fa6b87d85fe228/1?token-time=2145916800&token-hash=IsIJRUXszzoD6-7pDnRY8I05T9nSznc4GTaxj7C9SwU%3D"> | <img src="https://c10.patreonusercontent.com/3/eyJoIjoxMDAsInciOjEwMH0%3D/patreon-media/p/user/4503830/ccf2cc867ea64de0b524bb2e24b9a1cb/1?token-time=2145916800&token-hash=S1zP0QyLU52Dqq6dtc9qNYyWfW86XrYHiR4NMbeOrnA%3D"> |
|:-:|:-:|:-:|
| [Gargron](https://www.patreon.com/mastodon) | [39ff](https://www.patreon.com/user/creators?u=12378075) | [dansup](https://www.patreon.com/dansup) |
| <img src="https://c10.patreonusercontent.com/3/eyJoIjoxMDAsInciOjEwMH0%3D/patreon-media/p/user/619786/32cf01444db24e578cd1982c197f6fc6/1?token-time=2145916800&token-hash=tB1e_r8RlZ5sFL0KV_e8dugapxatNBRK1Z3h67TO1g8%3D"> | <img src="https://c10.patreonusercontent.com/3/eyJoIjoxMDAsInciOjEwMH0%3D/patreon-media/p/user/12378075/0156f769e20f412594fa6b87d85fe228/1?token-time=2145916800&token-hash=IsIJRUXszzoD6-7pDnRY8I05T9nSznc4GTaxj7C9SwU%3D"> | <img src="https://c10.patreonusercontent.com/3/eyJoIjoxMDAsInciOjEwMH0%3D/patreon-media/p/user/4503830/ccf2cc867ea64de0b524bb2e24b9a1cb/1?token-time=2145916800&token-hash=S1zP0QyLU52Dqq6dtc9qNYyWfW86XrYHiR4NMbeOrnA%3D"> | <img src="https://c10.patreonusercontent.com/3/eyJoIjoxMDAsInciOjEwMH0%3D/patreon-media/p/user/12531784/93a45137841849329ba692da92ac7c60/1?token-time=2145916800&token-hash=tMosUojzUYJCH_3t--tvYA-SMCyrS__hzSndyaRSnbo%3D"> |
|:-:|:-:|:-:|:-:|
| [Gargron](https://www.patreon.com/mastodon) | [39ff](https://www.patreon.com/user/creators?u=12378075) | [dansup](https://www.patreon.com/dansup) | [Takashi Shibuya](https://www.patreon.com/user/creators?u=12531784) |
:four_leaf_clover: Copyright
----------------------------------------------------------------

29
cli/reset-password.js Normal file
View File

@@ -0,0 +1,29 @@
const mongo = require('mongodb');
const bcrypt = require('bcryptjs');
const User = require('../built/models/user').default;
const args = process.argv.slice(2);
const user = args[0];
const q = user.startsWith('@') ? {
username: user.split('@')[1],
host: user.split('@')[2] || null
} : { _id: new mongo.ObjectID(user) };
console.log(`Resetting password for ${user}...`);
const passwd = 'yo';
// Generate hash of password
const hash = bcrypt.hashSync(passwd);
User.update(q, {
$set: {
password: hash
}
}).then(() => {
console.log(`Password of ${user} is now '${passwd}'`);
}, e => {
console.error(e);
});

View File

@@ -29,6 +29,11 @@ node cli/suspend @syuilo
node cli/suspend @syuilo@misskey.xyz
```
## Reset password
``` shell
node cli/reset-password (User-ID or Username)
```
## Clean up cached remote files
``` shell
node cli/clean-cached-remote-files

View File

@@ -29,6 +29,11 @@ node cli/suspend @syuilo
node cli/suspend @syuilo@misskey.xyz
```
## ユーザーのパスワードをリセットする
``` shell
node cli/reset-password (ユーザーID または ユーザー名)
```
## キャッシュされたリモートファイルをクリーンアップする
``` shell
node cli/clean-cached-remote-files

View File

@@ -218,8 +218,8 @@ common/views/components/visibility-chooser.vue:
public: "Public"
home: "Accueil"
home-desc: "Publier sur le fil d'Accueil uniquement"
followers: "Abonnés"
followers-desc: "Publier à vos abonnés uniquement"
followers: "Abonné·e·s"
followers-desc: "Publier à vos abonné·e·s uniquement"
specified: "Direct"
specified-desc: "Publier aux utilisateurs mentionnés"
private: "Privé"
@@ -346,9 +346,9 @@ desktop/views/components/follow-button.vue:
request-pending: "En attente d'approbation"
follow-request: "Demande d'abonnement"
desktop/views/components/followers-window.vue:
followers: "{} abonnés"
followers: "{} abonné·e·s"
desktop/views/components/followers.vue:
empty: "Il semble que vous n'avez pas encore d'abonnés."
empty: "Il semble que vous n'avez pas encore d'abonné·e·s."
desktop/views/components/following-window.vue:
following: "Suit {}"
desktop/views/components/following.vue:
@@ -604,7 +604,7 @@ desktop/views/components/user-lists-window.vue:
desktop/views/components/user-preview.vue:
notes: "Publications"
following: "Abonné à"
followers: "Abonnés"
followers: "Abonné·e·s"
desktop/views/components/users-list.vue:
all: "Tout"
iknow: "Vous connaissez"
@@ -650,7 +650,7 @@ desktop/views/pages/user-list.users.vue:
add-user: "Ajouter un utilisateur"
username: "Nom d'utilisateur"
desktop/views/pages/user/user.followers-you-know.vue:
title: "Abonnés que vous connaissez"
title: "Abonné·e·s que vous connaissez"
loading: "Chargement en cours"
no-users: "Pas d'utilisateurs"
desktop/views/pages/user/user.friends.vue:
@@ -678,7 +678,7 @@ desktop/views/pages/user/user.profile.vue:
desktop/views/pages/user/user.header.vue:
posts: "Notes"
following: "Suit"
followers: "Abonnés"
followers: "Abonné·e·s"
is-bot: "Ce compte est un Bot"
desktop/views/pages/user/user.timeline.vue:
default: "Publications"
@@ -831,7 +831,7 @@ mobile/views/pages/drive.vue:
drive: "Drive"
more: "Afficher plus ..."
mobile/views/pages/followers.vue:
followers-of: "Abonnés de {}"
followers-of: "Abonné·e·s de {}"
mobile/views/pages/following.vue:
following-of: "Abonnements de {}"
mobile/views/pages/home.vue:
@@ -914,7 +914,7 @@ mobile/views/pages/settings.vue:
mobile/views/pages/user.vue:
follows-you: "vous suit"
following: "Abonnements"
followers: "Abonnés"
followers: "Abonné·e·s"
notes: "Posts"
overview: "Aperçu"
timeline: "Fil d'actualité"
@@ -929,7 +929,7 @@ mobile/views/pages/user/home.vue:
keywords: "Mot clés"
domains: "Domaines"
frequently-replied-users: "Utilisateurs qui interagissent souvent"
followers-you-know: "Abonnés que vous connaissez"
followers-you-know: "Abonné·e·s que vous connaissez"
last-used-at: "Dernière connexion il y a"
mobile/views/pages/user/home.followers-you-know.vue:
loading: "Chargement"

View File

@@ -1,8 +1,8 @@
{
"name": "misskey",
"author": "syuilo <i@syuilo.com>",
"version": "5.5.0",
"clientVersion": "1.0.7602",
"version": "5.6.2",
"clientVersion": "1.0.7643",
"codename": "nighthike",
"main": "./built/index.js",
"private": true,
@@ -51,7 +51,7 @@
"@types/koa-logger": "3.1.0",
"@types/koa-mount": "3.0.1",
"@types/koa-multer": "1.0.0",
"@types/koa-router": "7.0.30",
"@types/koa-router": "7.0.31",
"@types/koa-send": "4.1.1",
"@types/koa-views": "2.0.3",
"@types/koa__cors": "2.2.2",
@@ -60,7 +60,7 @@
"@types/mocha": "5.2.3",
"@types/mongodb": "3.1.2",
"@types/ms": "0.7.30",
"@types/node": "10.5.3",
"@types/node": "10.5.4",
"@types/parse5": "5.0.0",
"@types/portscanner": "2.1.0",
"@types/pug": "2.0.4",
@@ -75,6 +75,7 @@
"@types/showdown": "1.7.5",
"@types/single-line-log": "1.1.0",
"@types/speakeasy": "2.0.2",
"@types/systeminformation": "3.23.0",
"@types/tmp": "0.0.33",
"@types/uuid": "3.4.3",
"@types/webpack": "4.4.8",
@@ -131,7 +132,7 @@
"is-url": "1.2.4",
"jquery": "3.3.1",
"js-yaml": "3.12.0",
"jsdom": "11.11.0",
"jsdom": "11.12.0",
"koa": "2.5.1",
"koa-bodyparser": "4.2.1",
"koa-compress": "3.0.0",
@@ -187,6 +188,7 @@
"stylus": "0.54.5",
"stylus-loader": "3.0.2",
"summaly": "2.0.6",
"systeminformation": "3.42.4",
"syuilo-password-strength": "0.0.1",
"textarea-caret": "3.1.0",
"tmp": "0.0.33",
@@ -194,7 +196,7 @@
"ts-node": "7.0.0",
"tslint": "5.10.0",
"typescript": "2.9.2",
"typescript-eslint-parser": "17.0.0",
"typescript-eslint-parser": "17.0.1",
"uglify-es": "3.3.9",
"url-loader": "1.0.1",
"uuid": "3.3.2",
@@ -212,7 +214,7 @@
"vuex-persistedstate": "2.5.4",
"web-push": "3.3.2",
"webfinger.js": "2.6.6",
"webpack": "4.16.2",
"webpack": "4.16.3",
"webpack-cli": "3.1.0",
"websocket": "1.0.26",
"ws": "6.0.0",

View File

@@ -69,25 +69,25 @@ class Autocomplete {
*/
private onInput() {
const caretPos = this.textarea.selectionStart;
const text = this.text.substr(0, caretPos);
const text = this.text.substr(0, caretPos).split('\n').pop();
const mentionIndex = text.lastIndexOf('@');
const hashtagIndex = text.lastIndexOf('#');
const emojiIndex = text.lastIndexOf(':');
const start = Math.min(
mentionIndex == -1 ? Infinity : mentionIndex,
hashtagIndex == -1 ? Infinity : hashtagIndex,
emojiIndex == -1 ? Infinity : emojiIndex);
const max = Math.max(
mentionIndex,
hashtagIndex,
emojiIndex);
if (start == Infinity) {
if (max == -1) {
this.close();
return;
}
const isMention = mentionIndex == start;
const isHashtag = hashtagIndex == start;
const isEmoji = emojiIndex == start;
const isMention = mentionIndex != -1;
const isHashtag = hashtagIndex != -1;
const isEmoji = emojiIndex != -1;
let opened = false;
@@ -99,15 +99,15 @@ class Autocomplete {
}
}
if (isHashtag || opened == false) {
if (isHashtag && opened == false) {
const hashtag = text.substr(hashtagIndex + 1);
if (!hashtag.includes(' ') && !hashtag.includes('\n')) {
if (!hashtag.includes(' ')) {
this.open('hashtag', hashtag);
opened = true;
}
}
if (isEmoji || opened == false) {
if (isEmoji && opened == false) {
const emoji = text.substr(emojiIndex + 1);
if (emoji != '' && emoji.match(/^[\+\-a-z0-9_]+$/)) {
this.open('emoji', emoji);

View File

@@ -102,7 +102,6 @@ export default Vue.extend({
},
methods: {
onStats(stats) {
stats.mem.used = stats.mem.total - stats.mem.free;
this.stats.push(stats);
if (this.stats.length > 50) this.stats.shift();
@@ -111,8 +110,8 @@ export default Vue.extend({
this.cpuPolylinePoints = cpuPolylinePoints.map(xy => `${xy[0]},${xy[1]}`).join(' ');
this.memPolylinePoints = memPolylinePoints.map(xy => `${xy[0]},${xy[1]}`).join(' ');
this.cpuPolygonPoints = `${this.viewBoxX - (this.stats.length - 1)},${ this.viewBoxY } ${ this.cpuPolylinePoints } ${ this.viewBoxX },${ this.viewBoxY }`;
this.memPolygonPoints = `${this.viewBoxX - (this.stats.length - 1)},${ this.viewBoxY } ${ this.memPolylinePoints } ${ this.viewBoxX },${ this.viewBoxY }`;
this.cpuPolygonPoints = `${this.viewBoxX - (this.stats.length - 1)},${this.viewBoxY} ${this.cpuPolylinePoints} ${this.viewBoxX},${this.viewBoxY}`;
this.memPolygonPoints = `${this.viewBoxX - (this.stats.length - 1)},${this.viewBoxY} ${this.memPolylinePoints} ${this.viewBoxX},${this.viewBoxY}`;
this.cpuHeadX = cpuPolylinePoints[cpuPolylinePoints.length - 1][0];
this.cpuHeadY = cpuPolylinePoints[cpuPolylinePoints.length - 1][1];

View File

@@ -35,7 +35,7 @@ export default Vue.extend({
},
methods: {
onStats(stats) {
stats.mem.used = stats.mem.total - stats.mem.free;
stats.mem.free = stats.mem.total - stats.mem.used;
this.usage = stats.mem.used / stats.mem.total;
this.total = stats.mem.total;
this.used = stats.mem.used;

View File

@@ -35,7 +35,7 @@ import Vue from 'vue';
const eachMonthDays = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
function isLeapYear(year) {
return !(year % (year % 25 ? 4 : 16));
return !(year & (year % 25 ? 3 : 15));
}
export default Vue.extend({

View File

@@ -34,7 +34,13 @@
<button class="poll" @click="poll = true">%fa:chart-pie%</button>
<button class="poll" @click="useCw = !useCw">%fa:eye-slash%</button>
<button class="geo" @click="geo ? removeGeo() : setGeo()">%fa:map-marker-alt%</button>
<button class="visibility" @click="setVisibility" ref="visibilityButton">%fa:lock%</button>
<button class="visibility" @click="setVisibility" ref="visibilityButton">
<span v-if="visibility === 'public'">%fa:globe%</span>
<span v-if="visibility === 'home'">%fa:home%</span>
<span v-if="visibility === 'followers'">%fa:unlock%</span>
<span v-if="visibility === 'specified'">%fa:envelope%</span>
<span v-if="visibility === 'private'">%fa:lock%</span>
</button>
</footer>
<input ref="file" class="file" type="file" accept="image/*" multiple="multiple" @change="onChangeFile"/>
</div>

View File

@@ -92,6 +92,8 @@ export type Source = {
};
google_maps_api_key: string;
clusterLimit?: number;
};
/**

View File

@@ -1,7 +1,8 @@
import * as os from 'os';
const osUtils = require('os-utils');
import * as sysUtils from 'systeminformation';
import * as diskusage from 'diskusage';
import Xev from 'xev';
const osUtils = require('os-utils');
const ev = new Xev();
@@ -18,25 +19,58 @@ export default function() {
});
async function tick() {
osUtils.cpuUsage((cpuUsage: number) => {
const disk = diskusage.checkSync(os.platform() == 'win32' ? 'c:' : '/');
const stats = {
cpu_usage: cpuUsage,
mem: {
total: os.totalmem(),
free: os.freemem()
},
disk,
os_uptime: os.uptime(),
process_uptime: process.uptime()
};
ev.emit('serverStats', stats);
log.push(stats);
if (log.length > 50) log.shift();
});
const cpu = await cpuUsage();
const usedmem = await usedMem();
const totalmem = await totalMem();
const disk = diskusage.checkSync(os.platform() == 'win32' ? 'c:' : '/');
const stats = {
cpu_usage: cpu,
mem: {
total: totalmem,
used: usedmem
},
disk,
os_uptime: os.uptime(),
process_uptime: process.uptime()
};
ev.emit('serverStats', stats);
log.push(stats);
if (log.length > 50) log.shift();
}
tick();
setInterval(tick, interval);
}
// CPU STAT
function cpuUsage() {
return new Promise((res, rej) => {
osUtils.cpuUsage((cpuUsage: number) => {
res(cpuUsage);
});
});
}
// MEMORY(excl buffer + cache) STAT
async function usedMem() {
try {
const data = await sysUtils.mem();
return data.active;
} catch (error) {
console.error(error);
throw error;
}
}
// TOTAL MEMORY STAT
async function totalMem() {
try {
const data = await sysUtils.mem();
return data.total;
} catch (error) {
console.error(error);
throw error;
}
}

View File

@@ -66,7 +66,7 @@ async function masterMain() {
Logger.succ('Misskey initialized');
spawnWorkers(() => {
spawnWorkers(config.clusterLimit, () => {
Logger.succ('All workers started');
Logger.info(`Now listening on port ${config.port} on ${config.url}`);
});
@@ -79,9 +79,6 @@ async function workerMain() {
// start server
await require('./server').default();
// start processor
require('./queue').default();
// Send a 'ready' message to parent process
process.send('ready');
}
@@ -140,14 +137,16 @@ async function init(): Promise<Config> {
return config;
}
function spawnWorkers(onComplete: Function) {
function spawnWorkers(limit: number, onComplete: Function) {
// Count the machine's CPUs
const cpuCount = os.cpus().length;
const progress = new ProgressBar(cpuCount, 'Starting workers');
const count = limit || cpuCount;
const progress = new ProgressBar(count, 'Starting workers');
// Create a worker for each CPU
for (let i = 0; i < cpuCount; i++) {
for (let i = 0; i < count; i++) {
const worker = cluster.fork();
worker.on('message', message => {
if (message === 'ready') {

View File

@@ -50,6 +50,7 @@ type IUserBase = {
avatarUrl?: string;
bannerUrl?: string;
wallpaperId: mongo.ObjectID;
wallpaperUrl?: string;
data: any;
description: string;
pinnedNoteId: mongo.ObjectID;
@@ -400,21 +401,19 @@ export const pack = (
}
if (_user.avatarUrl == null) {
_user.avatarUrl = _user.avatarId != null
? `${config.drive_url}/${_user.avatarId}`
: `${config.drive_url}/default-avatar.jpg`;
_user.avatarUrl = `${config.drive_url}/default-avatar.jpg`;
// 互換性のため
if (_user.avatarId) {
_user.avatarUrl = `${config.drive_url}/${_user.avatarId}`;
}
}
if (_user.bannerUrl == null) {
_user.bannerUrl = _user.bannerId != null
? `${config.drive_url}/${_user.bannerId}`
: null;
// 互換性のため
if (_user.bannerId && _user.bannerUrl == null) {
_user.bannerUrl = `${config.drive_url}/${_user.bannerId}`;
}
_user.wallpaperUrl = _user.wallpaperId != null
? `${config.drive_url}/${_user.wallpaperId}`
: null;
if (!meId || !meId.equals(_user.id) || !opts.detail) {
delete _user.avatarId;
delete _user.bannerId;

View File

@@ -1,28 +1,8 @@
import * as Queue from 'bee-queue';
import config from '../config';
import http from './processors/http';
import { ILocalUser } from '../models/user';
const queue = new Queue('misskey', {
redis: {
port: config.redis.port,
host: config.redis.host,
password: config.redis.pass
},
removeOnSuccess: true,
removeOnFailure: true,
getEvents: false,
sendEvents: false,
storeJobs: false
});
export function createHttpJob(data: any) {
return queue.createJob(data)
//.retries(4)
//.backoff('exponential', 16384) // 16s
.save();
return http({ data }, () => {});
}
export function deliver(user: ILocalUser, content: any, to: any) {
@@ -33,7 +13,3 @@ export function deliver(user: ILocalUser, content: any, to: any) {
to
});
}
export default function() {
queue.process(128, http);
}

View File

@@ -4,6 +4,7 @@ import event from '../../../../stream';
import DriveFile from '../../../../models/drive-file';
import acceptAllFollowRequests from '../../../../services/following/requests/accept-all';
import { IApp } from '../../../../models/app';
import config from '../../../../config';
export const meta = {
desc: {
@@ -81,7 +82,11 @@ export default async (params: any, user: ILocalUser, app: IApp) => new Promise(a
_id: avatarId
});
if (avatar != null && avatar.metadata.properties.avgColor) {
if (avatar == null) return rej('avatar not found');
updates.avatarUrl = avatar.metadata.url || `${config.drive_url}/${avatar._id}`;
if (avatar.metadata.properties.avgColor) {
updates.avatarColor = avatar.metadata.properties.avgColor;
}
}
@@ -91,7 +96,11 @@ export default async (params: any, user: ILocalUser, app: IApp) => new Promise(a
_id: bannerId
});
if (banner != null && banner.metadata.properties.avgColor) {
if (banner == null) return rej('banner not found');
updates.bannerUrl = banner.metadata.url || `${config.drive_url}/${banner._id}`;
if (banner.metadata.properties.avgColor) {
updates.bannerColor = banner.metadata.properties.avgColor;
}
}
@@ -101,7 +110,11 @@ export default async (params: any, user: ILocalUser, app: IApp) => new Promise(a
_id: wallpaperId
});
if (wallpaper != null && wallpaper.metadata.properties.avgColor) {
if (wallpaper == null) return rej('wallpaper not found');
updates.wallpaperUrl = wallpaper.metadata.url || `${config.drive_url}/${wallpaper._id}`;
if (wallpaper.metadata.properties.avgColor) {
updates.wallpaperColor = wallpaper.metadata.properties.avgColor;
}
}

View File

@@ -66,6 +66,12 @@ export default async function(followee: IUser, follower: IUser) {
});
//#endregion
await User.update({ _id: followee._id }, {
$inc: {
pendingReceivedFollowRequestsCount: -1
}
});
packUser(followee, followee, {
detail: true
}).then(packed => event(followee._id, 'meUpdated', packed));

View File

@@ -10,8 +10,7 @@ export default async (me: mongodb.ObjectID, note: object) => {
// if watching now
const exist = await Watching.findOne({
noteId: (note as any)._id,
userId: me,
deletedAt: { $exists: false }
userId: me
});
if (exist !== null) {