diff --git a/TODO b/TODO index 155ed765..24fedd49 100644 --- a/TODO +++ b/TODO @@ -2,3 +2,7 @@ 为model.system添加缓存 bug修复 修复discussion前端权限节点显示异常 +web端运行脚本似乎异常 +讨论回复通知 +比赛举办者发布通知 +举报功能 diff --git a/hydro/entry/setup.ts b/hydro/entry/setup.ts index 55a19cdd..7f341975 100644 --- a/hydro/entry/setup.ts +++ b/hydro/entry/setup.ts @@ -141,7 +141,7 @@ export function load() { ), db.collection('system').updateOne( { _id: 'server.port' }, - { $set: { value: listenPort } }, + { $set: { value: parseInt(listenPort, 10) } }, { upsert: true }, ), ]); diff --git a/hydro/handler/home.ts b/hydro/handler/home.ts index 22a37b99..2be75628 100644 --- a/hydro/handler/home.ts +++ b/hydro/handler/home.ts @@ -336,6 +336,14 @@ class HomeMessagesHandler extends Handler { else throw new PermissionError(); this.back(); } + + @param('messageId', Types.ObjectID) + async postRead(domainId: string, messageId: ObjectID) { + const msg = await message.get(messageId); + if ([msg.from, msg.to].includes(this.user._id)) await message.setFlag(messageId, message.FLAG_UNREAD); + else throw new PermissionError(); + this.back(); + } } class HomeMessagesConnectionHandler extends ConnectionHandler { diff --git a/hydro/interface.ts b/hydro/interface.ts index fd0ee80e..baa45895 100644 --- a/hydro/interface.ts +++ b/hydro/interface.ts @@ -69,6 +69,7 @@ export interface Pdoc { data?: ObjectID | string, hidden: boolean, config: string, + acMsg?: string, } export type Pdict = Dictionary; @@ -150,7 +151,7 @@ export interface Mdoc { from: number, to: number, content: string, - unread: boolean, + flag: number, } // Userfile diff --git a/hydro/model/file.ts b/hydro/model/file.ts index a781c541..694fd1de 100644 --- a/hydro/model/file.ts +++ b/hydro/model/file.ts @@ -135,6 +135,13 @@ export function url(arg0: any, name: any) { return __url(arg0, name); } +export function ensureIndexes() { + return Promise.all([ + collChunk.createIndex({ files_id: 1, n: 1 }, { unique: true }), + collFile.createIndex({ md5: 1 }), + ]); +} + global.Hydro.model.file = { - add, get, del, inc, dec, getMeta, getWithSecret, getMulti, getMetaDict, url, + add, get, del, inc, dec, getMeta, getWithSecret, getMulti, getMetaDict, url, ensureIndexes, }; diff --git a/hydro/model/message.ts b/hydro/model/message.ts index c879ad6c..00c1fbc3 100644 --- a/hydro/model/message.ts +++ b/hydro/model/message.ts @@ -4,12 +4,15 @@ import * as db from '../service/db'; const coll = db.collection('message'); -export async function send(from: number, to: number, content: string): Promise { +export const FLAG_UNREAD = 1; +export const FLAG_NOTIFICATION = 2; + +export async function send(from: number, to: number, content: string, flag: number): Promise { const res = await coll.insertOne({ - from, to, content, unread: true, + from, to, content, flag: FLAG_UNREAD | flag, }); return { - from, to, content, unread: true, _id: res.insertedId, + from, to, content, _id: res.insertedId, flag: FLAG_UNREAD | flag, }; } @@ -27,6 +30,15 @@ export async function getMany(query: any, sort: any, page: number, limit: number .toArray(); } +export async function setFlag(messageId: ObjectID, flag: number) { + const result = await coll.findOneAndUpdate( + { _id: messageId }, + { $bit: { flag: { xor: flag } } }, + { returnOriginal: false }, + ); + return result.value; +} + export async function del(_id: ObjectID) { return await coll.deleteOne({ _id }); } @@ -47,10 +59,14 @@ export function ensureIndexes() { } global.Hydro.model.message = { + FLAG_UNREAD, + FLAG_NOTIFICATION, + count, get, getByUser, del, + setFlag, getMany, getMulti, send, diff --git a/hydro/model/problem.ts b/hydro/model/problem.ts index 1eef4b81..dd6d813f 100644 --- a/hydro/model/problem.ts +++ b/hydro/model/problem.ts @@ -22,6 +22,7 @@ export const pdocHidden: Pdoc = { data: null, hidden: true, config: '', + acMsg: '', }; export async function add( diff --git a/hydro/service/server.ts b/hydro/service/server.ts index 58dfd2cf..875b2534 100644 --- a/hydro/service/server.ts +++ b/hydro/service/server.ts @@ -13,6 +13,7 @@ import Router from 'koa-router'; import cache from 'koa-static-cache'; import sockjs from 'sockjs'; import serialize from 'serialize-javascript'; +import parse from 'yargs-parser'; import { lrucache } from '../utils'; import { User, DomainDoc } from '../interface'; import { @@ -31,8 +32,8 @@ import * as token from '../model/token'; import * as opcount from '../model/opcount'; import hash from '../lib/hash.hydro'; +const argv = parse(process.argv.slice(2)); let enableLog = true; - const app = new Koa(); let server; const router = new Router(); @@ -760,8 +761,8 @@ export async function start() { } else enableLog = false; app.use(router.routes()).use(router.allowedMethods()); Route('notfound_handler', '*', Handler); - server.listen(port); - console.log('Server listening at: %s', port); + server.listen(argv.port || port); + console.log('Server listening at: %s', argv.port || port); } global.Hydro.service.server = { diff --git a/templates/partials/problem_sidebar_normal.html b/templates/partials/problem_sidebar_normal.html index 0c4656a7..7b5a2dc0 100644 --- a/templates/partials/problem_sidebar_normal.html +++ b/templates/partials/problem_sidebar_normal.html @@ -97,6 +97,10 @@ {% else %} {{ _('(None)') }} {% endif %} + {% if pdoc['acMsg'] and pdoc['psdoc']['status'] == STATUS.STATUS_ACCEPTED %} +
{{ _('AC Message') }}
+
{{ pdoc['acMsg'] }}
+ {% endif %} {% endif %} {% endif %}