Parad0x преди 5 години
родител
ревизия
8f022fbb0f
променени са 7 файла, в които са добавени 84 реда и са изтрити 12 реда
  1. 1 1
      app/package.json
  2. 6 0
      app/src/main.ts
  3. 3 2
      app/src/web/AlertFront.ts
  4. 43 3
      app/src/web/Settings.ts
  5. 17 4
      app/src/web/TwitchPubSug.ts
  6. 8 0
      app/src/web/preload.ts
  7. 6 2
      app/web/index.html

+ 1 - 1
app/package.json

@@ -1,6 +1,6 @@
 {
   "name": "twich-points-alerts",
-  "version": "0.1.0",
+  "version": "0.2.0",
   "description": "Simple solution to play mp4 on stream triggered by twitch points",
   "main": "dst/main.js",
   "build": {

+ 6 - 0
app/src/main.ts

@@ -7,6 +7,7 @@ let mainWindow: Electron.BrowserWindow | null;
 function createWindow() {
   mainWindow = new BrowserWindow({
     minWidth: 500,
+    minHeight: 600,
     height: 600,
     webPreferences: {
       preload: path.join(__dirname, "web/preload.js"),
@@ -64,6 +65,11 @@ ipcMain.on('twitch-oauth', (event, arg) => {
 
 let fileLock = false;
 
+ipcMain.on("getSettingsPath", (ev, filename: string) => {
+  let userData = path.resolve(app.getPath("userData"), filename);
+  ev.returnValue = userData;
+});
+
 ipcMain.on("chooseFile", (ev, id: string)=>{
   if(fileLock){
     return;

+ 3 - 2
app/src/web/AlertFront.ts

@@ -1,5 +1,6 @@
 import Twitch from "./TwitchPubSug";
-import electron, { ipcMain, ipcRenderer } from "electron";
+import electron, { ipcRenderer } from "electron";
+import path from "path";
 
 let template = (id: string, instance: AlertFront) => {
     let template = `
@@ -112,7 +113,7 @@ class AlertFront {
             reward.value = obj[key].rewardtitle;
             let filepath = el.querySelector("#filepath") as HTMLInputElement;
             if(obj[key].filepath){
-                filepath.innerText = obj[key].filepath;
+                filepath.innerText = path.basename(obj[key].filepath);
             }else{
                 filepath.innerText = "Choose File";
             }

+ 43 - 3
app/src/web/Settings.ts

@@ -1,6 +1,7 @@
-import { writeFileSync, readFileSync, existsSync } from "fs"
+import { writeFileSync, readFileSync, existsSync, fstat, copyFileSync } from "fs"
 import { resolve } from "path";
 import { isArray } from "util";
+import electron, { ipcMain, ipcRenderer } from "electron";
 
 function isSameKeys(o: Object, keys: Set<string>){
     let objectkeys = Object.keys(o);
@@ -48,11 +49,25 @@ class Settings {
         channel: "",
         alerts: {}
     };
-    constructor(private filename = "settings.json"){
-        this.filename = resolve(process.cwd(), this.filename);
+    filename: string;
+    constructor(filename = "settings.json"){
+        this.filename = this.getPath(filename);
+        this.moveOldConfig(filename);
         this.load();
     }
 
+    moveOldConfig(filename: string){
+        let localSettings = resolve(process.cwd(), filename);
+        if(existsSync(localSettings) && !existsSync(this.filename)){
+            copyFileSync(localSettings, this.filename);
+        }
+    }
+
+    getPath(filename: string):string{
+        let path:string = ipcRenderer.sendSync("getSettingsPath", filename);
+        return path;
+    }
+
     /**
      * save settings to file
      *
@@ -144,4 +159,29 @@ export function initForm(settings: Settings){
         e.preventDefault();
         return false;
     });
+
+    let saveAlert = document.getElementById("saveAlert");
+    saveAlert.addEventListener("click", function(e){
+        // Twitch Token
+        settings.options.twitch_client_id = inputs.ClientTID.value;
+        settings.options.channel = inputs.Channel.value;
+
+        // Port
+        let port: number = parseInt(inputs.Port.value);
+        if(!isNaN(port) && port > 0 && port < 65535){
+            settings.options.port = port;
+            inputs.Port.value = port.toString();
+        }else{
+            console.log("Wrong value for port");
+            inputs.Port.value = settings.options.port.toString();
+            // TODO: Some error box
+        }
+
+        // All setted
+        settings.save();
+        settings.updateView();
+
+        e.preventDefault();
+        return false;
+    });
 }

+ 17 - 4
app/src/web/TwitchPubSug.ts

@@ -39,7 +39,7 @@ export interface ResponseEvent {
     nonce?: string
 }
 export interface MesageEvent {
-    type: "RESPONSE",
+    type: "MESSAGE",
     data: {
         message: string,
         topic: string
@@ -50,8 +50,12 @@ export type TwitchEvent = MesageEvent & ResponseEvent
 
 declare interface Twitch {
     on(event: "reward", listner: (reward: PointsRedeemed)=>void): this;
+    on(event: "error", listner: (msg: string)=>void): this;
+    on(event: "start", listner: ()=>void): this;
 
     emit(event: "reward", reward: PointsRedeemed): boolean;
+    emit(event: "error", msg: string): boolean;
+    emit(event: "start"): boolean;
 }
 
 class Twitch extends EventEmitter{
@@ -69,8 +73,12 @@ class Twitch extends EventEmitter{
     }
 
     async spawn(): Promise<WS>{
-
-        let translateID = await translateTwitchUser(window.settings.options.channel);
+        let translateID:string = "";
+        try{
+            translateID = await translateTwitchUser(window.settings.options.channel);
+        }catch(e){
+            this.emit("error", "Can't translate username to id");
+        }
         if(translateID == ""){
             throw new Error(`There is no user with nickname ${window.settings.options.channel}`);
         }
@@ -99,12 +107,12 @@ class Twitch extends EventEmitter{
             }));
         })
         ws.on("message", (data)=>{
-            console.log(data);
             console.log("Data:");
             let dataObj = JSON.parse(data.toString()) as TwitchEvent;
             console.log(dataObj);
             if(dataObj.type == "RESPONSE"){
                 if(dataObj.error != ""){
+                    this.emit("error", dataObj.error);
                     this.stop();
                 }
             }else if(dataObj.type == "MESSAGE"){
@@ -113,6 +121,8 @@ class Twitch extends EventEmitter{
                     this.emit("reward", message.data);
                 }
 
+            }else if(dataObj.type == "PONG"){
+                this.stats.pongCounter++;
             }else{
                 console.log("Unsupported event");
             }
@@ -129,7 +139,10 @@ class Twitch extends EventEmitter{
     start(){
         if(!this.ws){
             this.spawn().then(ws => {
+                this.emit("start");
                 this.ws = ws;
+            }).catch(e => {
+                this.emit("error", e);
             });
         }
     }

+ 8 - 0
app/src/web/preload.ts

@@ -88,6 +88,14 @@ window.addEventListener("DOMContentLoaded", () => {
     // }, 10000)
   })
 
+  let twitchError = document.getElementById("twitchError");
+  twitch.on("error", (msg)=>{
+    twitchError.innerText = msg;
+  })
+  twitch.on("start", ()=>{
+    twitchError.innerText = "";
+  })
+
   wssstartstopButton.addEventListener("click", e => {
     console.log("Start stop");
     if(wss.status()){

+ 6 - 2
app/web/index.html

@@ -44,6 +44,9 @@
         .custom-file {
             width: calc( 100% - 155px )
         }
+        #filepath {
+            overflow: hidden;
+        }
 
         .form-btns {
             float:right;
@@ -84,7 +87,7 @@
         </div>
         <div>
             <p>
-                Twitch Connection: <span id="twitchStatus"></span> <button id="twitchstartstop" class="btn btn-primary">Start/Stop</button>
+                Twitch Connection: <span id="twitchStatus"></span> <button id="twitchstartstop" class="btn btn-primary">Start/Stop</button> <span id="twitchError" class="error-mesage"></span>
             </p>
             <p>
                 WebSocket Server Connection: <span id="wssStatus"></span> <button id="wssstartstop" class="btn btn-primary">Start/Stop</button>
@@ -93,7 +96,8 @@
         <h3>Alerts</h3>
         <div class="row" id="alerts">
         </div>
-        <button id="addAlert">Add</button>
+        <button id="addAlert" class="btn btn-success">Add</button>
+        <button id="saveAlert" class="btn btn-primary">Save</button>
     </div>
     <script src="lib/jquery-3.4.1.slim.min.js"></script>
     <script src="lib/popper.min.js"></script>