Settings.ts 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187
  1. import { writeFileSync, readFileSync, existsSync, fstat, copyFileSync } from "fs"
  2. import { resolve } from "path";
  3. import { isArray } from "util";
  4. import electron, { ipcMain, ipcRenderer } from "electron";
  5. function isSameKeys(o: Object, keys: Set<string>){
  6. let objectkeys = Object.keys(o);
  7. for(let i=0;i<objectkeys.length;i++){
  8. if(!keys.has(objectkeys[i])){
  9. return false;
  10. }
  11. }
  12. return true;
  13. }
  14. export type Alert = {
  15. rewardtitle: string,
  16. filepath: string
  17. }
  18. const AlertKeys: Set<string> = new Set([
  19. "rewardtitle",
  20. "filepath"
  21. ])
  22. export type SettingsData = {
  23. twitch_client_id: string,
  24. twitch_oauth_token: string,
  25. port: number,
  26. channel: string,
  27. alerts: {
  28. [key: string]: Alert
  29. }
  30. }
  31. const keys: Set<string> = new Set([
  32. "port",
  33. "twitch_client_id",
  34. "twitch_oauth_token",
  35. "channel",
  36. "alerts"
  37. ]);
  38. class Settings {
  39. options: SettingsData = {
  40. twitch_client_id: "",
  41. twitch_oauth_token: "",
  42. port: 8045,
  43. channel: "",
  44. alerts: {}
  45. };
  46. filename: string;
  47. constructor(filename = "settings.json"){
  48. this.filename = this.getPath(filename);
  49. this.moveOldConfig(filename);
  50. this.load();
  51. }
  52. moveOldConfig(filename: string){
  53. let localSettings = resolve(process.cwd(), filename);
  54. if(existsSync(localSettings) && !existsSync(this.filename)){
  55. copyFileSync(localSettings, this.filename);
  56. }
  57. }
  58. getPath(filename: string):string{
  59. let path:string = ipcRenderer.sendSync("getSettingsPath", filename);
  60. return path;
  61. }
  62. /**
  63. * save settings to file
  64. *
  65. * @memberof Settings
  66. */
  67. save(){
  68. let dataString: string = JSON.stringify(this.options, undefined, "\t");
  69. writeFileSync(this.filename, dataString, {
  70. encoding: "utf8",
  71. mode: 0o600,
  72. flag: "w"
  73. });
  74. }
  75. /**
  76. * load settings from file
  77. *
  78. * @memberof Settings
  79. */
  80. load(){
  81. if(!existsSync(this.filename)){
  82. this.save();
  83. return;
  84. }
  85. let rawData: string = readFileSync(this.filename, {
  86. encoding: "utf8"
  87. });
  88. let data = JSON.parse(rawData);
  89. for(let key of keys.values()){
  90. if(key == "alerts" && data[key] && isArray(data[key])){
  91. let alertArray = {};
  92. for(let it of Object.entries(data["alerts"])){
  93. if(isSameKeys(it[1], AlertKeys)){
  94. alertArray[it[0]] = it[1];
  95. }
  96. }
  97. this.options["alerts"] = alertArray;
  98. }else if(data[key]){
  99. this.options[key] = data[key];
  100. }
  101. }
  102. }
  103. updateView(){
  104. inputs.ClientTID.value = this.options.twitch_client_id
  105. inputs.Port.value = this.options.port.toString()
  106. inputs.OAuthToken.value = this.options.twitch_oauth_token;
  107. inputs.Channel.value = this.options.channel;
  108. }
  109. }
  110. export default Settings
  111. const inputs: {
  112. ClientTID?:HTMLInputElement,
  113. OAuthToken?:HTMLInputElement,
  114. Port?:HTMLInputElement,
  115. Channel?:HTMLInputElement
  116. } = {}
  117. export function initForm(settings: Settings){
  118. inputs.ClientTID = document.getElementById("settClientToken") as HTMLInputElement;
  119. inputs.OAuthToken = document.getElementById("settOAuthToken") as HTMLInputElement;
  120. inputs.Port = document.getElementById("settPort") as HTMLInputElement;
  121. inputs.Channel = document.getElementById("settChannel") as HTMLInputElement;
  122. settings.updateView();
  123. let saceForm = document.getElementById("sett");
  124. saceForm.addEventListener("submit", function(e){
  125. // Twitch Token
  126. settings.options.twitch_client_id = inputs.ClientTID.value;
  127. settings.options.channel = inputs.Channel.value;
  128. // Port
  129. let port: number = parseInt(inputs.Port.value);
  130. if(!isNaN(port) && port > 0 && port < 65535){
  131. settings.options.port = port;
  132. inputs.Port.value = port.toString();
  133. }else{
  134. console.log("Wrong value for port");
  135. inputs.Port.value = settings.options.port.toString();
  136. // TODO: Some error box
  137. }
  138. // All setted
  139. settings.save();
  140. settings.updateView();
  141. e.preventDefault();
  142. return false;
  143. });
  144. let saveAlert = document.getElementById("saveAlert");
  145. saveAlert.addEventListener("click", function(e){
  146. // Twitch Token
  147. settings.options.twitch_client_id = inputs.ClientTID.value;
  148. settings.options.channel = inputs.Channel.value;
  149. // Port
  150. let port: number = parseInt(inputs.Port.value);
  151. if(!isNaN(port) && port > 0 && port < 65535){
  152. settings.options.port = port;
  153. inputs.Port.value = port.toString();
  154. }else{
  155. console.log("Wrong value for port");
  156. inputs.Port.value = settings.options.port.toString();
  157. // TODO: Some error box
  158. }
  159. // All setted
  160. settings.save();
  161. settings.updateView();
  162. e.preventDefault();
  163. return false;
  164. });
  165. }