[Setup] // Add the custom wizard page to the installation //WizardImageFile=wizard.bmp //WizardSmallImageFile=smallwiz.bmp AppName=Matrix <> Meshtastic Relay AppVersion={#AppVersion} DefaultDirName={userpf}\MM Relay DefaultGroupName=MM Relay UninstallFilesDir={app} OutputDir=. OutputBaseFilename=MMRelay_setup PrivilegesRequiredOverridesAllowed=dialog commandline [Files] Source: "dist\mmrelay.exe"; DestDir: "{app}"; Flags: recursesubdirs createallsubdirs; AfterInstall: AfterInstall(ExpandConstant('{app}')); [Icons] Name: "{group}\MM Relay"; Filename: "{app}\mmrelay.bat" Name: "{group}\MM Relay Config"; Filename: "{app}\config.yaml"; IconFilename: "{sys}\notepad.exe"; WorkingDir: "{app}"; Parameters: "config.yaml"; [Run] Filename: "{app}\mmrelay.bat"; Description: "Launch MM Relay"; Flags: nowait postinstall [Code] var TokenInfoLabel: TLabel; TokenInfoLink: TNewStaticText; MatrixPage : TInputQueryWizardPage; OverwriteConfig: TInputOptionWizardPage; MatrixMeshtasticPage : TInputQueryWizardPage; MeshtasticPage : TInputQueryWizardPage; OptionsPage : TInputOptionWizardPage; Connection: string; procedure TokenInfoLinkClick(Sender: TObject); var ErrorCode: Integer; begin if not ShellExec('', 'open', TNewStaticText(Sender).Caption, '', SW_SHOWNORMAL, ewNoWait, ErrorCode) then begin // handle failure if necessary end; end; procedure InitializeWizard; begin OverwriteConfig := CreateInputOptionPage(wpWelcome, 'Configure the relay', 'Create new configuration', '', False, False); MatrixPage := CreateInputQueryPage(OverwriteConfig.ID, 'Matrix Setup', 'Configure Matrix Settings', 'Enter the settings for your Matrix server.'); MeshtasticPage := CreateInputQueryPage(MatrixPage.ID, 'Meshtastic Setup', 'Configure Meshtastic Settings', 'Enter the settings for connecting with your Meshtastic radio.'); MatrixMeshtasticPage := CreateInputQueryPage(MeshtasticPage.ID, 'Matrix <> Meshtastic Setup', 'Configure Matrix <> Meshtastic Settings', 'Connect a Matrix room with a Meshtastic radio channel.'); OptionsPage := CreateInputOptionPage(MatrixMeshtasticPage.ID, 'Additional Options', 'Provide additional optios', 'Set logging and broadcast options, you can keep the defaults.', False, False); OverwriteConfig.Add('Generate configuration (overwrite any current config files)'); OverwriteConfig.Values[0] := False; MatrixPage.Add('Homeserver: (example: https://matrix.org)', False); MatrixPage.Add('Bot User ID (example: @mybotuser:matrix.org)', False); MatrixPage.Add('Access Token (example: syt_bWvzaGjvdD1_PwsXoZgGItImVxBIZbBK_1XZVW8)', False); TokenInfoLabel := TLabel.Create(WizardForm); TokenInfoLabel.Caption := 'For instructions on where to find your access token, visit:'; TokenInfoLabel.Parent := MatrixPage.Surface; TokenInfoLabel.Left := 0; TokenInfoLabel.Top := MatrixPage.Edits[2].Top + MatrixPage.Edits[2].Height + 8; TokenInfoLink := TNewStaticText.Create(WizardForm); TokenInfoLink.Caption := 'https://t2bot.io/docs/access_tokens/'; TokenInfoLink.Cursor := crHand; TokenInfoLink.Font.Color := clBlue; TokenInfoLink.Font.Style := [fsUnderline]; TokenInfoLink.OnClick := @TokenInfoLinkClick; TokenInfoLink.Parent := MatrixPage.Surface; TokenInfoLink.Left := TokenInfoLabel.Left; TokenInfoLink.Top := TokenInfoLabel.Top + TokenInfoLabel.Height; MatrixPage.Edits[0].Hint := 'https://example.matrix.org'; MatrixPage.Edits[1].Hint := '@botuser:example.matrix.org'; MatrixPage.Edits[2].Hint := 'reaalllllyloooooongsecretttttcodeeeeeeforrrrbot'; MeshtasticPage.Add('Connection Type (network or serial)?', False); MeshtasticPage.Add('Serial Port (if serial):', False); MeshtasticPage.Add('Hostname/IP (If network):', False); MeshtasticPage.Add('Meshnet Name:', False); MeshtasticPage.Edits[0].Hint := 'serial or network'; MeshtasticPage.Edits[1].Hint := 'serial port (if serial)'; MeshtasticPage.Edits[2].Hint := 'hostname/IP (if network)'; MeshtasticPage.Edits[3].Hint := 'Name for radio Meshnet'; MatrixMeshtasticPage.Add('Matrix Room ID/Alias (example: #someroom:example.matrix.org)', False); MatrixMeshtasticPage.Add('Meshtastic Channel # (0 is Primary, 1-7 Secondary)', False); MatrixMeshtasticPage.Edits[0].Hint := '!someroomid:example.matrix.org'; MatrixMeshtasticPage.Edits[1].Hint := '0-7 (default 0)'; OptionsPage.Add('Detailed logging'); OptionsPage.Add('Radio broadcasts enabled'); OptionsPage.Values[0] := True; OptionsPage.Values[1] := True; end; function BoolToStr(Value : Boolean): String; begin if Value then result := 'true' else result := 'false'; end; { Skips config setup pages if needed} function ShouldSkipPage(PageID: Integer): Boolean; begin if PageID = OverwriteConfig.ID then Result := False else Result := Not OverwriteConfig.Values[0]; end; procedure AfterInstall(sAppDir: string); var config: string; connection_type: string; serial_port: string; host: string; log_level: string; batch_file: string; begin If Not OverwriteConfig.Values[0] then Exit; if (FileExists(sAppDir+'/config.yaml')) then begin RenameFile(sAppDir+'/config.yaml', sAppDir+'/config-old.yaml'); end; connection_type := MeshtasticPage.Values[0]; serial_port := MeshtasticPage.Values[1]; host := MeshtasticPage.Values[2]; if OptionsPage.Values[0] then begin log_level := 'debug'; end else begin log_level := 'info'; end; config := 'matrix:' + #13#10 + ' homeserver: "' + MatrixPage.Values[0] + '"' + #13#10 + ' bot_user_id: "' + MatrixPage.Values[1] + '"' + #13#10 + ' access_token: "' + MatrixPage.Values[2] + '"' + #13#10 + 'matrix_rooms:' + #13#10 + ' - id: "' + MatrixMeshtasticPage.Values[0] + '"' + #13#10 + ' meshtastic_channel: ' + MatrixMeshtasticPage.Values[1] + #13#10 + 'meshtastic:' + #13#10 + ' connection_type: "' + connection_type + '"' + #13#10 + ' serial_port: "' + serial_port + '"' + #13#10 + ' host: "' + host + '"' + #13#10 + ' meshnet_name: "' + MeshtasticPage.Values[3] + '"' + #13#10 + ' broadcast_enabled: ' + BoolToStr(OptionsPage.Values[1]) + #13#10 + 'logging:' + #13#10 + ' level: "' + log_level + '"' + #13#10 + 'plugins:' + #13#10; if Not SaveStringToFile(sAppDir+'/config.yaml', config, false) then begin MsgBox('Could not create config file "config.yaml". Close any applications that may have it open and re-run setup', mbInformation, MB_OK); end; batch_file := '"' + sAppDir+ '\mmrelay.exe" config.yaml ' + #13#10 + 'pause'; if Not SaveStringToFile(sAppDir+'/mmrelay.bat', batch_file, false) then begin MsgBox('Could not create batch file "relay.bat". Close any applications that may have it open and re-run setup', mbInformation, MB_OK); end; end;