From e3a1dded3d0909f55ca6b0c8b3464526af85538a Mon Sep 17 00:00:00 2001 From: kPherox Date: Sun, 5 May 2019 23:35:31 +0900 Subject: [PATCH] Add `add-timeline` event --- src/components/AddColumn/PublicTimeline.vue | 1 + src/main/Timeline.ts | 93 +++++++++++++++------ tsconfig.json | 1 + 3 files changed, 70 insertions(+), 25 deletions(-) diff --git a/src/components/AddColumn/PublicTimeline.vue b/src/components/AddColumn/PublicTimeline.vue index 40922722..ab2c6318 100644 --- a/src/components/AddColumn/PublicTimeline.vue +++ b/src/components/AddColumn/PublicTimeline.vue @@ -89,6 +89,7 @@ export default class PublicTimeline extends Vue { public addTL() { let timeline: Timeline = { name: this.instance, statuses: new Map() } + ipcRenderer.send("add-timeline", timeline.name, 'no-auth') this.showInput = false this.instance = "" diff --git a/src/main/Timeline.ts b/src/main/Timeline.ts index d66f85fb..9965afc3 100644 --- a/src/main/Timeline.ts +++ b/src/main/Timeline.ts @@ -1,11 +1,20 @@ import { + app, ipcMain, Event } from 'electron' import { Status, Response } from 'megalodon' +import { join } from "path" +import Datastore from "nedb" import Client from './Client' +interface TimelineDoc { + _id?: string + name: string + type: string +} + export default class Timeline { private static readonly endpoints: Readonly<{ [key: string]: string @@ -18,33 +27,67 @@ export default class Timeline { } public static ready() { - ipcMain.on('no-auth-timeline', async (event: Event, name: string) => { - const client = Client.getNoAuthClient(name) - try { - let res: Response<[Status]> = await client.get<[Status]>('/timelines/public?local=true') - event.sender.send(`timeline-${name}-no-auth`, res.data) - } catch (error) { - event.sender.send(`timeline-${name}-no-auth`, [], error) - } - }) - ipcMain.on('timeline', async (event: Event, name: string, type: string) => { - // home/notify/dm/local/fediverse/integrated/localPlus - // integratedはまだ。dmはAPI構造が違う。notifyはmax_idとかのためにヘッダー取らないといけない。 - // integratedはレンダラープロセス側でそれぞれ取得させる形で、ここでは考慮しないのがいいのかな - if (!(type in this.endpoints)) { - event.sender.send(`timeline-${name}-${type}`, [], new Error("Not supported type")) - return - } + ipcMain.on('add-timeline', (event: Event, name: string, type: string) => this.onAddTimeline(event, name, type)) - let url = this.endpoints[type] - try { - const client = Client.getAuthClient(name) - let res: Response<[Status]> = await client.get<[Status]>(url) - event.sender.send(`timeline-${name}-${type}`, res.data) - } catch (error) { - console.log(error) - event.sender.send(`timeline-${name}-${type}`, [], error) + ipcMain.on('no-auth-timeline', (event: Event, name: string) => this.onNoAuthTimeline(event, name)) + + ipcMain.on('timeline', (event: Event, name: string, type: string) => this.onTimeline(event, name, type)) + } + + private static async onAddTimeline(event: Event, name: string, type: string) { + if (!(type in this.endpoints) && type !== 'no-auth') { + event.sender.send(`add-timeline`, {}, new Error("Not supported type")) + return + } + + let db = new Datastore({ + filename: join(app.getPath("userData"), "timeline.db"), + autoload: true + }) + + let docs: TimelineDoc = { + name: name, + type: type, + } + + db.insert(docs, function (err, newDocs) { + if (err) { + let error = new Error("You cannot login already logined account.") + error.name = "ERROR_YOU_TRY_ANOTHER_ACCOUNT" + event.sender.send(`add-timeline`, {}, error) + } else { + event.sender.send(`add-timeline`, newDocs) } }) } + + private static async onNoAuthTimeline(event: Event, name: string) { + try { + const client = Client.getNoAuthClient(name) + let res: Response<[Status]> = await client.get<[Status]>('/timelines/public?local=true') + event.sender.send(`timeline-${name}-no-auth`, res.data) + } catch (error) { + event.sender.send(`timeline-${name}-no-auth`, [], error) + } + } + + private static async onTimeline(event: Event, name: string, type: string) { + // home/notify/dm/local/fediverse/integrated/localPlus + // integratedはまだ。dmはAPI構造が違う。notifyはmax_idとかのためにヘッダー取らないといけない。 + // integratedはレンダラープロセス側でそれぞれ取得させる形で、ここでは考慮しないのがいいのかな + if (!(type in this.endpoints)) { + event.sender.send(`timeline-${name}-${type}`, [], new Error("Not supported type")) + return + } + + let url = this.endpoints[type] + try { + const client = Client.getAuthClient(name) + let res: Response<[Status]> = await client.get<[Status]>(url) + event.sender.send(`timeline-${name}-${type}`, res.data) + } catch (error) { + console.log(error) + event.sender.send(`timeline-${name}-${type}`, [], error) + } + } } \ No newline at end of file diff --git a/tsconfig.json b/tsconfig.json index 2b785119..39fc416f 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -14,6 +14,7 @@ "baseUrl": ".", "types": [ "lodash", + "nedb", "webpack-env", ], "paths": {