From b15b6b25737a7df7ce7f5c90522fff2c5accbae0 Mon Sep 17 00:00:00 2001 From: Tim_Tech_Dev Date: Thu, 21 Oct 2021 21:27:34 +0200 Subject: [PATCH 1/4] Improve getting started section - Add try_example_bundle.md - Revise service samples Signed-off-by: Tim_Tech_Dev --- docs/assets/log_in_screen.png | Bin 0 -> 36052 bytes docs/assets/nodcg-io-colored.png | Bin 0 -> 122559 bytes docs/assets/nodcg-io-dashboard.png | Bin 0 -> 43684 bytes docs/assets/run_from_vscode.png | Bin 0 -> 24372 bytes docs/getting_started/install.md | 12 +- docs/getting_started/try_example_bundle.md | 158 +++++++++++++++++++++ docs/samples/ahk.md | 36 ++--- docs/samples/android.md | 76 +++++----- docs/samples/artnet.md | 72 ++++++---- docs/samples/curseforge.md | 24 ++-- docs/samples/dbus-ratbagd.md | 48 ++++--- docs/samples/debug.md | 26 ++-- docs/samples/discord-rpc.md | 51 ++++--- docs/samples/discord.md | 50 ++++--- docs/samples/github.md | 48 ++++--- docs/samples/gsheets.md | 55 ++++--- docs/samples/intellij.md | 57 +++++--- docs/samples/irc.md | 38 ++--- docs/samples/midi-input.md | 50 ++++--- docs/samples/midi-io.md | 75 ++++++---- docs/samples/midi-output.md | 59 +++++--- docs/samples/mqtt-client.md | 36 +++-- docs/samples/nanoleaf.md | 44 +++--- docs/samples/obs.md | 48 ++++--- docs/samples/philipshue.md | 53 ++++--- docs/samples/rcon.md | 33 +++-- docs/samples/reddit.md | 43 +++--- docs/samples/sacn-receiver.md | 53 ++++--- docs/samples/sacn-sender.md | 48 ++++--- docs/samples/serial.md | 54 ++++--- docs/samples/shlink.md | 48 ++++--- docs/samples/slack.md | 41 +++--- docs/samples/spotify.md | 52 ++++--- docs/samples/sql.md | 50 ++++--- docs/samples/streamdeck.md | 35 +++-- docs/samples/streamelements.md | 49 ++++--- docs/samples/telegram.md | 32 +++-- docs/samples/tiane.md | 61 +++++--- docs/samples/twitch-addons.md | 48 ++++--- docs/samples/twitch-api.md | 48 ++++--- docs/samples/twitch-chat.md | 48 ++++--- docs/samples/twitch-pubsub.md | 46 +++--- docs/samples/twitter.md | 54 ++++--- docs/samples/websocket-client.md | 33 +++-- docs/samples/websocket-server.md | 31 ++-- docs/samples/xdotool.md | 33 +++-- docs/samples/youtube.md | 51 ++++--- mkdocs.yml | 1 + 48 files changed, 1333 insertions(+), 775 deletions(-) create mode 100644 docs/assets/log_in_screen.png create mode 100644 docs/assets/nodcg-io-colored.png create mode 100644 docs/assets/nodcg-io-dashboard.png create mode 100644 docs/assets/run_from_vscode.png create mode 100644 docs/getting_started/try_example_bundle.md diff --git a/docs/assets/log_in_screen.png b/docs/assets/log_in_screen.png new file mode 100644 index 0000000000000000000000000000000000000000..df9f07680f797c7369c5ee9670f1ee8df6a515e2 GIT binary patch literal 36052 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%0D8?A5mU?8S;nUt6l`+C_t! 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 z�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 C#-*A7 literal 0 HcmV?d00001 diff --git a/docs/assets/run_from_vscode.png b/docs/assets/run_from_vscode.png new file mode 100644 index 0000000000000000000000000000000000000000..aa93962af3585ead8228f893537fcc47d907d79d GIT binary patch literal 24372 zcmeFYWmKKbvMx#tf={r zanHZa7{KiAs;8<;`hB}7f@P&eV4={Vz`(#@#Y6?=!NA_ly?yTe4F2|WvrQY% zg|NN%j(3YoHev4D0avG+IYs^C%^Ve_tK|jPDH6DcZ%5hq!ejgW(wb24YSBon5M=?T zb0THMCxc&7crw2>oh>z!F4t>X$HVT#KM%-Qhjf&ZyNwUc6xExOtp$aV>)?Rz`n*HgUB)togBr^o=@TXxuzJ z@lxZVbR2Yk`0m<5-eWT&bWWN8aLy7dpeA@;$( zQ9!5N=kyX$(PkXX8IsP-xjUS35V7wKq^*%JL-`y+Nj^(GrpSYs-EQ~Lg%U_?+!c(! zcRBt?t|Yj=L{omk_Yh<8-m2KlL0&DJXdx*1G8@&rILW#~yNjkKkty3UMd$Q@8d1Sf zDvF})+yN!;`Oe4$xB$b^x@mQdnZ={RnjK|z^D-0L%hZ%Q1>^p>`p81V5#IIKd3*bVOq#>> zHN#k~0q?yI)ROV81-jJoT=6wc&J=o<>qa`7V? zK3lrtI2u}P%s`_HI9RRIn7&M&==rqs*d{{pcc_xmjI>xzfI+2djLVeD>1%w`+9itk zL&YU==Ex_Rm0$R_T?%(3$xnb)kAX#Ns8zZ^5&`W1?CB)3j?|=8gLu8NZj_q%xZud% z{66s|wev~YV&Z--mD7O{sIt+vmfG19(Gx3_7~yq{3xk;O@;v%^`W_m?;|x@-x@&7O zTeW5u$J2?3-f(Ev?WaQxKwRJnmz;=De z>P*U@3AtZh?#d+}F~wrTvB8mxTka^aN>yPq2n$#?-*Av&WvuE@0XjMb$MEH7U-A7^ zSkLKNQv`@~gE-W{Z8m2cD;pcE7v-#N5sAkPqdfbrZYc9$3TQ_;3m8N8NhVvU)7X{M zA9QJ|U0A>-?bDyB5fLq94wCw;$4aJx+1Z**_7Bc<6#E z?B{sYDi~W%sNC?zNm2)UE%gXb>4(mpGuXh?QZf48ZUHKBf>T>R&%qNLmxJ*XoRON7 zs+Ul@kf0$R55Zk3-<)sAnYLdY zy{+R#D^Wu5@di5*xJpSAh-_)m{x1BuM>(kG7ZMc5)sEz3UhGeEMI^Jt&rrh%QaFc( zjm}B0I<+^lShA7NlR>ARx)IkbcEhgwHL5ucMG&NO?Q{vK< zik19|Exali?_2yaC4UVZMm=>bkV9>R2`X^ z$@=JEIq&IvLJndPADtp~x)EnJ!Gq!-1g?kWQ5^d=adJcj40-5kox>~dk*#h-7sKG` zVdpEIE2Q}(0{0mO)SbL3rELSnM#NZ1`%DufoPL_oyn8*x&)5QB~_`+)e}jubMp09PdWXQ=db z;9_n?vAb&a9Qm`q`$4VR&gs?rBo!*)2b|tXFtq8$kCb}C{)`H{?cVm_r9t%gz6d-X zzDPS?uIV`;?N*A;X?(sjR~Jk|#+$L>(lKqPjnuTnuJ{p&*TOh~CP{S@BJk{5;0i8$ zU_Q&EW3>8>H1Ds+RsxMZ^&X~~Q1bA14YE)a3VGzTkYDaNh`5Rn6|sM>=h_CN43ke#!k{^#L(B4E0?m)`Pgjiiz$gm3fN=u;{5m z9-AOiCWOXRXDuirPtzAXykqczA)X9aU<6QNK9DmMQ~SDGb7Hd43!LEl*s3#u#y+9_ zA_cG2moAT+ccKwt6S+cNpVq%dQOwX4$zp0;kbEv@h5ROvvI{Jl|KJ^fD?vi^?dqBh zsa-mFv#2Pf_D((6;Kw4#7;kIygui@R}12KC#Mv(#&iRS)cnTt(eJ$O^$sV#Y~d+_%-ND_tU)+dVl3*1xC@TF@8{K z&J-$IWrWpkmtg-p=8b0VmyPYCAgu3G2aG;crM1jusezb7b(dc$G2s%YT;=W6R{XR~ z4FQYiCs|=TKtXDuJ9SQ

  • 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 GKKw7Q+%kXw literal 0 HcmV?d00001 diff --git a/docs/getting_started/install.md b/docs/getting_started/install.md index 47004859..b9fc9b53 100644 --- a/docs/getting_started/install.md +++ b/docs/getting_started/install.md @@ -74,15 +74,19 @@ You will get a prompt which asks you which version you want to install. For starters, we recommend using the latest non-development version. -nodecg-io will always be installed into a `nodecg-io/` directory inside your nodecg installation so that your bundles and all bundles from nodecg-io are separated. The CLI will add this path to the loaded bundles in your nodecg configuration automatically, you don't need to worry about it. +nodecg-io will always be installed into a `nodecg-io/` directory inside your NodeCG installation so that your bundles and all bundles from nodecg-io are separated. The CLI will add this path to the loaded bundles in your NodeCG configuration automatically, you don't need to worry about it. If you want to every change your nodecg-io installation to add/remove a service or change the version, you can always re-run `nodecg-io install`. If a nodecg-io installation is found, its options will be preselected in the prompt. Re-running `nodecg-io install` will also update all packages to the latest patch version, if you have a production installation, and pull the repository and rebuild, if you have a development installation. -## Start nodecg +## Start NodeCG -When starting nodecg you should see that all nodecg-io related bundles should be loaded and that you can now access nodecg-io in your nodecg dashboard. +When starting NodeCG you should see that all nodecg-io related bundles should be loaded and that you can now access nodecg-io in your NodeCG dashboard. -Now you can either install an already existing bundle that uses nodecg-io, [create a new bundle](./create_new_bundle.md) or [integrate an existing bundle](./existing_bundle.md). +There are many example bundles premade for most services, so you may take a +look at the [“Try an included sample”](../getting_started/try_example_bundle.md)-Guide. +Or you could directly take a deep dive into our framework and either [create a new bundle](./create_new_bundle.md) +or [integrate an existing bundle](./existing_bundle.md). There are other bundles +using nodecg-io, witch you could try, so may take a look around GitHub or GitLab. ## Uninstall nodecg-io diff --git a/docs/getting_started/try_example_bundle.md b/docs/getting_started/try_example_bundle.md new file mode 100644 index 00000000..560ccc00 --- /dev/null +++ b/docs/getting_started/try_example_bundle.md @@ -0,0 +1,158 @@ +# Try an included sample + +Trying one of the premade example bundles, is a good way to get to know the +framework and especially the selected service. + +## Step 1: Installing the Sample + +If you installed **dev** branch or cloned nodecg-io directly from GitHub all the +samples should be already installed (you can move to step 2). In case you +installed the **production** branch of nodecg-io, you may have to download the +sample before you can use it. In case you already installed it previously you +can move on to step 2. +Installing and uninstalling of sample bundles can be done with the nodecg-io +CLI. + +Run this command inside your NodeCG folder: + +```shell +$ nodecg-io install +Installing nodecg-io... +``` + +You will be presented with a pair of options: + + + +1. You can select the version of nodecg-io to install. **Select here the version already installed.** (Since this is not the migration guide) +
    user@computer:~/nodecg$ nodecg-io install
    +   Installing nodecg-io...
    +   Detected nodecg installation at /home/user/nodecg.
    +   ? Which version do you want to install?  (Use arrow keys) 
    +     development 
    +   ❯ 0.1
    +2. You can select the sample bundles to be included. **Select here the sample(s) you want to try.** +
    user@computer:~/nodecg$ nodecg-io install
    +   Installing nodecg-io...
    +   Detected nodecg installation at /home/user/nodecg.
    +   ? Which version do you want to install? 0.1
    +   ? Which services do you want to use? (Press <space> to select, <a> to toggle all, <i> to invert selection, and <enter> to proceed)
    +   ❯◯ ahk
    +    ◯ android
    +    ◯ curseforge
    +    ◯ discord
    +    ◯ intellij
    +    ◯ irc
    +    ◯ midi-input
    +   (Move up and down to reveal more choices)
    + + + +## Step 2: Run NodeCG + +Now you need to start NodeCG. There are a couple of different ways to do this: + +### Using VS Code + +If you have nodecg-io open in your VS Code instance, you can launch NodeCG using +the `Run and Debug` Explorer View: + +![Run and Debug Explorer View](../assets/run_from_vscode.png) + +### Using the terminal + +You also launch NodeCG using your terminal with: + +
    user@computer:~/nodecg$ npm run start
    +
    +> nodecg@1.8.1 start
    +> node index.js
    +
    +info: [nodecg/lib/server] Starting NodeCG 1.8.1 (Running on Node.js v16.11.1)
    +info: [nodecg-io-core] Minzig!
    +
    +// A whole host of logging output
    +
    +info: [nodecg/lib/server] NodeCG running on http://localhost:9090
    + +Now you can open the NodeCG dashboard under . + +## Step 3: Log in to nodecg-io + +Now navigate to the `nodecg-io` tab in the NodeCG dashboard. + +If you are logging in for the first time you will have to set your password. + +![Log in screen](../assets/log_in_screen.png) + +Else you simply have to log in with your previously chosen password. + +Now you are in the `nodecg-io` config menu. It should look like this: + +![`nodcg-io` config menu](../assets/nodcg-io-dashboard.png) + +## Step 4: Learning how to use the GUI + +The current GUI is just intended to make the project usable, but is not very +user-friendly. As a more long term solution, a new GUI will be developed that +also focuses at user experience. But till the new GUI is developed you will have +to arrange yourself with this one. So, to get started: + +![`nodcg-io` colour coded](../assets/nodcg-io-colored.png) + +### In pink: NodeCG Tabs + +Here you will find every NodeCG-bundle, which has a dashboard. Here you may +select the [`nodecg-io-debug`](../samples/debug.md)-dashboard, if you have it +installed. + +### In yellow: Monaco editor + +It is basically only a text editor which is used to save configurations for +service instances. + +### In green: Services section + +Here you may create, update and delete instances of a service. Each instance has +its own name and configuration. The menu will expand depending on the option +selected in the first dropdown. + +_Creating a new service instance_: + +This can be accomplished by selecting the item `'New'`. Then a new dropdown will +be revealed, in witch you may select the service type. Additionally, you must +select an instance name. Then click `'Create'`. The new created instance should +be selected. + +_Configure a service instance_: + +While a supported service instance is selected, you may change the config in +monaco, then click `'Save'`. + +_Deleting a service instance_: + +This can be accomplished by selecting an existing instance. Then click +`'Delete Instance'`. + +### In violet: Bundles section + +This section has tree dropdowns: + +1. Bundle: Here you can select a bundle to configure. +2. Service: If this bundle uses more than one service, you can select her the + service to set or unset. +3. Service Instance: Here you can select one instance of the service type set at + 2 or `none`. + +### In red: Unset all Button + +This button will set the service instance for every bundle/service combination +to none, effectively removing the access to every service from all bundles. +**Caution**: This cant be undone, and you will have to set up all the bundles +again. _The service instances will be unaffected._ + +## Step 5: Configure the sample + +The configuration for every sample bundle is too different to be included here, +so you have to take a look at the documentation for your sample bundle. You will +find it on the left-hand side of this page in the category `Services`. diff --git a/docs/samples/ahk.md b/docs/samples/ahk.md index 9c6adc83..e5ebc8ea 100644 --- a/docs/samples/ahk.md +++ b/docs/samples/ahk.md @@ -1,25 +1,27 @@ -## Using the AHK sample bundle +## Using the AutoHotkey sample bundle -The AHK sample bundle in `samples/ahk-sendcommand` shows how to send a command to a HotkeylessAHK server. +The AutoHotkey sample bundle in `samples/ahk-sendcommand` shows how to send a +command to a HotkeylessAHK server. ### Prerequisites -- Working NodeCG & nodecg-io installation -- A running [HotkeylessAHK](https://github.com/sebinside/HotkeylessAHK) setup. - -### Configure the ahk sample bundle - -1. Start nodecg with nodecg-io installed. The ahk bundle is currently part of it, so it should also be loaded. +You will need a working `nodecg-io` installation. If you have non yet take a +look at [installation guide](../getting_started/install.md). You may need to +install this bundle, so take a look at the +[“Try an included sample”](../getting_started/try_example_bundle.md)-Guide. It +will also tell you how to log in and how to use the GUI. -2. Go to the `nodecg-io` tab in the nodecg dashboard. +**You also need:** -3. Login using your password. If this is your first run, then enter the password with which you want to encrypt your configurations and credentials. - -4. Create a new ahk service instance using the left upper menu. +- A running [HotkeylessAHK](https://github.com/sebinside/HotkeylessAHK) setup. -5. Enter the host and port of the HotkeylessAHK Server. +### Configure the AutoHotkey sample bundle - The created instance should be automatically selected, if not select it in the upper left menu. Enter your host and port in monaco (the text-editor on the right) in this format: +1. In NodeCG, create a new ahk service instance using the left upper menu. +2. Enter the host and port of the HotkeylessAHK Server. + The created instance should be automatically selected, if not select it in + the upper left menu. Enter your host and port in monaco (the text-editor on + the right) in this format: ```json { @@ -30,6 +32,6 @@ The AHK sample bundle in `samples/ahk-sendcommand` shows how to send a command t After entering it, click save. -6. Set the created ahk service instance to the service dependency of the ahk bundle. - -7. A small window with the text “Hello World” should have popped up. +3. Set the created ahk service instance to the service dependency of the ahk + bundle. +4. A small window with the text “Hello World” should have popped up. diff --git a/docs/samples/android.md b/docs/samples/android.md index 583366e3..eebb0729 100644 --- a/docs/samples/android.md +++ b/docs/samples/android.md @@ -1,42 +1,49 @@ ## Using the Android sample bundle -The Android example bundle in `samples/android` shows how to connect to an android device and turn on WLAN. - -1. Clone [this](https://github.com/noeppi-noeppi/nodecg-io-android) Git Repository - -2. Run `gradlew build` (on Windows) or `./gradlew build` (on Linux) inside the cloned repository. - -3. There will be an apk file generated in `app/build/outputs/apk/debug/app-debug.apk`. Install it on the device. - -4. Launch the app. You'll be asked to grant the system alert window permission. This is required because the app will do its work in the background. However, occasionally when user interaction is required, it needs to launch an activity without the user pressing the app icon in the launcher. - -5. Install the android developer tools and make sure you have the `adb` command in your `PATH` - -6. Enable developer options on you device and enable USB debugging there. See [here](https://developer.android.com/studio/debug/dev-options). - +The Android example bundle in `samples/android` shows how to connect to an +Android device and turn on WLAN. + +### Prerequisites + +You will need a working `nodecg-io` installation. If you have non yet take a +look at [installation guide](../getting_started/install.md). You may need to +install this bundle, so take a look at the +[“Try an included sample”](../getting_started/try_example_bundle.md)-Guide. It +will also tell you how to log in and how to use the GUI. + +**You also need:** + +1. Clone [this](https://github.com/noeppi-noeppi/nodecg-io-android) Git + Repository +2. Run `gradlew build` (on Windows) or `./gradlew build` (on Linux) inside the + cloned repository. +3. There will be an apk file generated in + `app/build/outputs/apk/debug/app-debug.apk`. Install it on the Android + device. +4. Launch the app. You'll be asked to grant the system alert window permission. + This is required because the app will do its work in the background. However, + occasionally when user interaction is required, it needs to launch an + activity without the user pressing the app icon in the launcher. +5. Install the android developer tools and make sure you have the `adb` command + in your `PATH` +6. Enable developer options on you device and enable USB debugging there. See + [here](https://developer.android.com/studio/debug/dev-options). 7. Run `adb start-server` - -8. Connect your device via USB. You'll be prompted whether you want to allow USB debugging. Press `Allow`. - +8. Connect your device via USB. You'll be prompted whether you want to allow USB + debugging. Press `Allow`. 9. Run `adb device -l`. The output might look like this: - ``` + ```log ######## device usb:2-1.7 product:######## model:######## device:######## transport_id:2 ``` - The hexadecimal number in the first column is your device ID. You'll need this later. - -10. Start nodecg with nodecg-io installed. The bundle is currently part of it, so it should also be loaded. - -11. Go to the `nodecg-io` tab in the nodecg dashboard. - -12. Login using your password. If this is your first run, then enter the password with which you want to encrypt your configurations and credentials. + The hexadecimal number in the first column is your device ID. You'll need + this later. -13. Create a new android service instance using the left upper menu. +10. In NodeCG, create a new android service instance using the left upper menu. +11. Enter the following: -14. Enter the following - - ``` + ```json { "device": "device_id" } @@ -44,8 +51,9 @@ The Android example bundle in `samples/android` shows how to connect to an andro Replace `device_id` with your device ID. -15. Set the created android service instance to the service dependency of the android sample bundle. - - Select the android bundle and the android service in the left bottom menu and then select the service instance that should be used by the android sample bundle (in this case the name of the previously created android instance). - -16. You should see that WLAN is now activated on your device. +12. Set the created android service instance to the service dependency of the + android sample bundle. + Select the android bundle and the android service in the left bottom menu. + Then select the service instance that should be used by the android sample + bundle (in this case the name of the previously created android instance). +13. You should see that WLAN is now activated on your device. diff --git a/docs/samples/artnet.md b/docs/samples/artnet.md index 8c628183..e6837834 100644 --- a/docs/samples/artnet.md +++ b/docs/samples/artnet.md @@ -1,25 +1,32 @@ ## Using the Art-Net sample bundle -The Art-Net example bundle in `samples/artnet-console` demonstrates the ability send data via Art-Net to e.g., open lighting architecture or professional lighting equipment. Here is a guide to how to get it working. The underlying service is using [`jeffreykog/node-artnet-protocol`](https://github.com/jeffreykog/node-artnet-protocol) as its library. +The Art-Net example bundle in `samples/artnet-console` demonstrates the ability +send data via Art-Net to e.g., open lighting architecture or professional +lighting equipment. Here is a guide to how to get it working. The underlying +service is using +[`jeffreykog/node-artnet-protocol`](https://github.com/jeffreykog/node-artnet-protocol) +as its library. ### Prerequisites -- Working NodeCG & nodecg-io installation -- A working Art-Net Node in the current network - -### Configure the Art-Net sample bundle +You will need a working `nodecg-io` installation. If you have non yet take a +look at [installation guide](../getting_started/install.md). You may need to +install this bundle, so take a look at the +[“Try an included sample”](../getting_started/try_example_bundle.md)-Guide. It +will also tell you how to log in and how to use the GUI. -1. Start nodecg with nodecg-io installed. The artnet-console sample bundle is currently part of it, so it should also be loaded. +**You also need:** -2. Go to the `nodecg-io` tab in the nodecg dashboard. - -3. Login using your password. If this is your first run, then enter the password with which you want to encrypt your configurations and credentials. +- A working Art-Net Node in the current network -4. Create a new Art-Net service instance using the left upper menu. +### Configure the Art-Net sample bundle -5. Enter the needed option. +1. In NodeCG, create a new Art-Net service instance using the left upper menu. +2. Enter the needed option. - The created instance should be automatically selected, if not select it in the upper left dropdown. Enter your universe in monaco (the text-editor on the right) in this format: + The created instance should be automatically selected, if not select it in + the upper left dropdown. Enter your universe in monaco (the text-editor on + the right) in this format: **Host** @@ -31,19 +38,19 @@ The Art-Net example bundle in `samples/artnet-console` demonstrates the ability } ``` - After entering it, click save. + After entering it, click save. + You may overwrite this broadcast address in code with + `client.bind("host address");`. - You may overwrite this broadcast address in code with `client.bind("host address");`. +3. Set the created Art-Net service instance to the service dependency of the + artnet-console bundle. + Select the artnet-console bundle and the Art-Net service in the left bottom + dropdown and then select the service instance that should be used by the + artnet-console bundle (in this case the name of the previously created + Art-Net instance). - _Note:_ If you don't see monaco on the right, try reloading the page. - -6. Set the created Art-Net service instance to the service dependency of the artnet-console bundle. - - Select the artnet-console bundle and the Art-Net service in the left bottom dropdown and then select the service instance that should be used by the artnet-console bundle (in this case the name of the previously created Art-Net instance). - -7. Check the nodecg logs - - You should see data logged. +4. Check the NodeCG logs + You should see data logged. ### Explanations @@ -66,7 +73,12 @@ declare class ArtDmx { physical: number; universe: number; data: number[]; - constructor(sequence: number, physical: number, universe: number, data: number[]); + constructor( + sequence: number, + physical: number, + universe: number, + data: number[] + ); isSequenceEnabled(): boolean; static decode(data: Buffer): ArtDmx; toString(): string; @@ -87,10 +99,12 @@ setInterval(() => { }, 800); ``` -_Note_: Since neither this library nor nodecg-io does not yet contain an abstraction, so the data is sent to the timings set by the specification, you should respect this part of specification in **your implementation**. +_Note_: Since neither this library nor nodecg-io does not yet contain an +abstraction, so the data is sent to the timings set by the specification, you +should respect this part of specification in **your implementation**. -> However, an input that is active but not changing, will re-transmit the last valid ArtDmx -> packet at approximately 4-second intervals. (_Note_. In order to converge the needs of Art- -> Net and sACN it is recommended that Art-Net devices actually use a re-transmit time of -> 800mS to 1000mS). +> However, an input that is active but not changing, will re-transmit the last +> valid ArtDmx packet at approximately 4-second intervals. (_Note_. In order to +> converge the needs of Art- Net and sACN it is recommended that Art-Net devices +> actually use a re-transmit time of 800mS to 1000mS). > — [Art-Net 4 Specification p. 48](https://artisticlicence.com/WebSiteMaster/User%20Guides/art-net.pdf) diff --git a/docs/samples/curseforge.md b/docs/samples/curseforge.md index c28822d0..955f7926 100644 --- a/docs/samples/curseforge.md +++ b/docs/samples/curseforge.md @@ -1,16 +1,24 @@ ## Using the CurseForge sample bundle -The CurseForge example bundle in `samples/curseforge` demonstrates the ability to search for different add-ons with the ID or search with specific values for matching add-ons. Here is a guide how to get it working. +The CurseForge example bundle in `samples/curseforge` demonstrates the ability +to search for different add-ons with the ID or search with specific values for +matching add-ons. Here is a guide how to get it working. ### Prerequisites -- Working NodeCG & nodecg-io installation +You will need a working `nodecg-io` installation. If you have non yet take a +look at [installation guide](../getting_started/install.md). You may need to +install this bundle, so take a look at the +[“Try an included sample”](../getting_started/try_example_bundle.md)-Guide. It +will also tell you how to log in and how to use the GUI. ### Configure the CurseForge bundle -1. Start NodeCG with nodecg-io installed. The CurseForge bundle is currently part of it, so it should also be loaded. -2. Login using your password. If this is your first run, then enter the password with which you want to encrypt your configurations and credentials. -3. Create a new CurseForge service instance using the left upper menu. -4. Set the CurseForge service instance to the service dependency of the CurseForge bundle. - Select the CurseForge bundle and the CurseForge service in the left bottom menu and then select the service instance that should be used by the CurseForge bundle (in this case the name of the previously created CurseForge instance). -5. Check the NodeCG logs. You should see two lists of add-ons. +1. In NodeCG, create a new CurseForge service instance using the left upper + menu. +2. Set the CurseForge service instance to the service dependency of the + CurseForge bundle. Select the CurseForge bundle and the CurseForge service in + the left bottom menu. Then select the service instance that should be used by + the CurseForge bundle (in this case the name of the previously created + CurseForge instance). +3. Check the NodeCG logs. You should see two lists of add-ons. diff --git a/docs/samples/dbus-ratbagd.md b/docs/samples/dbus-ratbagd.md index f1691ea5..28c3d4a3 100644 --- a/docs/samples/dbus-ratbagd.md +++ b/docs/samples/dbus-ratbagd.md @@ -1,25 +1,27 @@ -## Using the DBus ratbagd sample bundle +## Using the D-Bus ratbagd sample bundle -The dbus-ratbagd example bundle in `samples/dbus-ratbagd` demonstrates how to access all devices supported by ratbagd. Here is a guide to how to get it working. +The `dbus-ratbagd` example bundle in `samples/dbus-ratbagd` demonstrates how to +access all devices supported by ratbagd. Here is a guide to how to get it +working. ### Prerequisites -- Working NodeCG & nodecg-io installation -- [ratbagd](https://github.com/libratbag/libratbag) - -### Configure the DBus ratbagd sample bundle +You will need a working `nodecg-io` installation. If you have non yet take a +look at [installation guide](../getting_started/install.md). You may need to +install this bundle, so take a look at the +[“Try an included sample”](../getting_started/try_example_bundle.md)-Guide. It +will also tell you how to log in and how to use the GUI. -1. Start nodecg with nodecg-io installed. The dbus-ratbagd bundle is currently part of it so it should also be loaded. +**You also need:** -2. Go to the `nodecg-io` tab in the nodecg dashboard. - -3. Login using your password. If this is your first run, then enter the password with which you want to encrypt your configurations and credentials. - -4. Create a new dbus service instance using the left upper menu. +- [ratbagd](https://github.com/libratbag/libratbag) -5. Configure the dbus service +### Configure the DBus ratbagd sample bundle - There should not be any additional configuration needed for the dbus service. Just enter an empty json object like this: +1. In NodeCG, create a new D-Bus service instance using the left upper menu. +2. Configure the D-Bus service + There should not be any additional configuration needed for the D-Bus + service. Just enter an empty JSON object like this: ```json {} @@ -27,12 +29,12 @@ The dbus-ratbagd example bundle in `samples/dbus-ratbagd` demonstrates how to ac After entering it, click save. - _Note:_ If you don't see monaco on the right, try reloading the page. - -6. Set the created dbus service instance to the service dependency of the dbus-ratbagd bundle. - - Select the dbus-ratbagd bundle and the dbus service in the left bottom menu and then select the service instance that should be used by the dbus-ratbagd sample bundle (in this case the name of the previously created dbus instance). - -7. Check the nodecg logs - - You should see an error or a success message and a list of connected device names +3. Set the created D-Bus service instance to the service dependency of the + `dbus-ratbagd` bundle. + Select the `dbus-ratbagd` bundle and the D-Bus service in the left bottom + menu. Then select the service instance that should be used by the + `dbus-ratbagd` sample bundle (in this case the name of the previously created + D-Bus instance). +4. Check the NodeCG logs + You should see an error or a success message and a list of connected device + names. diff --git a/docs/samples/debug.md b/docs/samples/debug.md index adb1f844..2da433c9 100644 --- a/docs/samples/debug.md +++ b/docs/samples/debug.md @@ -1,17 +1,25 @@ ## Using the Debug sample bundle -The Debug Helper example bundle in `samples/debug` demonstrates the ability to use the debug helper to send same sample data to your bundle, so you can trigger different features and test/debug them. +The Debug Helper example bundle in `samples/debug` demonstrates the ability to +use the debug helper to send same sample data to your bundle, so you can trigger +different features and test/debug them. ### Prerequisites -- Working NodeCG & nodecg-io installation +You will need a working `nodecg-io` installation. If you have non yet take a +look at [installation guide](../getting_started/install.md). You may need to +install this bundle, so take a look at the +[“Try an included sample”](../getting_started/try_example_bundle.md)-Guide. It +will also tell you how to log in and how to use the GUI. ### Configure the Debug sample bundle -1. Start NodeCG with nodecg-io installed. The Debug sample bundle is currently part of it, so it should also be loaded. -2. Login using your password. If this is your first run, then enter the password with which you want to encrypt your configurations and credentials. -3. Create a new Debug service instance using the left upper menu. -4. Set the Debug service instance to the service dependency of the Debug sample bundle. - Select the Debug sample bundle and the Debug service in the left bottom menu and then select the service instance that should be used by the Debug sample bundle (in this case the name of the previously created Debug instance). -5. Go to the nodecg-io-debug dashboard and use some buttons or other inputs. -6. Check the nodecg log. It should contain a message for each action you did and the passed values. +1. In NodeCG, create a new Debug service instance using the left upper menu. +2. Set the Debug service instance to the service dependency of the Debug sample + bundle. Select the Debug sample bundle and the Debug service in the left + bottom menu. Then select the service instance that should be used by the + Debug sample bundle (in this case the name of the previously created Debug + instance). +3. Go to the nodecg-io-debug dashboard and use some buttons or other inputs. +4. Check the NodeCG log. It should contain a message for each action you did and + the passed values. diff --git a/docs/samples/discord-rpc.md b/docs/samples/discord-rpc.md index 3beaae24..ab1e8d36 100644 --- a/docs/samples/discord-rpc.md +++ b/docs/samples/discord-rpc.md @@ -1,27 +1,32 @@ ## Using the Discord RPC sample bundle -The discord-rpc example bundle in `samples/discord-rpc` demonstrates the ability to access a locally running discord client. Here is a guide to how to get it working. +The Discord Rich Presence example bundle in `samples/discord-rpc` demonstrates +the ability to access a locally running discord client. Here is a guide to how +to get it working. ### Prerequisites -- Working NodeCG & nodecg-io installation -- A discord application with permissions `indentify` and `rpc` - -_Note:_ If you don't have an application yet, you can create one [here](https://discord.com/developers/applications) - -### Configure the Discord RPC sample bundle - -1. Start nodecg with nodecg-io installed. The discord-rpc bundle is currently part of it so it should also be loaded. +You will need a working `nodecg-io` installation. If you have non yet take a +look at [installation guide](../getting_started/install.md). You may need to +install this bundle, so take a look at the +[“Try an included sample”](../getting_started/try_example_bundle.md)-Guide. It +will also tell you how to log in and how to use the GUI. -2. Go to the `nodecg-io` tab in the nodecg dashboard. +**You also need:** -3. Login using your password. If this is your first run, then enter the password with which you want to encrypt your configurations and credentials. +- A discord application with permissions `indentify` and `rpc` -4. Create a new discord-rpc service instance using the left upper menu. +_Note:_ If you don't have an application yet, you can create one +[here](https://discord.com/developers/applications) -5. Enter required information. +### Configure the Discord RPC sample bundle - The created instance should be automatically selected, if not select it in the upper left menu. Enter your information in monaco (the text-editor on the right) in this format: +1. In NodeCG, create a new `discord-rpc` service instance using the left upper + menu. +2. Enter required information. + The created instance should be automatically selected, if not select it in + the upper left menu. Enter your information in monaco (the text-editor on the + right) in this format: ```json { @@ -32,12 +37,12 @@ _Note:_ If you don't have an application yet, you can create one [here](https:// After entering it, click save. - _Note:_ If you don't see monaco on the right, try reloading the page. - -6. Set the created discord-rpc service instance to the service dependency of the discord-rpc bundle. - - Select the discord-rpc bundle and the discord-rpc service in the left bottom menu and then select the service instance that should be used by the discord-rpc sample bundle (in this case the name of the previously created discord-rpc instance). - -7. Check the nodecg logs - - You should see an error or a success message displaying your discord username. +3. Set the created `discord-rpc` service instance to the service dependency of + the `discord-rpc` bundle. + Select the `discord-rpc` bundle and the `discord-rpc` service in the left + bottom menu. Then select the service instance that should be used by the + `discord-rpc` sample bundle (in this case the name of the previously created + `discord-rpc` instance). +4. Check the NodeCG logs + You should see an error or a success message displaying your discord + username. diff --git a/docs/samples/discord.md b/docs/samples/discord.md index a9c6e64c..4ec1c349 100644 --- a/docs/samples/discord.md +++ b/docs/samples/discord.md @@ -1,27 +1,32 @@ ## Using the Discord sample bundle -The Discord-guild-chat example bundle in `samples/discord-guild-chat` demonstrates the ability to reply with `pong` to messages which are equal to `!ping` or `ping`. Here is a guide to how to get it working. +The Discord-guild-chat example bundle in `samples/discord-guild-chat` +demonstrates the ability to reply with `pong` to messages which are equal to +`!ping` or `ping`. Here is a guide to how to get it working. ### Prerequisites -- Working NodeCG & nodecg-io installation -- a Discord Bot token +You will need a working `nodecg-io` installation. If you have non yet take a +look at [installation guide](../getting_started/install.md). You may need to +install this bundle, so take a look at the +[“Try an included sample”](../getting_started/try_example_bundle.md)-Guide. It +will also tell you how to log in and how to use the GUI. -_Note:_ If you don't have such a token yet, you can follow [this](https://discordjs.guide/preparations/setting-up-a-bot-application.html) guide. +**You also need:** -### Configure the Discord sample bundle - -1. Start nodecg with nodecg-io installed. The Discord-guild-chat bundle is currently part of it, so it should also be loaded. - -2. Go to the `nodecg-io` tab in the nodecg dashboard. +- A Discord Bot token -3. Login using your password. If this is your first run, then enter the password with which you want to encrypt your configurations and credentials. +_Note:_ If you don't have such a token yet, you can follow +[this](https://discordjs.guide/preparations/setting-up-a-bot-application.html) +guide. -4. Create a new discord service instance using the left upper menu. - -5. Enter your bot token. +### Configure the Discord sample bundle - The created instance should be automatically selected, if not select it in the upper left menu. Enter your Bot token in monaco (the text-editor on the right) in this format: +1. In NodeCG, create a new discord service instance using the left upper menu. +2. Enter your bot token. + The created instance should be automatically selected, if not select it in + the upper left menu. Enter your Bot token in monaco (the text-editor on the + right) in this format: ```json { @@ -31,12 +36,11 @@ _Note:_ If you don't have such a token yet, you can follow [this](https://discor After entering it, click save. - _Note:_ If you don't see monaco on the right, try reloading the page. - -6. Set the created discord service instance to the service dependency of the Discord-guild-chat bundle. - - Select the Discord-guild-chat bundle and the Discord service in the left bottom menu and then select the service instance that should be used by the Discord-guild-chat bundle (in this case the name of the previously created discord instance). - -7. Check the nodecg logs - - You should see an error or a Login message. +3. Set the created discord service instance to the service dependency of the + Discord-guild-chat bundle. + Select the Discord-guild-chat bundle and the Discord service in the left + bottom menu. Then select the service instance that should be used by the + Discord-guild-chat bundle (in this case the name of the previously created + discord instance). +4. Check the NodeCG logs. + You should see an error or a Login message. diff --git a/docs/samples/github.md b/docs/samples/github.md index 9af59120..ae51f86c 100644 --- a/docs/samples/github.md +++ b/docs/samples/github.md @@ -1,27 +1,31 @@ ## Using the GitHub sample bundle -The GitHub example bundle in `samples/github` demonstrates the ability to access the GitHub rest API. Here is a guide to how to get it working. +The GitHub example bundle in `samples/github` demonstrates the ability to access +the GitHub rest API. Here is a guide to how to get it working. ### Prerequisites -- Working NodeCG & nodecg-io installation -- a GitHub token +You will need a working `nodecg-io` installation. If you have non yet take a +look at [installation guide](../getting_started/install.md). You may need to +install this bundle, so take a look at the +[“Try an included sample”](../getting_started/try_example_bundle.md)-Guide. It +will also tell you how to log in and how to use the GUI. -_Note:_ If you don't have a token yet, you can create one [here](https://github.com/settings/tokens/new). The token requires at least the `repo` scope. +**You also need:** -### Configure the GitHub sample bundle - -1. Start nodecg with nodecg-io installed. The GitHub bundle is currently part of it, so it should also be loaded. - -2. Go to the `nodecg-io` tab in the nodecg dashboard. - -3. Login using your password. If this is your first run, then enter the password with which you want to encrypt your configurations and credentials. +- A GitHub token -4. Create a new GitHub service instance using the left upper menu. +_Note:_ If you don't have a token yet, you can create one +[here](https://github.com/settings/tokens/new). The token requires at least the +`repo` scope. -5. Enter the GitHub token. +### Configure the GitHub sample bundle - The created instance should be automatically selected, if not select it in the upper left menu. Enter your GitHub token in monaco (the text-editor on the right) in this format: +1. In NodeCG, create a new GitHub service instance using the left upper menu. +2. Enter the GitHub token. + The created instance should be automatically selected, if not select it in + the upper left menu. Enter your GitHub token in monaco (the text-editor on + the right) in this format: ```json { @@ -31,12 +35,12 @@ _Note:_ If you don't have a token yet, you can create one [here](https://github. After entering it, click save. - _Note:_ If you don't see monaco on the right, try reloading the page. - -6. Set the created GitHub service instance to the service dependency of the GitHub bundle. - - Select the GitHub bundle and the GitHub service in the left bottom menu and then select the service instance that should be used by the GitHub sample bundle (in this case the name of the previously created GitHub instance). - -7. Check the nodecg logs +3. Set the created GitHub service instance to the service dependency of the + GitHub bundle. + Select the GitHub bundle and the GitHub service in the left bottom menu. Then + select the service instance that should be used by the GitHub sample bundle + (in this case the name of the previously created GitHub instance). - You should see an error or a success message and a list of all your repositories. +4. Check the NodeCG logs + You should see an error or a success message and a list of all your + repositories. diff --git a/docs/samples/gsheets.md b/docs/samples/gsheets.md index 9311dc3f..4f4a6a55 100644 --- a/docs/samples/gsheets.md +++ b/docs/samples/gsheets.md @@ -1,29 +1,36 @@ ## Using the gsheets sample bundle -The gsheets bundle in `samples/gsheets` demonstrates the ability of retrieving all rows where column A is filled. Here is a guide to how to get it working. +The gsheets bundle in `samples/gsheets` demonstrates the ability of retrieving +all rows where column A is filled. Here is a guide to how to get it working. ### Prerequisites -- Working NodeCG & nodecg-io installation +You will need a working `nodecg-io` installation. If you have non yet take a +look at [installation guide](../getting_started/install.md). You may need to +install this bundle, so take a look at the +[“Try an included sample”](../getting_started/try_example_bundle.md)-Guide. It +will also tell you how to log in and how to use the GUI. + +**You also need:** + - Google cloud API OAuth access (client ID, client Secret) - Grant `Google Sheets API v4` access at the project's dashboard. - - Shortcut URL: > + - Shortcut URL: + > -_Note:_ If you don't have such a key yet, you can generate them like [this](https://developers.google.com/identity/protocols/oauth2/web-server#creatingcred). As the redirect URI add . +_Note:_ If you don't have such a key yet, you can generate them like +[this](https://developers.google.com/identity/protocols/oauth2/web-server#creatingcred). +As the redirect URI add +. ### Configure the gsheets sample bundle -1. Start nodecg with nodecg-io installed. The gsheets bundle is currently part of it, so it should also be loaded. - -2. Go to the `nodecg-io` tab in the nodecg dashboard. - -3. Login using your password. If this is your first run, then enter the password with which you want to encrypt your configurations and credentials. - -4. Create a new googleapis service instance using the left upper menu. - -5. Enter credentials for googleapis. - - The created instance should be automatically selected, if not select it in the upper left menu. Enter your gsheets OAuth credentials in monaco (the text-editor on the right) in this format: +1. In NodeCG, create a new googleapis service instance using the left upper + menu. +2. Enter credentials for googleapis. + The created instance should be automatically selected, if not select it in + the upper left menu. Enter your gsheets OAuth credentials in monaco (the + text-editor on the right) in this format: ```json { @@ -35,13 +42,15 @@ _Note:_ If you don't have such a key yet, you can generate them like [this](http After entering it, click save. - _Note:_ If you don't see monaco on the right, try reloading the page. - _Note:_ You can add multiple scopes if the googleapis instance is used for multiple bundles. - -6. Set the created googleapis service instance to the service dependency of the gsheets bundle. - - Select the gsheets bundle and the googleapis service in the left bottom menu and then select the service instance that should be used by the gsheets bundle (in this case the name of the previously created googleapis instance). + _Note:_ You can add multiple scopes if the googleapis instance is used for + multiple bundles. -7. Check the nodecg logs +3. Set the created googleapis service instance to the service dependency of the + gsheets bundle. + Select the gsheets bundle and the googleapis service in the left bottom menu. + Then select the service instance that should be used by the gsheets bundle + (in this case the name of the previously created googleapis instance). - You should see an error or a success message that is hardcoded in `samples/gsheets/extension/index.ts`. +4. Check the NodeCG logs + You should see an error or a success message that is hardcoded in + `samples/gsheets/extension/index.ts`. diff --git a/docs/samples/intellij.md b/docs/samples/intellij.md index 2e57d957..5a54a53f 100644 --- a/docs/samples/intellij.md +++ b/docs/samples/intellij.md @@ -1,28 +1,35 @@ ## Using the IntelliJ sample bundle -The IntelliJ example bundle in `samples/intellij-integration` Shows how to connect to a JetBrains IDE and print all installed plugins. Here is a guide to how to get it working: +The IntelliJ example bundle in `samples/intellij-integration` Shows how to +connect to a JetBrains IDE and print all installed plugins. Here is a guide to +how to get it working: -1. clone [this](https://github.com/noeppi-noeppi/nodecg-io-intellij) Git Repository +### Prerequisites -2. Make sure you've Java 11 or newer installed. - -3. Run `gradlew build` (on Windows) or `./gradlew build` (on Linux) inside the cloned repository. - -4. Inside your JetBrains IDE go to `Settings` and then `Plugins`. Click on the little gear in the top right corner. Then click `Install from file`. +You will need a working `nodecg-io` installation. If you have non yet take a +look at [installation guide](../getting_started/install.md). You may need to +install this bundle, so take a look at the +[“Try an included sample”](../getting_started/try_example_bundle.md)-Guide. It +will also tell you how to log in and how to use the GUI. -5. Navigate to `path to your cloned repository/build/libs` and select the jar file there. +**You also need:** -6. Restart the IDE - -7. Start nodecg with nodecg-io installed. The bundle is currently part of it, so it should also be loaded. - -8. Go to the `nodecg-io` tab in the nodecg dashboard. +1. Clone [this](https://github.com/noeppi-noeppi/nodecg-io-intellij) Git + Repository. +2. Make sure you've Java 11 or newer installed. +3. Run `gradlew build` (on Windows) or `./gradlew build` (on Linux) inside the + cloned repository. +4. Inside your JetBrains IDE go to `Settings` and then `Plugins`. Click on the + little gear in the top right corner. Then click `Install from file`. +5. Navigate to `path to your cloned repository/build/libs` and select the jar + file there. +6. Restart the IDE. -9. Login using your password. If this is your first run, then enter the password with which you want to encrypt your configurations and credentials. +### Configure the IntelliJ sample bundle -10. Create a new IntelliJ service instance using the left upper menu. +1. In NodeCG, create a new IntelliJ service instance using the left upper menu. -11. Enter the following +2. Enter the following ``` { @@ -30,12 +37,20 @@ The IntelliJ example bundle in `samples/intellij-integration` Shows how to conne } ``` - This tells nodecg-io to look for your IDE's HTTP server on your computer at port `19524`. If you want it to run on another port, please follow the guidelines [here](https://github.com/noeppi-noeppi/nodecg-io-intellij/blob/master/README.md). + This tells nodecg-io to look for your IDE's HTTP server on your computer at + port `19524`. If you want it to run on another port, please follow the + guidelines + [here](https://github.com/noeppi-noeppi/nodecg-io-intellij/blob/master/README.md). -12. Set the created IntelliJ service instance to the service dependency of the sample-intellij bundle. +3. Set the created IntelliJ service instance to the service dependency of the + sample-intellij bundle. - Select the sample-intellij bundle and the IntelliJ service in the left bottom menu and then select the service instance that should be used by the sample-intellij bundle (in this case the name of the previously created IntelliJ instance). + Select the sample-intellij bundle and the IntelliJ service in the left + bottom menu. Then select the service instance that should be used by the + sample-intellij bundle (in this case the name of the previously created + IntelliJ instance). -13. Check the nodecg logs +4. Check the NodeCG logs - You should see an error or a list of all plugins installed at your IDE including the preinstalled ones by JetBrains. + You should see an error or a list of all plugins installed at your IDE + including the preinstalled ones by JetBrains. diff --git a/docs/samples/irc.md b/docs/samples/irc.md index 94f7af69..35158480 100644 --- a/docs/samples/irc.md +++ b/docs/samples/irc.md @@ -1,24 +1,25 @@ ## Using the IRC sample bundle -The IRC example bundle in `samples/irc` demonstrates the ability to get access to an IRC chat. This sample is designed to log the twitch IRC chat of skate702. +The IRC example bundle in `samples/irc` demonstrates the ability to get access +to an IRC chat. This sample is designed to log the twitch IRC chat of skate702. ### Prerequisites -- Working NodeCG & nodecg-io installation +You will need a working `nodecg-io` installation. If you have non yet take a +look at [installation guide](../getting_started/install.md). You may need to +install this bundle, so take a look at the +[“Try an included sample”](../getting_started/try_example_bundle.md)-Guide. It +will also tell you how to log in and how to use the GUI. ### Configure the IRC sample bundle -1. Start nodecg with nodecg-io installed. The IRC sample bundle is currently part of it, so it should also be loaded. +1. In NodeCG, create a new IRC service instance using the left upper menu. -2. Go to the `nodecg-io` tab in the nodecg dashboard. +2. Enter credentials for IRC. -3. Login using your password. If this is your first run, then enter the password with which you want to encrypt your configurations and credentials. - -4. Create a new IRC service instance using the left upper menu. - -5. Enter credentials for IRC. - - The created instance should be automatically selected, if not select it in the upper left menu. In this example we will anonymously connect to the twitch IRC chat. Enter the config in this format: + The created instance should be automatically selected, if not select it in + the upper left menu. In this example we will "anonymously" connect to the + twitch IRC chat. Enter the config in this format: ```json { @@ -32,12 +33,15 @@ The IRC example bundle in `samples/irc` demonstrates the ability to get access t After entering it, click save. - _Note:_ If you don't see monaco on the right, try reloading the page. - -6. Set the created IRC service instance to the service dependency of the IRC sample bundle. +3. Set the created IRC service instance to the service dependency of the IRC + sample bundle. - Select the IRC sample bundle and the IRC service in the left bottom menu and then select the service instance that should be used by the IRC sample bundle (in this case the name of the previously created IRC instance). + Select the IRC sample bundle and the IRC service in the left bottom menu. + Then select the service instance that should be used by the IRC sample + bundle (in this case the name of the previously created IRC instance). -7. Check the nodecg logs +4. Check the NodeCG logs - You should see an error or a success message and all twitch messages that are written in the twitch channel that is hardcoded in `samples/irc/extension/index.ts`. + You should see an error or a success message and all twitch messages that + are written in the twitch channel that is hardcoded in + `samples/irc/extension/index.ts`. diff --git a/docs/samples/midi-input.md b/docs/samples/midi-input.md index d7dbe306..7f8cddec 100644 --- a/docs/samples/midi-input.md +++ b/docs/samples/midi-input.md @@ -1,25 +1,30 @@ ## Using the midi-input sample bundle -The midi-input example bundle in `samples/midi-input` demonstrates the ability to read data from a midi device. +The midi-input example bundle in `samples/midi-input` demonstrates the ability +to read data from a midi device. ### Prerequisites -- Working NodeCG & nodecg-io installation -- A midi device that can be connected to your computer - -### Configure the midi-input sample bundle +You will need a working `nodecg-io` installation. If you have non yet take a +look at [installation guide](../getting_started/install.md). You may need to +install this bundle, so take a look at the +[“Try an included sample”](../getting_started/try_example_bundle.md)-Guide. It +will also tell you how to log in and how to use the GUI. -1. Start nodecg with nodecg-io installed. The Twitch-chat bundle is currently part of it, so it should also be loaded. +**You also need:** -2. Go to the `nodecg-io` tab in the nodecg dashboard. +- A midi device that can be connected to your computer -3. Login using your password. If this is your first run, then enter the password with which you want to encrypt your configurations and credentials. +### Configure the midi-input sample bundle -4. Create a new midi-input service instance using the left upper menu. +1. In NodeCG, create a new midi-input service instance using the left upper + menu. -5. Enter your device information +2. Enter your device information - The created instance should be automatically selected, if not select it in the upper left menu. Enter the name of your device in monaco (the text-editor on the right) in this format: + The created instance should be automatically selected, if not select it in + the upper left menu. Enter the name of your device in monaco (the + text-editor on the right) in this format: ```json { @@ -27,20 +32,25 @@ The midi-input example bundle in `samples/midi-input` demonstrates the ability t } ``` - After entering it, click save. - **Note:** A script is provided to list all inputs and outputs. It can be run from the sample directory `samples/midi-input` using the command `npm run list`. The devices should be listed with their device names and some other stuff. - Under Linux this looks for example like this: + After entering it, click save. **Note:** A script is provided to list all + inputs and outputs. It can be run from the sample directory + `samples/midi-input` using the command `npm run list`. The devices should be + listed with their device names and some other stuff. Under Linux this looks + for example like this: ``` nanoKONTROL2:nanoKONTROL2 MIDI 1 28:0 ``` - _Note:_ If you don't see monaco on the right, try reloading the page. - -6. Set the created midi-input service instance to the service dependency of the midi-input sample bundle. +3. Set the created midi-input service instance to the service dependency of the + midi-input sample bundle. - Select the midi-input bundle and the midi-input service in the left bottom menu and then select the service instance that should be used by the midi-input bundle (in this case the name of the previously created midi-input instance). + Select the midi-input bundle and the midi-input service in the left bottom + menu. Then select the service instance that should be used by the midi-input + bundle (in this case the name of the previously created midi-input + instance). -7. Check the nodecg logs +4. Check the NodeCG logs - You should see an error or a success message and all midi messages that are sent by the device that is configured. + You should see an error or a success message and all midi messages that are + sent by the device that is configured. diff --git a/docs/samples/midi-io.md b/docs/samples/midi-io.md index e2cde5b9..925d84b1 100644 --- a/docs/samples/midi-io.md +++ b/docs/samples/midi-io.md @@ -1,25 +1,30 @@ ## Using the midi-io sample bundle -The midi-io example bundle in `samples/midi-io` demonstrates the ability to send/receive data to/from a midi device. +The midi-io example bundle in `samples/midi-io` demonstrates the ability to +send/receive data to/from a midi device. ### Prerequisites -- Working NodeCG & nodecg-io installation -- A midi device that can be connected to your computer - -### Configure the midi-io sample bundle +You will need a working `nodecg-io` installation. If you have non yet take a +look at [installation guide](../getting_started/install.md). You may need to +install this bundle, so take a look at the +[“Try an included sample”](../getting_started/try_example_bundle.md)-Guide. It +will also tell you how to log in and how to use the GUI. -1. Start nodecg with nodecg-io installed. The midi-io bundle is currently part of it, so it should also be loaded. +**You also need:** -2. Go to the `nodecg-io` tab in the nodecg dashboard. +- A midi device that can be connected to your computer -3. Login using your password. If this is your first run, then enter the password with which you want to encrypt your configurations and credentials. +### Configure the midi-io sample bundle -4. Create a new midi-input service instance using the left upper menu. +1. In NodeCG, create a new midi-input service instance using the left upper + menu. -5. Enter your device information +2. Enter your device information - The created instance should be automatically selected, if not select it in the upper left menu. Enter the name of your device in monaco (the text-editor on the right) in this format: + The created instance should be automatically selected, if not select it in + the upper left menu. Enter the name of your device in monaco (the + text-editor on the right) in this format: ```json { @@ -27,33 +32,51 @@ The midi-io example bundle in `samples/midi-io` demonstrates the ability to send } ``` - After entering it, click save. - **Note:** A script is provided to list all inputs and outputs. It can be run from the sample directory `samples/midi-io` using the command `npm run list`. The devices should be listed with their device names and some other stuff. - Under Linux this looks for example like this: + After entering it, click save. **Note:** A script is provided to list all + inputs and outputs. It can be run from the sample directory + `samples/midi-io` using the command `npm run list`. The devices should be + listed with their device names and some other stuff. Under Linux this looks + for example like this: ``` nanoKONTROL2:nanoKONTROL2 MIDI 1 28:0 ``` - _Note:_ If you don't see monaco on the right, try reloading the page. - -6. Create a new midi-output service instance using the left upper menu. +3. Create a new midi-output service instance using the left upper menu. -7. Repeat step 5 for your midi-output service. In most cases you want to use the same device for input and output. +4. Repeat step 5 for your midi-output service. In most cases you want to use the + same device for input and output. -8. Set the created midi-output service instance to the service dependency of the midi-io sample bundle. +5. Set the created midi-output service instance to the service dependency of the + midi-io sample bundle. - Select the midi-io bundle and the midi-output service in the left bottom menu and then select the service instance that should be used by the midi-io bundle (in this case the name of the previously created midi-output instance). + Select the midi-io bundle and the midi-output service in the left bottom + menu. Then select the service instance that should be used by the midi-io + bundle (in this case the name of the previously created midi-output + instance). -9. Set the created midi-input service instance to the service dependency of the midi-io sample bundle. +6. Set the created midi-input service instance to the service dependency of the + midi-io sample bundle. - Select the midi-io bundle and the midi-input service in the left bottom menu and then select the service instance that should be used by the midi-io bundle (in this case the name of the previously created midi-input instance). + Select the midi-io bundle and the midi-input service in the left bottom + menu. Then select the service instance that should be used by the midi-io + bundle (in this case the name of the previously created midi-input + instance). -10. Check the nodecg logs +7. Check the NodeCG logs - You should see an error or a success message and midi messages that are received and echoed back to the device that is configured. The messages are only modified, if the received Message is a `Noteon` with a velocity of greater than zero or a control change message with a value of at least 64. `Noteoff` messages are always echoed unmodified. + You should see an error or a success message and midi messages that are + received and echoed back to the device that is configured. The messages are + only modified, if the received Message is a `Noteon` with a velocity of + greater than zero or a control change message with a value of at least 64. + `Noteoff` messages are always echoed unmodified. ### Note -A `Noteon` message with a velocity of 0 should be handled like a `Noteoff` message, so they are echoed unmodified. Otherwise, this would get annoying very fast. -If a control change is assigned to the push-button values of 64 and up are interpreted as on and values lower than that are interpreted as off. Most somewhat modern Midi devices send 127 as on and 0 as off, but 63 and 64 should also be sufficient. +A `Noteon` message with a velocity of 0 should be handled like a `Noteoff` +message, so they are echoed unmodified. Otherwise, this would get annoying very +fast. +If a control change is assigned to the push-button values of 64 and up are +interpreted as on and values lower than that are interpreted as off. Most +somewhat modern Midi devices send 127 as on and 0 as off, but 63 and 64 should +also be sufficient. diff --git a/docs/samples/midi-output.md b/docs/samples/midi-output.md index b7fb2490..8ea861b9 100644 --- a/docs/samples/midi-output.md +++ b/docs/samples/midi-output.md @@ -1,25 +1,30 @@ ## Using the midi-output sample bundle -The midi-output example bundle in `samples/midi-output` demonstrates the ability to send data to a midi device. +The midi-output example bundle in `samples/midi-output` demonstrates the ability +to send data to a midi device. ### Prerequisites -- Working NodeCG & nodecg-io installation -- A midi device that can be connected to your computer - -### Configure the midi-output sample bundle +You will need a working `nodecg-io` installation. If you have non yet take a +look at [installation guide](../getting_started/install.md). You may need to +install this bundle, so take a look at the +[“Try an included sample”](../getting_started/try_example_bundle.md)-Guide. It +will also tell you how to log in and how to use the GUI. -1. Start nodecg with nodecg-io installed. The midi-output bundle is currently part of it, so it should also be loaded. +**You also need:** -2. Go to the `nodecg-io` tab in the nodecg dashboard. +- A midi device that can be connected to your computer -3. Login using your password. If this is your first run, then enter the password with which you want to encrypt your configurations and credentials. +### Configure the midi-output sample bundle -4. Create a new midi-output service instance using the left upper menu. +1. In NodeCG, create a new midi-output service instance using the left upper + menu. -5. Enter your device information +2. Enter your device information - The created instance should be automatically selected, if not select it in the upper left menu. Enter the name of your device in monaco (the text-editor on the right) in this format: + The created instance should be automatically selected, if not select it in + the upper left menu. Enter the name of your device in monaco (the + text-editor on the right) in this format: ```json { @@ -27,24 +32,36 @@ The midi-output example bundle in `samples/midi-output` demonstrates the ability } ``` - After entering it, click save. - **Note:** A script is provided to list all inputs and outputs. It can be run from the sample directory `samples/midi-output` using the command `npm run list`. The devices should be listed with their device names and some other stuff. - Under Linux this looks for example like this: + After entering it, click save. **Note:** A script is provided to list all + inputs and outputs. It can be run from the sample directory + `samples/midi-output` using the command `npm run list`. The devices should + be listed with their device names and some other stuff. Under Linux this + looks for example like this: ``` nanoKONTROL2:nanoKONTROL2 MIDI 1 28:0 ``` - _Note:_ If you don't see monaco on the right, try reloading the page. - -6. Set the created midi-output service instance to the service dependency of the midi-output sample bundle. +3. Set the created midi-output service instance to the service dependency of the + midi-output sample bundle. - Select the midi-output bundle and the midi-output service in the left bottom menu and then select the service instance that should be used by the midi-output bundle (in this case the name of the previously created midi-output instance). + Select the midi-output bundle and the midi-output service in the left bottom + menu. Then select the service instance that should be used by the + midi-output bundle (in this case the name of the previously created + midi-output instance). -7. Check the nodecg logs +4. Check the NodeCG logs - You should see an error or a success message and random midi messages should be sent to the device that is configured. The messages are only `Noteon` messages and have a random note and velocity value ranging 0-127. The channels they are sent from are either channel 0 or 1, but the midi protocol supports up to 16 channels, so it could technically range from 0-15. + You should see an error or a success message and random midi messages should + be sent to the device that is configured. The messages are only `Noteon` + messages and have a random note and velocity value ranging 0-127. The + channels they are sent from are either channel 0 or 1, but the midi protocol + supports up to 16 channels, so it could technically range from 0-15. ### Note -Only sending `Noteon` messages is sufficient for most midi, because most of them don't really care if you use proper `Noteoff` messages or simply send a `Noteon` with a velocity of 0. This is due to the early days of midi, when integrated circuits were expensive. Allowing a velocity of 0 as replacement for `Noteoff` made instruments featuring midi more affordable. +Only sending `Noteon` messages is sufficient for most midi, because most of them +don't really care if you use proper `Noteoff` messages or simply send a `Noteon` +with a velocity of 0. This is due to the early days of midi, when integrated +circuits were expensive. Allowing a velocity of 0 as replacement for `Noteoff` +made instruments featuring midi more affordable. diff --git a/docs/samples/mqtt-client.md b/docs/samples/mqtt-client.md index b152db66..b6560edc 100644 --- a/docs/samples/mqtt-client.md +++ b/docs/samples/mqtt-client.md @@ -1,23 +1,35 @@ ## Using the MQTT-client sample bundle -The MQTT-client sample bundle in `samples/mqtt-client` shows how to connect to an MQTT server. This client is based on the [MQTT.js](https://github.com/mqttjs/MQTT.js) package. +The MQTT-client sample bundle in `samples/mqtt-client` shows how to connect to +an MQTT server. This client is based on the +[MQTT.js](https://github.com/mqttjs/MQTT.js) package. ### Prerequisites -- Working NodeCG & nodecg-io installation +You will need a working `nodecg-io` installation. If you have non yet take a +look at [installation guide](../getting_started/install.md). You may need to +install this bundle, so take a look at the +[“Try an included sample”](../getting_started/try_example_bundle.md)-Guide. It +will also tell you how to log in and how to use the GUI. + +**You also need:** + - MQTT-server ### Configure the MQTT-client sample bundle -1. Start NodeCG with nodecg-io installed. The mqtt-client bundle is currently part of it, so it should also be loaded. -2. Go to the `nodecg-io` tab in the NodeCG dashboard. -3. Login using your password. If this is your first run, then enter the password with which you want to encrypt your configurations and credentials. -4. Create a new mqtt-client service instance using the left upper menu. +1. In NodeCG, create a new mqtt-client service instance using the left upper + menu. -5. Enter the connection parameters of the mqtt server. The URL should be in following the pattern `://
    :`. Allowed protocols are: `mqtt`, `mqtts`, `tcp`, `tls`, `ws`, `wss`. +2. Enter the connection parameters of the mqtt server. The URL should be in + following the pattern `://
    :`. Allowed protocols are: + `mqtt`, `mqtts`, `tcp`, `tls`, `ws`, `wss`. - In case your server needs authentication, set the `username` and `password` fields otherwise remove them from the configuration. - The created instance should be automatically selected, if not select it in the upper left menu. Enter your configuration in monaco (the text-editor on the right) in this format: + In case your server needs authentication, set the `username` and `password` + fields otherwise remove them from the configuration. The created instance + should be automatically selected, if not select it in the upper left menu. + Enter your configuration in monaco (the text-editor on the right) in this + format: ```json { @@ -30,5 +42,7 @@ The MQTT-client sample bundle in `samples/mqtt-client` shows how to connect to a After entering it, click save. -6. Set the created mqtt-client service instance to the service dependency of the mqtt-client bundle. -7. The console should display if the connection was successfully established and should show inbound messages on the subscribed topic. +3. Set the created mqtt-client service instance to the service dependency of the + mqtt-client bundle. +4. The console should display if the connection was successfully established and + should show inbound messages on the subscribed topic. diff --git a/docs/samples/nanoleaf.md b/docs/samples/nanoleaf.md index 0d5d1289..15952187 100644 --- a/docs/samples/nanoleaf.md +++ b/docs/samples/nanoleaf.md @@ -1,25 +1,30 @@ ## Using the Nanoleaf sample bundle -The Nanoleaf example bundle in `samples/nanoleaf` demonstrates the ability to control your nanoleaf lights. This example code sets all panels to an orange colour. Here is a guide to how to get it working. +The Nanoleaf example bundle in `samples/nanoleaf` demonstrates the ability to +control your nanoleaf lights. This example code sets all panels to an orange +colour. Here is a guide to how to get it working. ### Prerequisites -- Working NodeCG and a nodecg-io installation -- IP address of your nanoleaf controller - -### Configure the nanoleaf sample bundle +You will need a working `nodecg-io` installation. If you have non yet take a +look at [installation guide](../getting_started/install.md). You may need to +install this bundle, so take a look at the +[“Try an included sample”](../getting_started/try_example_bundle.md)-Guide. It +will also tell you how to log in and how to use the GUI. -1. Start nodecg with nodecg-io installed. The nanoleaf sample bundle is currently part of it, so it should also be loaded. +**You also need:** -2. Go to the `nodecg-io` tab in the nodecg dashboard. +- IP address of your nanoleaf controller -3. Login using your password. If this is your first run, then enter the password with which you want to encrypt your configurations and credentials. +### Configure the nanoleaf sample bundle -4. Create a new nanoleaf service instance using the left upper menu. +1. In NodeCG, create a new nanoleaf service instance using the left upper menu. -5. Enter configuration. +2. Enter configuration. - The created instance should be automatically selected, if not select it in the upper left menu. Enter your nanoleaf controller IP address in this format (change the IP accordingly): + The created instance should be automatically selected, if not select it in + the upper left menu. Enter your nanoleaf controller IP address in this + format (change the IP accordingly): ```json { @@ -27,16 +32,19 @@ The Nanoleaf example bundle in `samples/nanoleaf` demonstrates the ability to co } ``` - Before clicking save put your nanoleaf controller into pairing mode by holding the on-off button for 5-7 seconds till the LED starts flashing. + Before clicking save put your nanoleaf controller into pairing mode by + holding the on-off button for 5-7 seconds till the LED starts flashing. After entering your config and entering pairing mode, click save. - _Note:_ If you don't see monaco on the right, try reloading the page. - -6. Set the created nanoleaf service instance to the service dependency of the nanoleaf sample bundle. +3. Set the created nanoleaf service instance to the service dependency of the + nanoleaf sample bundle. - Select the nanoleaf sample bundle and the nanoleaf service in the left bottom menu and then select the service instance that should be used by the nanoleaf sample bundle (in this case the name of the previously created nanoleaf instance). + Select the nanoleaf sample bundle and the nanoleaf service in the left + bottom menu. Then select the service instance that should be used by the + nanoleaf sample bundle (in this case the name of the previously created + nanoleaf instance). -7. If everything worked, your nanoleafs should now shine orange. +4. If everything worked, your nanoleafs should now shine orange. - If not you should check the nodecg logs for any errors. + If not you should check the NodeCG logs for any errors. diff --git a/docs/samples/obs.md b/docs/samples/obs.md index de3965b7..75d2af41 100644 --- a/docs/samples/obs.md +++ b/docs/samples/obs.md @@ -1,27 +1,34 @@ ## Using the OBS sample bundle -The OBS example bundle in `samples/obs-scenelist` demonstrates the ability to control an OBS instance by listing all available scenes. Here is a guide to how to get it working. +The OBS example bundle in `samples/obs-scenelist` demonstrates the ability to +control an OBS instance by listing all available scenes. Here is a guide to how +to get it working. ### Prerequisites -- Working NodeCG & nodecg-io installation -- OBS with obs-websocket installed - -_Note:_ OBS is available [here](https://obsproject.com/de/download) and obs-websocket with install instructions is available [here](https://github.com/Palakis/obs-websocket/releases). +You will need a working `nodecg-io` installation. If you have non yet take a +look at [installation guide](../getting_started/install.md). You may need to +install this bundle, so take a look at the +[“Try an included sample”](../getting_started/try_example_bundle.md)-Guide. It +will also tell you how to log in and how to use the GUI. -### Configure the OBS sample bundle +**You also need:** -1. Start nodecg with nodecg-io installed. The obs-scenelist bundle is currently part of it, so it should also be loaded. +- OBS with obs-websocket installed -2. Go to the `nodecg-io` tab in the nodecg dashboard. +_Note:_ OBS is available [here](https://obsproject.com/de/download) and +obs-websocket with install instructions is available +[here](https://github.com/Palakis/obs-websocket/releases). -3. Login using your password. If this is your first run, then enter the password with which you want to encrypt your configurations and credentials. +### Configure the OBS sample bundle -4. Create a new obs service instance using the left upper menu. +1. In NodeCG, create a new obs service instance using the left upper menu. -5. Enter configuration for obs. +2. Enter configuration for obs. - The created instance should be automatically selected, if not select it in the upper left menu. Enter your obs-websocket connection information in monaco (the text-editor on the right) in this format: + The created instance should be automatically selected, if not select it in + the upper left menu. Enter your obs-websocket connection information in + monaco (the text-editor on the right) in this format: ```json { @@ -31,16 +38,19 @@ _Note:_ OBS is available [here](https://obsproject.com/de/download) and obs-webs } ``` - If you don't want to use a password, you can just remove the password property from the config. + If you don't want to use a password, you can just remove the password + property from the config. After entering it, click save. - _Note:_ If you don't see monaco on the right, try reloading the page. - -6. Set the created obs service instance to the service dependency of the obs-scenelist bundle. +3. Set the created obs service instance to the service dependency of the + obs-scenelist bundle. - Select the obs-scenelist bundle and the OBS service in the left bottom menu and then select the service instance that should be used by the obs-scenelist bundle (in this case the name of the previously created OBS instance). + Select the obs-scenelist bundle and the OBS service in the left bottom menu. + Then select the service instance that should be used by the obs-scenelist + bundle (in this case the name of the previously created OBS instance). -7. Check the nodecg logs +4. Check the NodeCG logs - You should see an error or a success message and the names of all you scenes that you have set in OBS. + You should see an error or a success message and the names of all you scenes + that you have set in OBS. diff --git a/docs/samples/philipshue.md b/docs/samples/philipshue.md index b1d20c15..b0d2276c 100644 --- a/docs/samples/philipshue.md +++ b/docs/samples/philipshue.md @@ -1,25 +1,31 @@ ## Using the Philips Hue sample bundle -The philipshue-lights example bundle in `samples/philipshue-lights` demonstrates the ability to connect to the Philips Hue bridge and control Philips Hue accessories. +The philipshue-lights example bundle in `samples/philipshue-lights` demonstrates +the ability to connect to the Philips Hue bridge and control Philips Hue +accessories. ### Prerequisites -- Working NodeCG & nodecg-io installation -- A Philips Hue bridge with some connected accessories - -### Configure the Philips Hue sample bundle +You will need a working `nodecg-io` installation. If you have non yet take a +look at [installation guide](../getting_started/install.md). You may need to +install this bundle, so take a look at the +[“Try an included sample”](../getting_started/try_example_bundle.md)-Guide. It +will also tell you how to log in and how to use the GUI. -1. Start nodecg with nodecg-io installed. The philipshue-lights sample bundle is currently part of it, so it should also be loaded. +**You also need:** -2. Go to the `nodecg-io` tab in the nodecg dashboard. +- A Philips Hue bridge with some connected accessories -3. Login using your password. If this is your first run, then enter the password with which you want to encrypt your configurations and credentials. +### Configure the Philips Hue sample bundle -4. Create a new Philips Hue service instance using the left upper menu. +1. In NodeCG, create a new Philips Hue service instance using the left upper + menu. -5. Enter configuration for hue. +2. Enter configuration for hue. - The created instance should be automatically selected, if not select it in the upper left menu. If you want the bridge to be automatically discovered just set `discover` to true like this: + The created instance should be automatically selected, if not select it in + the upper left menu. If you want the bridge to be automatically discovered + just set `discover` to true like this: ```json { @@ -27,7 +33,8 @@ The philipshue-lights example bundle in `samples/philipshue-lights` demonstrates } ``` - If you want to provide the IP address manually you can provide them like this: + If you want to provide the IP address manually you can provide them like + this: ```json { @@ -36,16 +43,22 @@ The philipshue-lights example bundle in `samples/philipshue-lights` demonstrates } ``` - After entering it, press the big link button on your bridge and then click save. - - After the first time you connect to your bridge it will create a user and an API key which will be saved so that you only need to press the link button when you connect it for the first time. + After entering it, press the big link button on your bridge and then click + save. - _Note:_ If you don't see monaco on the right, try reloading the page. + After the first time you connect to your bridge it will create a user and an + API key which will be saved so that you only need to press the link button + when you connect it for the first time. -6. Set the created Philips Hue service instance to the service dependency of the philipshue-lights sample bundle. +3. Set the created Philips Hue service instance to the service dependency of the + philipshue-lights sample bundle. - Select the philipshue-lights sample bundle and the Philips Hue service in the left bottom menu and then select the service instance that should be used by the philipshue-lights sample bundle (in this case the name of the previously created Philips Hue instance). + Select the philipshue-lights sample bundle and the Philips Hue service in + the left bottom menu. Then select the service instance that should be used + by the philipshue-lights sample bundle (in this case the name of the + previously created Philips Hue instance). -7. Check the nodecg logs +4. Check the NodeCG logs - You should see an error or a success message and the number of lights that the bridge knows of. + You should see an error or a success message and the number of lights that + the bridge knows of. diff --git a/docs/samples/rcon.md b/docs/samples/rcon.md index 3f31fbfc..0b8097c8 100644 --- a/docs/samples/rcon.md +++ b/docs/samples/rcon.md @@ -1,25 +1,30 @@ ## Using the RCON sample bundle -The rcon sample bundle in `samples/rcon-minecraft` shows how to send a command to a Minecraft server. +The rcon sample bundle in `samples/rcon-minecraft` shows how to send a command +to a Minecraft server. ### Prerequisites -- Working NodeCG & nodecg-io installation -- A working [Minecraft](https://minecraft.net) server. - -### Configure the rcon sample bundle +You will need a working `nodecg-io` installation. If you have non yet take a +look at [installation guide](../getting_started/install.md). You may need to +install this bundle, so take a look at the +[“Try an included sample”](../getting_started/try_example_bundle.md)-Guide. It +will also tell you how to log in and how to use the GUI. -1. Start nodecg with nodecg-io installed. The rcon bundle is currently part of it, so it should also be loaded. +**You also need:** -2. Go to the `nodecg-io` tab in the nodecg dashboard. +- A working [Minecraft](https://minecraft.net) server. -3. Login using your password. If this is your first run, then enter the password with which you want to encrypt your configurations and credentials. +### Configure the rcon sample bundle -4. Create a new rcon service instance using the left upper menu. +1. In NodeCG, create a new rcon service instance using the left upper menu. -5. Enter the host, port, and password of the rcon connection. This can be found in the `server.properties` file (`rcon.port`, `rcon.password`) +2. Enter the host, port, and password of the rcon connection. This can be found + in the `server.properties` file (`rcon.port`, `rcon.password`) - The created instance should be automatically selected, if not select it in the upper left menu. Enter your host and port in monaco (the text-editor on the right) in this format: + The created instance should be automatically selected, if not select it in + the upper left menu. Enter your host and port in monaco (the text-editor on + the right) in this format: ```json { @@ -31,6 +36,8 @@ The rcon sample bundle in `samples/rcon-minecraft` shows how to send a command t After entering it, click save. -6. Set the created rcon service instance to the service dependency of the rcon-minecraft bundle. +3. Set the created rcon service instance to the service dependency of the + rcon-minecraft bundle. -7. In the nodecg console you will see a list with all online players. It will also send a /say command to the Minecraft server. +4. In the NodeCG console you will see a list with all online players. It will + also send a /say command to the Minecraft server. diff --git a/docs/samples/reddit.md b/docs/samples/reddit.md index 844a108d..47a24bbd 100644 --- a/docs/samples/reddit.md +++ b/docs/samples/reddit.md @@ -1,27 +1,34 @@ ## Using the Reddit sample bundle -The reddit-message-read example bundle in `samples/reddit-msg-read` demonstrates the ability to read recent posts from a subreddit (in this case `r/skate702`) +The reddit-message-read example bundle in `samples/reddit-msg-read` demonstrates +the ability to read recent posts from a subreddit (in this case `r/skate702`) ### Prerequisites -- Working NodeCG & nodecg-io installation -- a Reddit Application (Should be of type script for own purpose) +You will need a working `nodecg-io` installation. If you have non yet take a +look at [installation guide](../getting_started/install.md). You may need to +install this bundle, so take a look at the +[“Try an included sample”](../getting_started/try_example_bundle.md)-Guide. It +will also tell you how to log in and how to use the GUI. -_Note:_ If you don't have such an application yet, you can get one [here](https://www.reddit.com/prefs/apps). +**You also need:** -### Configure the Reddit sample bundle - -1. Start nodecg with nodecg-io installed. The reddit-message-read bundle is currently part of it, so it should also be loaded. +- A Reddit Application (Should be of type script for own purpose) -2. Go to the `nodecg-io` tab in the nodecg dashboard. +_Note:_ If you don't have such an application yet, you can get one +[here](https://www.reddit.com/prefs/apps). -3. Login using your password. If this is your first run, then enter the password with which you want to encrypt your configurations and credentials. +### Configure the Reddit sample bundle -4. Create a new Reddit service instance using the left upper menu. +1. In NodeCG, create a new Reddit service instance using the left upper menu. -5. Enter your applications ID and secret and your own username and password. The entered username and password must be for the user who registered the application. +2. Enter your applications ID and secret and your own username and password. The + entered username and password must be for the user who registered the + application. - The created instance should be automatically selected, if not select it in the upper left menu. Enter your data in monaco (the text-editor on the right) in this format: + The created instance should be automatically selected, if not select it in + the upper left menu. Enter your data in monaco (the text-editor on the + right) in this format: ```json { @@ -34,12 +41,14 @@ _Note:_ If you don't have such an application yet, you can get one [here](https: After entering it, click save. - _Note:_ If you don't see monaco on the right, try reloading the page. - -6. Set the created Reddit service instance to the service dependency of the reddit-message-read bundle. +3. Set the created Reddit service instance to the service dependency of the + reddit-message-read bundle. - Select the reddit-message-read bundle and the Reddit service in the left bottom menu and then select the service instance that should be used by the reddit-message-read bundle (in this case the name of the previously created Reddit instance). + Select the reddit-message-read bundle and the Reddit service in the left + bottom menu. Then select the service instance that should be used by the + reddit-message-read bundle (in this case the name of the previously created + Reddit instance). -7. Check the nodecg logs +4. Check the NodeCG logs You should see the recent posts in `r/skate702` diff --git a/docs/samples/sacn-receiver.md b/docs/samples/sacn-receiver.md index 6b183912..2cf2ba08 100644 --- a/docs/samples/sacn-receiver.md +++ b/docs/samples/sacn-receiver.md @@ -1,25 +1,30 @@ ## Using the sACN receiver sample bundle -The sacn-receiver-sample example bundle in `samples/sacn-receiver-sample` demonstrates the ability receive data send via sACN from e.g., professional lighting consoles. Here is a guide to how to get it working. +The sacn-receiver-sample example bundle in `samples/sacn-receiver-sample` +demonstrates the ability receive data send via sACN from e.g., professional +lighting consoles. Here is a guide to how to get it working. ### Prerequisites -- Working NodeCG & nodecg-io installation -- A working sACN sender in the current network - -### Configure the sACN sample bundle - -1. Start nodecg with nodecg-io installed. The sacn-receiver-sample bundle is currently part of it, so it should also be loaded. +You will need a working `nodecg-io` installation. If you have non yet take a +look at [installation guide](../getting_started/install.md). You may need to +install this bundle, so take a look at the +[“Try an included sample”](../getting_started/try_example_bundle.md)-Guide. It +will also tell you how to log in and how to use the GUI. -2. Go to the `nodecg-io` tab in the nodecg dashboard. +**You also need:** -3. Login using your password. If this is your first run, then enter the password with which you want to encrypt your configurations and credentials. +- A working sACN sender in the current network -4. Create a new sacn-receiver service instance using the left upper menu. +### Configure the sACN sample bundle -5. Enter the needed options. +1. In NodeCG, create a new sacn-receiver service instance using the left upper + menu. +2. Enter the needed options. - The created instance should be automatically selected, if not select it in the upper left menu. Enter your Bot token in monaco (the text-editor on the right) in this format: + The created instance should be automatically selected, if not select it in + the upper left menu. Enter your Bot token in monaco (the text-editor on the + right) in this format: **Universes** @@ -33,7 +38,8 @@ The sacn-receiver-sample example bundle in `samples/sacn-receiver-sample` demons **Port** - Optional. The multicast port to use. All professional consoles broadcast to the default port 5568. + Optional. The multicast port to use. All professional consoles broadcast to + the default port 5568. ```json { @@ -42,8 +48,9 @@ The sacn-receiver-sample example bundle in `samples/sacn-receiver-sample` demons } ``` - **Iface** - Optional. If the computer is connected to multiple networks, specify which network adaptor to use by using this computer's local IP address. + **Iface** Optional. If the computer is connected to multiple networks, + specify which network adaptor to use by using this computer's local IP + address. ```json { @@ -52,8 +59,8 @@ The sacn-receiver-sample example bundle in `samples/sacn-receiver-sample` demons } ``` - **ReuseAddr** - Optional. Allow multiple programs on your computer to listen to the same sACN universe. + **ReuseAddr** Optional. Allow multiple programs on your computer to listen + to the same sACN universe. ```json { @@ -64,12 +71,14 @@ The sacn-receiver-sample example bundle in `samples/sacn-receiver-sample` demons After entering them, click save. - _Note:_ If you don't see monaco on the right, try reloading the page. - -6. Set the created sacn-receiver service instance to the service dependency of the sacn-receiver-sample bundle. +3. Set the created sacn-receiver service instance to the service dependency of + the sacn-receiver-sample bundle. - Select the sacn-receiver-sample bundle and the sacn-receiver service in the left bottom menu and then select the service instance that should be used by the sacn-receiver-sample bundle (in this case the name of the previously created sACN instance). + Select the sacn-receiver-sample bundle and the sacn-receiver service in the + left bottom menu. Then select the service instance that should be used by + the sacn-receiver-sample bundle (in this case the name of the previously + created sACN instance). -7. Check the nodecg logs +4. Check the NodeCG logs You should see data logged. diff --git a/docs/samples/sacn-sender.md b/docs/samples/sacn-sender.md index 3f985b4a..abf9932f 100644 --- a/docs/samples/sacn-sender.md +++ b/docs/samples/sacn-sender.md @@ -1,25 +1,30 @@ ## Using the sACN sender sample bundle -The sacn-sender example bundle in `samples/sacn-sender` demonstrates the ability send data via sACN to e.g., open lighting architecture or professional lighting equipment. Here is a guide to how to get it working. +The sacn-sender example bundle in `samples/sacn-sender` demonstrates the ability +send data via sACN to e.g., open lighting architecture or professional lighting +equipment. Here is a guide to how to get it working. ### Prerequisites -- Working NodeCG & nodecg-io installation -- A working sACN receiver in the current network - -### Configure the sACN sample bundle - -1. Start nodecg with nodecg-io installed. The sacn-receiver-sample bundle is currently part of it, so it should also be loaded. +You will need a working `nodecg-io` installation. If you have non yet take a +look at [installation guide](../getting_started/install.md). You may need to +install this bundle, so take a look at the +[“Try an included sample”](../getting_started/try_example_bundle.md)-Guide. It +will also tell you how to log in and how to use the GUI. -2. Go to the `nodecg-io` tab in the nodecg dashboard. +**You also need:** -3. Login using your password. If this is your first run, then enter the password with which you want to encrypt your configurations and credentials. +- A working sACN receiver in the current network -4. Create a new sacn-sender service instance using the left upper menu. +### Configure the sACN sample bundle -5. Enter the needed options. +1. In NodeCG, create a new sacn-sender service instance using the left upper + menu. +2. Enter the needed options. - The created instance should be automatically selected, if not select it in the upper left menu. Enter your universe in monaco (the text-editor on the right) in this format: + The created instance should be automatically selected, if not select it in + the upper left menu. Enter your universe in monaco (the text-editor on the + right) in this format: **Universes** @@ -33,7 +38,8 @@ The sacn-sender example bundle in `samples/sacn-sender` demonstrates the ability **Port** - Optional. The multicast port to use. All professional consoles broadcast to the default port 5568. + Optional. The multicast port to use. All professional consoles broadcast to + the default port 5568. ```json { @@ -42,8 +48,8 @@ The sacn-sender example bundle in `samples/sacn-sender` demonstrates the ability } ``` - **ReuseAddr** - Optional. Allow multiple programs on your computer to listen to the same sACN universe. + **ReuseAddr** Optional. Allow multiple programs on your computer to listen + to the same sACN universe. ```json { @@ -54,12 +60,14 @@ The sacn-sender example bundle in `samples/sacn-sender` demonstrates the ability After entering them, click save. - _Note:_ If you don't see monaco on the right, try reloading the page. - -6. Set the created sacn-sender service instance to the service dependency of the sacn-sender bundle. +3. Set the created sacn-sender service instance to the service dependency of the + sacn-sender bundle. - Select the sacn-sender bundle and the sacn-sender service in the left bottom menu and then select the service instance that should be used by the sacn-sender bundle (in this case the name of the previously created sACN instance). + Select the sacn-sender bundle and the sacn-sender service in the left bottom + menu. Then select the service instance that should be used by the + sacn-sender bundle (in this case the name of the previously created sACN + instance). -7. Check the nodecg logs +4. Check the NodeCG logs You should see data logged. diff --git a/docs/samples/serial.md b/docs/samples/serial.md index 2f25d6db..91dfc2fe 100644 --- a/docs/samples/serial.md +++ b/docs/samples/serial.md @@ -1,27 +1,31 @@ ## Using the serial sample bundle -The serial example bundle in `samples/serial` demonstrates the ability to exchange data with a device that is connected via serial. Here is a guide to how to get it working. +The serial example bundle in `samples/serial` demonstrates the ability to +exchange data with a device that is connected via serial. Here is a guide to how +to get it working. ### Prerequisites -- Working NodeCG & nodecg-io installation -- An Arduino or any other microcontroller development board that can send and receive data via serial. +You will need a working `nodecg-io` installation. If you have non yet take a +look at [installation guide](../getting_started/install.md). You may need to +install this bundle, so take a look at the +[“Try an included sample”](../getting_started/try_example_bundle.md)-Guide. It +will also tell you how to log in and how to use the GUI. -### Configure the serial sample bundle - -1. Load a simple serial echo sketch on your microcontroller. You can find a working Arduino sketch at the end of this article. +**You also need:** -2. Start nodecg with nodecg-io installed. The serial bundle is currently part of it, so it should also be loaded. Make sure the device is already connected. Otherwise, you won't be able to see the device. +- An Arduino or any other microcontroller development board that can send and + receive data via serial. -3. Go to the `nodecg-io` tab in the nodecg dashboard. - -4. Login using your password. If this is your first run, then enter the password with which you want to encrypt your configurations and credentials. +### Configure the serial sample bundle -5. Create a new serial service instance using the left upper menu. +1. In NodeCG, create a new serial service instance using the left upper menu. -6. Enter the information of your device. +2. Enter the information of your device. - The created instance should be automatically selected, if not select it in the upper left menu. Enter the `com port` or other identifying information in one of these formats: + The created instance should be automatically selected, if not select it in + the upper left menu. Enter the `com port` or other identifying information + in one of these formats: ```json { @@ -41,19 +45,27 @@ The serial example bundle in `samples/serial` demonstrates the ability to exchan After entering it, click save. - _Note:_ If you don't see monaco on the right, try reloading the page. - _Note:_ If you want to list all connected devices you can open a terminal in `nodecg-io-serial` and run `npm run list`. - _Note:_ If you are using multiple devices you might want to use the `pnpId`, since ports can change between reboots! + _Note:_ If you want to list all connected devices you can open a terminal in + `nodecg-io-serial` and run `npm run list`. _Note:_ If you are using multiple + devices you might want to use the `pnpId`, since ports can change between + reboots! -7. Set the created serial service instance to the service dependency of the serial bundle. +3. Set the created serial service instance to the service dependency of the + serial bundle. - Select the serial bundle and the serial service in the left bottom menu and then select the service instance that should be used by the serial bundle (in this case the name of the previously created serial instance). + Select the serial bundle and the serial service in the left bottom menu. + Then select the service instance that should be used by the serial bundle + (in this case the name of the previously created serial instance). -8. Check the nodecg logs +4. Check the NodeCG logs - You should see an error or a success message and nodecg-io will send ping to the microcontroller every 10 seconds. The Arduino device will respond with pong. You should see the pong message displayed in the log. + You should see an error or a success message and nodecg-io will send ping to + the microcontroller every 10 seconds. The Arduino device will respond with + pong. You should see the pong message displayed in the log. - If you see an error or nothing at all, try making sure your microcontroller is plugged in and recognized correctly. Then restart nodecg, so the service is cleanly restarted. + If you see an error or nothing at all, try making sure your microcontroller + is plugged in and recognized correctly. Then restart nodecg, so the service + is cleanly restarted. ### Sample Arduino sketch diff --git a/docs/samples/shlink.md b/docs/samples/shlink.md index 83bff69d..63e5568e 100644 --- a/docs/samples/shlink.md +++ b/docs/samples/shlink.md @@ -1,25 +1,30 @@ ## Using the Shlink sample bundle -The Shlink example bundle in `samples/shlink-list-short-urls` demonstrates the ability to control a [Shlink](https://shlink.io/) server by getting the amount of short urls configured on the server. Here is a guide on how to get it working. +The Shlink example bundle in `samples/shlink-list-short-urls` demonstrates the +ability to control a [Shlink](https://shlink.io/) server by getting the amount +of short URLs configured on the server. Here is a guide on how to get it +working. ### Prerequisites -- Working NodeCG & nodecg-io installation -- [Shlink server and valid API key / token for it](https://shlink.io/documentation/install-docker-image/) - -### Configure the Shlink sample bundle - -1. Start nodecg with nodecg-io installed. The shlink-list-short-urls bundle is currently part of it so it should also be loaded. +You will need a working `nodecg-io` installation. If you have non yet take a +look at [installation guide](../getting_started/install.md). You may need to +install this bundle, so take a look at the +[“Try an included sample”](../getting_started/try_example_bundle.md)-Guide. It +will also tell you how to log in and how to use the GUI. -2. Go to the `nodecg-io` tab in the nodecg dashboard. +**You also need:** -3. Login using your password. If this is your first run, then enter the password with which you want to encrypt your configurations and credentials. +- [Shlink server and valid API key / token for it](https://shlink.io/documentation/install-docker-image/) -4. Create a new Shlink service instance using the left upper menu. +### Configure the Shlink sample bundle -5. Enter the configuration for Shlink. +1. In NodeCG, create a new Shlink service instance using the left upper menu. +2. Enter the configuration for Shlink. - The created instance should be automatically selected, if not, select it in the upper left menu. Enter the connection information for the Shlink server in monaco (the text-editor on the right) in this format: + The created instance should be automatically selected, if not, select it in + the upper left menu. Enter the connection information for the Shlink server + in monaco (the text-editor on the right) in this format: ```json { @@ -30,14 +35,19 @@ The Shlink example bundle in `samples/shlink-list-short-urls` demonstrates the a After entering it, click save. - _Note:_ If you don't see monaco on the right, try reloading the page. - -6. Set the created Shlink service instance to the service dependency of the shlink-list-short-urls bundle. +3. Set the created Shlink service instance to the service dependency of the + `shlink-list-short-urls` bundle. - Select the shlink-list-short-urls bundle and the Shlink service in the left bottom menu and then select the service instance that should be used by the shlink-list-short-urls bundle (in this case the name of the previously created Shlink instance). + Select the `shlink-list-short-urls` bundle and the Shlink service in the + left bottom menu. Then select the service instance that should be used by + the `shlink-list-short-urls` bundle (in this case the name of the previously + created Shlink instance). -7. Check the nodecg logs +4. Check the NodeCG logs - You should see an error or a success message and the amount of configured short urls on the Shlink server. + You should see an error or a success message and the amount of configured + short URLs on the Shlink server. - _Note:_ When listing short urls - like this sample does - be aware that the amount of short urls might be limited by the [API key role](https://shlink.io/documentation/api-docs/api-key-roles/). + _Note:_ When listing short URLs — like this sample does — be aware that the + amount of short URLs might be limited by the + [API key role](https://shlink.io/documentation/api-docs/api-key-roles/). diff --git a/docs/samples/slack.md b/docs/samples/slack.md index 283f5cba..9ac138f2 100644 --- a/docs/samples/slack.md +++ b/docs/samples/slack.md @@ -1,27 +1,33 @@ ## Using the Slack sample bundle -The Slack example bundle in `samples/slack-post` demonstrates the ability to list all channels into the console and sends a message to a channel which you have to configure to your channel ID. +The Slack example bundle in `samples/slack-post` demonstrates the ability to +list all channels into the console and sends a message to a channel which you +have to configure to your channel ID. ### Prerequisites -- Working NodeCG & nodecg-io installation -- a Slack Bot token - -_Note:_ If you don't have such a token yet, you can create your own app with token on [this](https://app.slack.com/apps-manage/) page. +You will need a working `nodecg-io` installation. If you have non yet take a +look at [installation guide](../getting_started/install.md). You may need to +install this bundle, so take a look at the +[“Try an included sample”](../getting_started/try_example_bundle.md)-Guide. It +will also tell you how to log in and how to use the GUI. -### Configure the Slack sample bundle +**You also need:** -1. Start nodecg with nodecg-io installed. The slack bundle is currently part of it, so it should also be loaded. +- a Slack Bot token -2. Go to the `nodecg-io` tab in the nodecg dashboard. +_Note:_ If you don't have such a token yet, you can create your own app with +token on [this](https://app.slack.com/apps-manage/) page. -3. Login using your password. If this is your first run, then enter the password with which you want to encrypt your configurations and credentials. +### Configure the Slack sample bundle -4. Create a new slack service instance using the left upper menu. +1. In NodeCG, create a new slack service instance using the left upper menu. -5. Enter your Slack app token. +2. Enter your Slack app token. - The created instance should be automatically selected, if not select it in the upper left menu. Enter your token in monaco (the text-editor on the right) in this format: + The created instance should be automatically selected, if not select it in + the upper left menu. Enter your token in monaco (the text-editor on the + right) in this format: ```json { @@ -31,12 +37,13 @@ _Note:_ If you don't have such a token yet, you can create your own app with tok After entering it, click save. - _Note:_ If you don't see monaco on the right, try reloading the page. - -6. Set the created slack service instance to the service dependency of the slack bundle. +3. Set the created slack service instance to the service dependency of the slack + bundle. - Select the slack bundle and the slack service in the left bottom menu and then select the service instance that should be used by the slack bundle (in this case the name of the previously created slack instance). + Select the slack bundle and the slack service in the left bottom menu. Then + select the service instance that should be used by the slack bundle (in this + case the name of the previously created slack instance). -7. Check the nodecg logs +4. Check the NodeCG logs You should see an error or a login message. diff --git a/docs/samples/spotify.md b/docs/samples/spotify.md index 934eb6f8..84157a11 100644 --- a/docs/samples/spotify.md +++ b/docs/samples/spotify.md @@ -1,27 +1,35 @@ ## Using the Spotify sample bundle -The spotify-current-song example bundle in `samples/spotify-current-song` demonstrates the ability to get the current playing song of a user. Here is a guide to how to get it working. +The spotify-current-song example bundle in `samples/spotify-current-song` +demonstrates the ability to get the current playing song of a user. Here is a +guide to how to get it working. ### Prerequisites -- Working NodeCG & nodecg-io installation -- A Spotify account and a registered Spotify application and the associated client id/client secret. +You will need a working `nodecg-io` installation. If you have non yet take a +look at [installation guide](../getting_started/install.md). You may need to +install this bundle, so take a look at the +[“Try an included sample”](../getting_started/try_example_bundle.md)-Guide. It +will also tell you how to log in and how to use the GUI. -_Note:_ If you don't have a registered application, yet you can follow [this guide](https://developer.spotify.com/documentation/general/guides/app-settings/#register-your-app). As a redirect URL use . +**You also need:** -### Configure the Spotify sample bundle - -1. Start nodecg with nodecg-io installed. The spotify-current-song bundle is currently part of it, so it should also be loaded. +- A Spotify account and a registered Spotify application and the associated + client id/client secret. -2. Go to the `nodecg-io` tab in the nodecg dashboard. +_Note:_ If you don't have a registered application, yet you can follow +[this guide](https://developer.spotify.com/documentation/general/guides/app-settings/#register-your-app). +As a redirect URL use . -3. Login using your password. If this is your first run, then enter the password with which you want to encrypt your configurations and credentials. +### Configure the Spotify sample bundle -4. Create a new Spotify service instance using the left upper menu. +1. In NodeCG, create a new Spotify service instance using the left upper menu. -5. Enter credentials for Spotify. +2. Enter credentials for Spotify. - The created instance should be automatically selected, if not select it in the upper left menu. Enter your client ID and secret in monaco (the text-editor on the right) in this format: + The created instance should be automatically selected, if not select it in + the upper left menu. Enter your client ID and secret in monaco (the + text-editor on the right) in this format: ```json { @@ -33,14 +41,20 @@ _Note:_ If you don't have a registered application, yet you can follow [this gui After entering it, click save. - _Note:_ If you don't see monaco on the right, try reloading the page. - _Note:_ This sample requires the `user-read-playback-state` scope, but you can require other scopes if you want to use functions that require them. - A list of all scopes can be found [here](https://developer.spotify.com/documentation/general/guides/scopes/). + _Note:_ This sample requires the `user-read-playback-state` scope, but you + can require other scopes if you want to use functions that require them. A + list of all scopes can be found + [here](https://developer.spotify.com/documentation/general/guides/scopes/). -6. Set the created Spotify service instance to the service dependency of the spotify-current-song bundle. +3. Set the created Spotify service instance to the service dependency of the + spotify-current-song bundle. - Select the spotify-current-song bundle and the Spotify service in the left bottom menu and then select the service instance that should be used by the spotify-current-song bundle (in this case the name of the previously created Spotify instance). + Select the spotify-current-song bundle and the Spotify service in the left + bottom menu. Then select the service instance that should be used by the + spotify-current-song bundle (in this case the name of the previously created + Spotify instance). -7. Check the nodecg logs +4. Check the NodeCG logs - You should see an error or a success message and the current playing song with names and artists. + You should see an error or a success message and the current playing song + with names and artists. diff --git a/docs/samples/sql.md b/docs/samples/sql.md index be0c9074..be29aa16 100644 --- a/docs/samples/sql.md +++ b/docs/samples/sql.md @@ -1,27 +1,34 @@ ## Using the SQL sample bundle -The SQL example bundle in `samples/sql` demonstrates the ability to access databases. Here is a guide to how to get it working. +The SQL example bundle in `samples/sql` demonstrates the ability to access +databases. Here is a guide to how to get it working. ### Prerequisites -- Working NodeCG & nodecg-io installation -- A database supported by [knex](https://knexjs.org/#Installation) - -_Note:_ If you don't have a database yet and just want to test things you can use sqlite3 and don't need to set up a database server. You can always move to a different database type later. +You will need a working `nodecg-io` installation. If you have non yet take a +look at [installation guide](../getting_started/install.md). You may need to +install this bundle, so take a look at the +[“Try an included sample”](../getting_started/try_example_bundle.md)-Guide. It +will also tell you how to log in and how to use the GUI. -### Configure the SQL sample bundle +**You also need:** -1. Start nodecg with nodecg-io installed. The SQL sample bundle is currently part of it, so it should also be loaded. +- A database supported by [knex](https://knexjs.org/#Installation) -2. Go to the `nodecg-io` tab in the nodecg dashboard. +_Note:_ If you don't have a database yet and just want to test things you can +use sqlite3 and don't need to set up a database server. You can always move to a +different database type later. -3. Login using your password. If this is your first run, then enter the password with which you want to encrypt your configurations and credentials. +### Configure the SQL sample bundle -4. Create a new SQL service instance using the left upper menu. +1. In NodeCG, create a new SQL service instance using the left upper menu. -5. Enter configuration for SQL. +2. Enter configuration for SQL. - The created instance should be automatically selected, if not select it in the upper left menu. Enter your used database client and a [knex connection object](https://knexjs.org/#Installation-client) in monaco (the text-editor on the right) in this format: + The created instance should be automatically selected, if not select it in + the upper left menu. Enter your used database client and a + [knex connection object](https://knexjs.org/#Installation-client) in monaco + (the text-editor on the right) in this format: ```json { @@ -35,14 +42,17 @@ _Note:_ If you don't have a database yet and just want to test things you can us After entering it, click save. - _Note:_ If you don't see monaco on the right, try reloading the page. - -6. Set the created SQL service instance to the service dependency of the SQL sample bundle. +3. Set the created SQL service instance to the service dependency of the SQL + sample bundle. - Select the SQL sample bundle and the SQL service in the left bottom menu and then select the service instance that should be used by the SQL sample bundle (in this case the name of the previously created SQL instance). + Select the SQL sample bundle and the SQL service in the left bottom menu. + Then select the service instance that should be used by the SQL sample + bundle (in this case the name of the previously created SQL instance). -7. Check the nodecg logs +4. Check the NodeCG logs - Your first run of the sample bundle will probably fail because your database doesn't contain the used tables. - Check `samples/sql/extension/index.ts` and create the tables as used or create your own tables and adapt the sample accordingly. - You can also use this code as a reference on how to use the SQL client to do your queries. + Your first run of the sample bundle will probably fail because your database + doesn't contain the used tables. Check `samples/sql/extension/index.ts` and + create the tables as used or create your own tables and adapt the sample + accordingly. You can also use this code as a reference on how to use the SQL + client to do your queries. diff --git a/docs/samples/streamdeck.md b/docs/samples/streamdeck.md index 94d1c2d9..8483993d 100644 --- a/docs/samples/streamdeck.md +++ b/docs/samples/streamdeck.md @@ -1,22 +1,31 @@ ## Using the StreamDeck rainbow sample bundle -The streamdeck-rainbow bundle paints your streamdeck with different colours. It is located in `samples/streamdeck-rainbow`. +The streamdeck-rainbow bundle paints your streamdeck with different colours. It +is located in `samples/streamdeck-rainbow`. -Sadly you can't access the StreamDeck while another application accesses it. So you need to stop your StreamDeck Software before. +Sadly you can't access the StreamDeck while another application accesses it. So +you need to stop your StreamDeck Software before. -### Configure the Streamdeck Rainbow bundle +### Prerequisites -1. If you're on Linux, follow the instructions listed under Manual Installation [here](https://github.com/timothycrosley/streamdeck-ui/blob/master/README.md). Everything after the `sudo udevadm` command can be omitted. +You will need a working `nodecg-io` installation. If you have non yet take a +look at [installation guide](../getting_started/install.md). You may need to +install this bundle, so take a look at the +[“Try an included sample”](../getting_started/try_example_bundle.md)-Guide. It +will also tell you how to log in and how to use the GUI. -2. Start nodecg with nodecg-io installed. The streamdeck-rainbow bundle is currently part of it, so it should also be loaded. +**You also need:** (If you're on Linux) -3. Go to the `nodecg-io` tab in the nodecg dashboard. +Follow the instructions listed under Manual Installation +[here](https://github.com/timothycrosley/streamdeck-ui/blob/master/README.md). +Everything after the `sudo udevadm` command can be omitted. -4. Login using your password. If this is your first run, then enter the password with which you want to encrypt your configurations and credentials. +### Configure the Streamdeck Rainbow bundle -5. Create a new StreamDeck service instance using the left upper menu. +1. In NodeCG, create a new StreamDeck service instance using the left upper + menu. -6. Enter the configuration +2. Enter the configuration ```json { @@ -24,8 +33,10 @@ Sadly you can't access the StreamDeck while another application accesses it. So } ``` - `default` tells the bundle to automatically find a StreamDeck. If you use multiple StreamDecks, you need to put in an ID here. + `default` tells the bundle to automatically find a StreamDeck. If you use + multiple StreamDecks, you need to put in an ID here. -7. Set the created StreamDeck service instance to the service dependency of the streamdeck-rainbow bundle. +3. Set the created StreamDeck service instance to the service dependency of the + streamdeck-rainbow bundle. -8. Watch your streamdeck. +4. Watch your streamdeck. diff --git a/docs/samples/streamelements.md b/docs/samples/streamelements.md index 8c5d7dc5..87a4e132 100644 --- a/docs/samples/streamelements.md +++ b/docs/samples/streamelements.md @@ -1,31 +1,39 @@ ## Using the StreamElements sample bundle -The StreamElements-events example bundle in `samples/streamelements-events` demonstrates the ability to react to events like donations and subs. Here is a guide to how to get it working. +The StreamElements-events example bundle in `samples/streamelements-events` +demonstrates the ability to react to events like donations and subs. Here is a +guide to how to get it working. ### Prerequisites -- Working NodeCG & nodecg-io installation +You will need a working `nodecg-io` installation. If you have non yet take a +look at [installation guide](../getting_started/install.md). You may need to +install this bundle, so take a look at the +[“Try an included sample”](../getting_started/try_example_bundle.md)-Guide. It +will also tell you how to log in and how to use the GUI. + +**You also need:** + - A StreamElements account ### Getting JWT Token -To use the StreamElements service you need a JWT Token that gives it access to your account. +To use the StreamElements service you need a JWT Token that gives it access to +your account. -To get it go to , login, click on `Show Secrets` and copy it. +To get it go to , login, +click on `Show Secrets` and copy it. ### Configure the StreamElements sample bundle -1. Start nodecg with nodecg-io installed. The streamelements-events bundle is currently part of it, so it should also be loaded. - -2. Go to the `nodecg-io` tab in the nodecg dashboard. +1. In NodeCG, create a new StreamElements service instance using the left upper + menu. -3. Login using your password. If this is your first run, then enter the password with which you want to encrypt your configurations and credentials. +2. Enter credentials for StreamElements. -4. Create a new StreamElements service instance using the left upper menu. - -5. Enter credentials for StreamElements. - - The created instance should be automatically selected, if not select it in the upper left menu. Enter your JWT Token in monaco (the text-editor on the right) in this format: + The created instance should be automatically selected, if not select it in + the upper left menu. Enter your JWT Token in monaco (the text-editor on the + right) in this format: ```json { @@ -35,12 +43,15 @@ To get it go to , login, After entering it, click save. - _Note:_ If you don't see monaco on the right, try reloading the page. - -6. Set the created StreamElements service instance to the service dependency of the streamelements-events bundle. +3. Set the created StreamElements service instance to the service dependency of + the streamelements-events bundle. - Select the streamelements-events bundle and the StreamElements service in the left bottom menu and then select the service instance that should be used by the streamelements-events bundle (in this case the name of the previously created streamelements-events instance). + Select the streamelements-events bundle and the StreamElements service in + the left bottom menu. Then select the service instance that should be used + by the streamelements-events bundle (in this case the name of the previously + created streamelements-events instance). -7. Check the nodecg logs +4. Check the nodecg logs - You should see an error or a success message and a log message for each event of your channel like subs, follows, cheers, raids and so on. + You should see an error or a success message and a log message for each + event of your channel like subs, follows, cheers, raids and so on. diff --git a/docs/samples/telegram.md b/docs/samples/telegram.md index f067e443..3d975c47 100644 --- a/docs/samples/telegram.md +++ b/docs/samples/telegram.md @@ -1,25 +1,30 @@ ## Using the telegram sample bundle -The telegram sample bundle in `samples/telegram-bot` shows how to create a simple command. +The telegram sample bundle in `samples/telegram-bot` shows how to create a +simple command. ### Prerequisites -- Working NodeCG & nodecg-io installation -- A telegram bot API token. You can create your bot [here](https://t.me/botfather). +You will need a working `nodecg-io` installation. If you have non yet take a +look at [installation guide](../getting_started/install.md). You may need to +install this bundle, so take a look at the +[“Try an included sample”](../getting_started/try_example_bundle.md)-Guide. It +will also tell you how to log in and how to use the GUI. -### Configure the telegram sample bundle - -1. Start nodecg with nodecg-io installed. The telegram bundle is currently part of it, so it should also be loaded. +**You also need:** -2. Go to the `nodecg-io` tab in the nodecg dashboard. +- A telegram-bot API token. You can create your bot + [here](https://t.me/botfather). -3. Login using your password. If this is your first run, then enter the password with which you want to encrypt your configurations and credentials. +### Configure the telegram sample bundle -4. Create a new telegram service instance using the left upper menu. +1. Create a new telegram service instance using the left upper menu. -5. Enter the token and set polling to true. +2. Enter the token and set polling to true. - The created instance should be automatically selected, if not select it in the upper left menu. Enter your host and port in monaco (the text-editor on the right) in this format: + The created instance should be automatically selected, if not select it in + the upper left menu. Enter your host and port in monaco (the text-editor on + the right) in this format: ```json { @@ -30,6 +35,7 @@ The telegram sample bundle in `samples/telegram-bot` shows how to create a simpl After entering it, click save. -6. Set the created telegram service instance to the service dependency of the telegram bundle. +3. Set the created telegram service instance to the service dependency of the + telegram bundle. -7. You can send `/test` to your bot, and it should respond with two messages. +4. You can send `/test` to your bot, and it should respond with two messages. diff --git a/docs/samples/tiane.md b/docs/samples/tiane.md index 9e544530..71c6f539 100644 --- a/docs/samples/tiane.md +++ b/docs/samples/tiane.md @@ -1,22 +1,39 @@ ## Using the TIANE-Discord sample bundle -The TIANE-Discord example bundle in `samples/tiane-discord` shows how to make TIANE act as a discord bot. TIANE is a German open source smart home assistant written in python. Here is a guide to how to get it working. +The TIANE-Discord example bundle in `samples/tiane-discord` shows how to make +TIANE act as a discord bot. TIANE is a German open source smart home assistant +written in python. Here is a guide to how to get it working. ### Prerequisites -- Working NodeCG & nodecg-io installation -- A working [TIANE](https://github.com/FerdiKr/TIANE) server installation. (No room client required) +You will need a working `nodecg-io` installation. If you have non yet take a +look at [installation guide](../getting_started/install.md). You may need to +install this bundle, so take a look at the +[“Try an included sample”](../getting_started/try_example_bundle.md)-Guide. It +will also tell you how to log in and how to use the GUI. + +**You also need:** + +- A working [TIANE](https://github.com/FerdiKr/TIANE) server installation. (No + room client required) - a Discord Bot token +_Note:_ If you don't Discord Bot token yet, you can follow +[this](https://discordjs.guide/preparations/setting-up-a-bot-application.html) +guide. + ### Configure the TIANE sample bundle 1. Edit the file `samples/tiane-discord/extension/index.ts`. Look for this line: - ``` + ```ts const discordChannel = ""; // Insert channel for the discord bot here ``` - Put the channel ID of a discord channel where you want to talk to TIANE between the quotation marks. See [here](https://github.com/Chikachi/DiscordIntegration/wiki/How-to-get-a-token-and-channel-ID-for-Discord) to find out how to get a channel ID. + Put the channel ID of a discord channel where you want to talk to TIANE + between the quotation marks. See + [here](https://github.com/Chikachi/DiscordIntegration/wiki/How-to-get-a-token-and-channel-ID-for-Discord) + to find out how to get a channel ID. 2. Run `npm run build` in the main nodecg-io directory. 3. Edit the file `server/TIANE_config.json` on your TIANE server: @@ -29,19 +46,17 @@ The TIANE-Discord example bundle in `samples/tiane-discord` shows how to make TI } ``` - Make sure `websocket` is either set to `enabled` or `secure` and set a port of your desire. + Make sure `websocket` is either set to `enabled` or `secure` and set a port + of your desire. -4. Start nodecg with nodecg-io installed. The TIANE-Discord bundle is currently part of it, so it should also be loaded. +4. In the NodeCG dashboard, create a new TIANE service instance using the left + upper menu. -5. Go to the `nodecg-io` tab in the nodecg dashboard. +5. Enter address of the TIANE-Server -6. Login using your password. If this is your first run, then enter the password with which you want to encrypt your configurations and credentials. - -7. Create a new TIANE service instance using the left upper menu. - -8. Enter address of the TIANE-Server - - The created instance should be automatically selected, if not select it in the upper left menu. Enter host and port you just set in `server/TIANE_config.json` in this format: + The created instance should be automatically selected, if not select it in + the upper left menu. Enter host and port you just set in + `server/TIANE_config.json` in this format: ```json { @@ -51,12 +66,16 @@ The TIANE-Discord example bundle in `samples/tiane-discord` shows how to make TI After entering it, click save. - _Note:_ If you don't see the editor on the right, try reloading the page. - -9. Create a new Discord service instance. (See the [Discord Sample](discord.md) on how to do this) +6. Create a new Discord service instance. (See the [Discord Sample](discord.md) + on how to do this) -10. Set the created TIANE and Discord service instances to the service dependency of the TIANE-Discord bundle. +7. Set the created TIANE and Discord service instances to the service dependency + of the TIANE-Discord bundle. - Select the TIANE-Discord bundle and the TIANE service in the left bottom menu and then select the service instance that should be used by the TIANE-Discord bundle (in this case the name of the previously created twitch instance). Then do the same for the discord bundle. + Select the TIANE-Discord bundle and the TIANE service in the left bottom + menu. Then select the service instance that should be used by the + TIANE-Discord bundle (in this case the name of the previously created twitch + instance). Then do the same for the discord bundle. -11. Ping your discord bot in the channel you set in the first step and ask TIANE something. +8. Ping your discord bot in the channel you set in the first step and ask TIANE + something. diff --git a/docs/samples/twitch-addons.md b/docs/samples/twitch-addons.md index 920c6014..c0371efd 100644 --- a/docs/samples/twitch-addons.md +++ b/docs/samples/twitch-addons.md @@ -1,27 +1,36 @@ ## Using the Twitch-Addons sample bundle -The Twitch-Addons example bundle in `samples/twitch-addons` demonstrates the ability to send requests to the APIs of [BetterTTV](https://betterttv.com/), and [FrankerFaceZ](https://www.frankerfacez.com/). +The Twitch-Addons example bundle in `samples/twitch-addons` demonstrates the +ability to send requests to the APIs of [BetterTTV](https://betterttv.com/), and +[FrankerFaceZ](https://www.frankerfacez.com/). ### Prerequisites -- Working NodeCG & nodecg-io installation -- a Twitch OAuth Key +You will need a working `nodecg-io` installation. If you have non yet take a +look at [installation guide](../getting_started/install.md). You may need to +install this bundle, so take a look at the +[“Try an included sample”](../getting_started/try_example_bundle.md)-Guide. It +will also tell you how to log in and how to use the GUI. -_Note:_ If you don't have such a key yet, you can generate it on . Just log into your Twitch account and copy the token. You can also use any other token. There are no special scope requirements as the token is only used to convert channel names to IDs. +**You also need:** -### Configure the Twitch-Addons sample bundle - -1. Start nodecg with nodecg-io installed. The Twitch-Addons bundle is currently part of it, so it should also be loaded. +- A Twitch oAuth-Key -2. Go to the `nodecg-io` tab in the nodecg dashboard. +_Note:_ If you don't have such a key yet, you can generate it on +. Just log into your Twitch account and copy the +token. You can also use any other token. There are no special scope requirements +as the token is only used to convert channel names to IDs. -3. Login using your password. If this is your first run, then enter the password with which you want to encrypt your configurations and credentials. +### Configure the Twitch-Addons sample bundle -4. Create a new twitch-addons service instance using the left upper menu. +1. In NodeCG, create a new twitch-addons service instance using the left upper + menu. -5. Enter credentials for twitch. +2. Enter credentials for twitch. - The created instance should be automatically selected, if not select it in the upper left menu. Enter your Twitch OAuth Key in monaco (the text-editor on the right) in this format: + The created instance should be automatically selected, if not select it in + the upper left menu. Enter your Twitch OAuth Key in monaco (the text-editor + on the right) in this format: ```json { @@ -31,12 +40,15 @@ _Note:_ If you don't have such a key yet, you can generate it on , select custom scope token and select the scopes you need. For this sample you don't need any additional scopes, so you can leave everything off. +**You also need:** -### Configure the Twitch API sample bundle - -1. Start nodecg with nodecg-io installed. The twitch-api bundle is currently part of it, so it should also be loaded. +- A Twitch oAuth-Key -2. Go to the `nodecg-io` tab in the nodecg dashboard. +_Note:_ If you don't have such a key yet, you can generate it on +, select custom scope token and select the +scopes you need. For this sample you don't need any additional scopes, so you +can leave everything off. -3. Login using your password. If this is your first run, then enter the password with which you want to encrypt your configurations and credentials. +### Configure the Twitch API sample bundle -4. Create a new twitch-api service instance using the left upper menu. +1. In NodeCG, create a new twitch-api service instance using the left upper + menu. -5. Enter credentials for the twitch API. +2. Enter credentials for the twitch API. - The created instance should be automatically selected, if not select it in the upper left menu. Enter your Twitch OAuth Key in monaco (the text-editor on the right) in this format: + The created instance should be automatically selected, if not select it in + the upper left menu. Enter your Twitch OAuth Key in monaco (the text-editor + on the right) in this format: ```json { @@ -31,12 +40,15 @@ _Note:_ If you don't have such a key yet, you can generate it on . Just log into your Twitch account and copy the token. +You will need a working `nodecg-io` installation. If you have non yet take a +look at [installation guide](../getting_started/install.md). You may need to +install this bundle, so take a look at the +[“Try an included sample”](../getting_started/try_example_bundle.md)-Guide. It +will also tell you how to log in and how to use the GUI. -### Configure the Twitch sample bundle +**You also need:** -1. Start nodecg with nodecg-io installed. The Twitch-chat bundle is currently part of it, so it should also be loaded. +- a Twitch oAuth-Key -2. Go to the `nodecg-io` tab in the nodecg dashboard. +_Note:_ If you don't have such a key yet, you can generate it on +. Just log into your Twitch account and copy the +token. -3. Login using your password. If this is your first run, then enter the password with which you want to encrypt your configurations and credentials. +### Configure the Twitch sample bundle -4. Create a new twitch-chat service instance using the left upper menu. +1. In NodeCG, create a new twitch-chat service instance using the left upper + menu. -5. Enter credentials for twitch. +2. Enter credentials for twitch. - The created instance should be automatically selected, if not select it in the upper left menu. Enter your Twitch OAuth Key in monaco (the text-editor on the right) in this format: + The created instance should be automatically selected, if not select it in + the upper left menu. Enter your Twitch OAuth Key in monaco (the text-editor + on the right) in this format: ```json { @@ -31,12 +39,16 @@ _Note:_ If you don't have such a key yet, you can generate it on , select custom scope token and select these scopes: `channel_subscriptions`, `bits:read` and `channel:read:redemptions` +**You also need:** -### Configure the Twitch PubSub sample bundle - -1. Start nodecg with nodecg-io installed. The twitch-pubsub sample bundle is currently part of it, so it should also be loaded. +- A Twitch oAuth-Key -2. Go to the `nodecg-io` tab in the nodecg dashboard. +_Note:_ If you don't have such a key yet, you can generate it on +, select custom scope token and select these +scopes: `channel_subscriptions`, `bits:read` and `channel:read:redemptions` -3. Login using your password. If this is your first run, then enter the password with which you want to encrypt your configurations and credentials. +### Configure the Twitch PubSub sample bundle -4. Create a new twitch-pubsub service instance using the left upper menu. +1. In NodeCG, create a new twitch-pubsub service instance using the left upper + menu. -5. Enter credentials for twitch-pubsub. +2. Enter credentials for twitch-pubsub. - The created instance should be automatically selected, if not select it in the upper left menu. Enter your Twitch OAuth Key in monaco (the text-editor on the right) in this format: + The created instance should be automatically selected, if not select it in + the upper left menu. Enter your Twitch OAuth Key in monaco (the text-editor + on the right) in this format: ```json { @@ -31,12 +38,15 @@ _Note:_ If you don't have such a key yet, you can generate it on ) to get the necessary keys and tokens. +_Note:_ You will need a Twitter developer account +() to get the necessary keys +and tokens. ### Configure the sample bundle -1. Start nodecg with nodecg-io installed. The twitter-timeline bundle is currently part of it, so it should also be loaded. - -2. Go to the `nodecg-io` tab in the nodecg dashboard. +1. In NodeCG, create a new twitter service instance using the left upper menu. -3. Login using your password. If this is your first run, then enter the password with which you want to encrypt your configurations and credentials. +2. Enter credentials for twitter. -4. Create a new twitter service instance using the left upper menu. - -5. Enter credentials for twitter. - - The created instance should be automatically selected, if not select it in the upper left menu. Enter your Twitter keys and tokens in monaco (the text-editor on the right) in this format: + The created instance should be automatically selected, if not select it in + the upper left menu. Enter your Twitter keys and tokens in monaco (the + text-editor on the right) in this format: ```json { @@ -38,21 +45,28 @@ _Note:_ You will need a Twitter developer account (", params, callback) diff --git a/docs/samples/websocket-client.md b/docs/samples/websocket-client.md index ca962e18..f727ff8d 100644 --- a/docs/samples/websocket-client.md +++ b/docs/samples/websocket-client.md @@ -1,28 +1,31 @@ ## Using the WebSocket-client sample bundle -The WebSocket-client sample bundle in `samples/websocket-client` shows how to set up a simple WebSocket client that will ping a server every second. +The WebSocket-client sample bundle in `samples/websocket-client` shows how to +set up a simple WebSocket client that will ping a server every second. ### Prerequisites -- Working NodeCG & nodecg-io installation +You will need a working `nodecg-io` installation. If you have non yet take a +look at [installation guide](../getting_started/install.md). You may need to +install this bundle, so take a look at the +[“Try an included sample”](../getting_started/try_example_bundle.md)-Guide. It +will also tell you how to log in and how to use the GUI. For simplicity's sake this sample will rely upon the websocket-server sample. ### Configure the WebSocket-client sample bundle -Please set up the WebSocket-server bundle first and then follow these steps: +Please set up the [WebSocket-server bundle](./websocket-server.md) first and +then follow these steps: -1. Start nodecg with nodecg-io installed. The websocket-client bundle is currently part of it, so it should also be loaded. +1. In NodeCG, create a new ws-client service instance using the left upper menu. -2. Go to the `nodecg-io` tab in the nodecg dashboard. +2. Enter the address of the sample server. This has to be a URL following the + pattern `ws://localhost:`. -3. Login using your password. If this is your first run, then enter the password with which you want to encrypt your configurations and credentials. - -4. Create a new ws-client service instance using the left upper menu. - -5. Enter the address of the sample server. This has to be a URL following the pattern `ws://localhost:`. - - The created instance should be automatically selected, if not select it in the upper left menu. Enter your port in monaco (the text-editor on the right) in this format: + The created instance should be automatically selected, if not select it in + the upper left menu. Enter your port in monaco (the text-editor on the + right) in this format: ```json { @@ -32,6 +35,8 @@ Please set up the WebSocket-server bundle first and then follow these steps: After entering it, click save. -6. Set the created ws-client service instance to the service dependency of the ws-client bundle. +3. Set the created ws-client service instance to the service dependency of the + ws-client bundle. -7. A websocket-client has been connected and the console should display if a ping is sent or a pong is received. +4. A websocket-client has been connected and the console should display if a + ping is sent or a pong is received. diff --git a/docs/samples/websocket-server.md b/docs/samples/websocket-server.md index 74346c8e..c6eca116 100644 --- a/docs/samples/websocket-server.md +++ b/docs/samples/websocket-server.md @@ -1,24 +1,25 @@ ## Using the WebSocket Server sample bundle -The WebSocket-server sample bundle in `samples/websocket-server` shows how to set up a simple WebSocket server that will relay all incoming messages to all connected clients. +The WebSocket-server sample bundle in `samples/websocket-server` shows how to +set up a simple WebSocket server that will relay all incoming messages to all +connected clients. ### Prerequisites -- Working NodeCG & nodecg-io installation +You will need a working `nodecg-io` installation. If you have non yet take a +look at [installation guide](../getting_started/install.md). You may need to +install this bundle, so take a look at the +[“Try an included sample”](../getting_started/try_example_bundle.md)-Guide. It +will also tell you how to log in and how to use the GUI. ### Configure the websocket-server sample bundle -1. Start nodecg with nodecg-io installed. The websocket-server bundle is currently part of it, so it should also be loaded. +1. In NodeCG, create a new ws-server service instance using the left upper menu. +2. Enter a port for the server. This has to be a number from 0 to 65535. -2. Go to the `nodecg-io` tab in the nodecg dashboard. - -3. Login using your password. If this is your first run, then enter the password with which you want to encrypt your configurations and credentials. - -4. Create a new ws-server service instance using the left upper menu. - -5. Enter a port for the server. This has to be a number from 0 to 65535. - - The created instance should be automatically selected, if not select it in the upper left menu. Enter your port in monaco (the text-editor on the right) in this format: + The created instance should be automatically selected, if not select it in + the upper left menu. Enter your port in monaco (the text-editor on the + right) in this format: ```json { @@ -28,6 +29,6 @@ The WebSocket-server sample bundle in `samples/websocket-server` shows how to se After entering it, click save. -6. Set the created ws-server service instance to the service dependency of the ws-server bundle. - -7. A websocket-server has been started at the specified port. +3. Set the created ws-server service instance to the service dependency of the + ws-server bundle. +4. A websocket-server has been started at the specified port. diff --git a/docs/samples/xdotool.md b/docs/samples/xdotool.md index 486d26be..060c59c4 100644 --- a/docs/samples/xdotool.md +++ b/docs/samples/xdotool.md @@ -1,25 +1,29 @@ ## Using the Xdotool sample bundle -The Xdotool sample bundle in `samples/xdotool-windowminimize` shows how to use the xdotool service to execute [xdotool commands](http://manpages.ubuntu.com/manpages/trusty/man1/xdotool.1.html) by minimizing the currently active window. +The Xdotool sample bundle in `samples/xdotool-windowminimize` shows how to use +the xdotool service to execute +[xdotool commands](http://manpages.ubuntu.com/manpages/trusty/man1/xdotool.1.html) +by minimizing the currently active window. ### Prerequisites -- Working NodeCG & nodecg-io installation -- xdotool installed (Only works on Linux) +You will need a working `nodecg-io` installation. If you have non yet take a +look at [installation guide](../getting_started/install.md). You may need to +install this bundle, so take a look at the +[“Try an included sample”](../getting_started/try_example_bundle.md)-Guide. It +will also tell you how to log in and how to use the GUI. -### Configure the Xdotool sample bundle - -1. Start nodecg with nodecg-io installed. The xdotool bundle is currently part of it, so it should also be loaded. +- Xdotool installed (Only works on Linux) -2. Go to the `nodecg-io` tab in the nodecg dashboard. - -3. Login using your password. If this is your first run, then enter the password with which you want to encrypt your configurations and credentials. +### Configure the Xdotool sample bundle -4. Create a new xdotool service instance using the left upper menu. +1. In NodeCG, create a new xdotool service instance using the left upper menu. -5. Enter settings port `-1` tells nodecg-io to use a locally installed xdotool. +2. Enter settings port `-1` tells nodecg-io to use a locally installed xdotool. - The created instance should be automatically selected, if not select it in the upper left menu. Configure local xdotool in monaco (the text-editor on the right) using this config: + The created instance should be automatically selected, if not select it in + the upper left menu. Configure local xdotool in monaco (the text-editor on + the right) using this config: ```json { @@ -30,6 +34,7 @@ The Xdotool sample bundle in `samples/xdotool-windowminimize` shows how to use t After entering it, click save. -6. Set the created xdotool service instance to the service dependency of the xdotool bundle. +3. Set the created xdotool service instance to the service dependency of the + xdotool bundle. -7. Your browser window should get minimized. +4. Your browser window should get minimized. diff --git a/docs/samples/youtube.md b/docs/samples/youtube.md index b88c6745..1f44316a 100644 --- a/docs/samples/youtube.md +++ b/docs/samples/youtube.md @@ -1,29 +1,37 @@ ## Using the YouTube sample bundle -The YouTube bundle in `samples/youtube-playlist` demonstrates the ability of getting information of a playlist. Here is a guide to how to get it working. +The YouTube bundle in `samples/youtube-playlist` demonstrates the ability of +getting information of a playlist. Here is a guide to how to get it working. ### Prerequisites -- Working NodeCG & nodecg-io installation +You will need a working `nodecg-io` installation. If you have non yet take a +look at [installation guide](../getting_started/install.md). You may need to +install this bundle, so take a look at the +[“Try an included sample”](../getting_started/try_example_bundle.md)-Guide. It +will also tell you how to log in and how to use the GUI. + +**You also need:** + - Google cloud API OAuth access (client ID, client Secret) - Grant `YouTube Data API v3` access at the project's dashboard. - - Shortcut URL: > + - Shortcut URL: + > -_Note:_ If you don't have such a key yet, you can generate them like [this](https://developers.google.com/identity/protocols/oauth2/web-server#creatingcred). As redirect URI add . +_Note:_ If you don't have such a key yet, you can generate them like +[this](https://developers.google.com/identity/protocols/oauth2/web-server#creatingcred). +As redirect URI add . ### Configure the YouTube sample bundle -1. Start nodecg with nodecg-io installed. The YouTube bundle is currently part of it, so it should also be loaded. - -2. Go to the `nodecg-io` tab in the nodecg dashboard. - -3. Login using your password. If this is your first run, then enter the password with which you want to encrypt your configurations and credentials. - -4. Create a new googleapis service instance using the left upper menu. +1. In NodeCG, create a new googleapis service instance using the left upper + menu. -5. Enter credentials for googleapis. +2. Enter credentials for googleapis. - The created instance should be automatically selected, if not select it in the upper left menu. Enter your YouTube OAuth credentials in monaco (the text-editor on the right) in this format: + The created instance should be automatically selected, if not select it in + the upper left menu. Enter your YouTube OAuth credentials in monaco (the + text-editor on the right) in this format: ```json { @@ -35,13 +43,18 @@ _Note:_ If you don't have such a key yet, you can generate them like [this](http After entering it, click save. - _Note:_ If you don't see monaco on the right, try reloading the page. - _Note:_ You can add multiple scopes if the googleapis instance is used for multiple bundles. + _Note:_ You can add multiple scopes if the googleapis instance is used for + multiple bundles. -6. Set the created googleapis service instance to the service dependency of the YouTube bundle. +3. Set the created googleapis service instance to the service dependency of the + YouTube bundle. - Select the YouTube bundle and the googleapis service in the left bottom menu and then select the service instance that should be used by the YouTube bundle (in this case the name of the previously created googleapis instance). + Select the YouTube bundle and the googleapis service in the left bottom + menu. Then select the service instance that should be used by the YouTube + bundle (in this case the name of the previously created googleapis + instance). -7. Check the nodecg logs +4. Check the NodeCG logs - You should see an error or a success message that is hardcoded in `samples/youtube-playlist/extension/index.ts`. + You should see an error or a success message that is hardcoded in + `samples/youtube-playlist/extension/index.ts`. diff --git a/mkdocs.yml b/mkdocs.yml index 165b8902..58c673b3 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -38,6 +38,7 @@ nav: - Home: index.md - Getting Started: - Installation: getting_started/install.md + - Using a sample bunndle: getting_started/try_example_bundle.md - Your first bundle: getting_started/create_new_bundle.md - Migrating an existing bundle: getting_started/existing_bundle.md - Configuration: getting_started/configuration.md From 842c05076c5859e1b20b4659f2d32cbdfead3845 Mon Sep 17 00:00:00 2001 From: Tim_Tech_Dev Date: Wed, 27 Oct 2021 21:22:41 +0200 Subject: [PATCH 2/4] Revise grammar of the previous commit - Improve capitalization in `install.md` - Revise `try_sample_bundle.md` to a more formal written English Tim Signed-off-by: Tim_Tech_Dev --- docs/getting_started/install.md | 11 ++++--- docs/getting_started/try_example_bundle.md | 38 ++++++++++------------ 2 files changed, 24 insertions(+), 25 deletions(-) diff --git a/docs/getting_started/install.md b/docs/getting_started/install.md index b9fc9b53..8c3f4cd0 100644 --- a/docs/getting_started/install.md +++ b/docs/getting_started/install.md @@ -9,8 +9,8 @@ In order to download necessary tools and to install nodecg-io using the CLI you You'll need the following tools: - [Git](https://git-scm.com) -- [Node.JS](https://nodejs.org/en/) v12.0.0 or newer -- [Npm](https://www.npmjs.com/get-npm) 7.0.0 or newer +- [Node.js](https://nodejs.org/en/) v12.0.0 or newer +- [npm](https://www.npmjs.com/get-npm) 7.0.0 or newer - [NodeCG](https://nodecg.dev/) 1.4.0 or newer (1.7.0 or higher recommended) ### Native Build Tools @@ -60,7 +60,7 @@ _Note:_ If you are running on Linux, you may need to use `sudo` if your npm inst ## Install nodecg-io using the nodecg-io CLI -With the nodecg-io CLI installed you can run this command inside a nodecg installation to install nodecg-io: +With the nodecg-io CLI installed you can run this command inside a NodeCG installation to install nodecg-io: ```shell nodecg-io install @@ -83,7 +83,8 @@ If you want to every change your nodecg-io installation to add/remove a service When starting NodeCG you should see that all nodecg-io related bundles should be loaded and that you can now access nodecg-io in your NodeCG dashboard. There are many example bundles premade for most services, so you may take a -look at the [“Try an included sample”](../getting_started/try_example_bundle.md)-Guide. +look at the [“Try an included sample”](../getting_started/try_example_bundle.md)-Guide (It +will also tell you how to log in and how to use the GUI). Or you could directly take a deep dive into our framework and either [create a new bundle](./create_new_bundle.md) or [integrate an existing bundle](./existing_bundle.md). There are other bundles using nodecg-io, witch you could try, so may take a look around GitHub or GitLab. @@ -96,4 +97,4 @@ If you want to uninstall nodecg-io you can run the following command: nodecg-io uninstall ``` -This will remove the `nodecg-io` directory inside your nodecg installation and also will remove it from the loaded bundle paths in your nodecg configuration. +This will remove the `nodecg-io` directory inside your NodeCG installation and also will remove it from the loaded bundle paths in your NodeCG configuration. diff --git a/docs/getting_started/try_example_bundle.md b/docs/getting_started/try_example_bundle.md index 560ccc00..8c762d80 100644 --- a/docs/getting_started/try_example_bundle.md +++ b/docs/getting_started/try_example_bundle.md @@ -1,6 +1,6 @@ # Try an included sample -Trying one of the premade example bundles, is a good way to get to know the +Trying one of the premade example bundles is a good way to get to know the framework and especially the selected service. ## Step 1: Installing the Sample @@ -8,10 +8,8 @@ framework and especially the selected service. If you installed **dev** branch or cloned nodecg-io directly from GitHub all the samples should be already installed (you can move to step 2). In case you installed the **production** branch of nodecg-io, you may have to download the -sample before you can use it. In case you already installed it previously you -can move on to step 2. -Installing and uninstalling of sample bundles can be done with the nodecg-io -CLI. +sample before you can use it. Installing and uninstalling of sample bundles can be done with the nodecg-io +CLI. This can be done as follows. Run this command inside your NodeCG folder: @@ -24,14 +22,14 @@ You will be presented with a pair of options: -1. You can select the version of nodecg-io to install. **Select here the version already installed.** (Since this is not the migration guide) +1. You can select the version of nodecg-io to install. **Select the version that is already installed here.** (Since this is not the migration guide)
    user@computer:~/nodecg$ nodecg-io install
        Installing nodecg-io...
        Detected nodecg installation at /home/user/nodecg.
        ? Which version do you want to install?  (Use arrow keys) 
          development 
        ❯ 0.1
    -2. You can select the sample bundles to be included. **Select here the sample(s) you want to try.** +2. You can select the sample bundles to be included. **Select the sample(s) you want to try here.**
    user@computer:~/nodecg$ nodecg-io install
        Installing nodecg-io...
        Detected nodecg installation at /home/user/nodecg.
    @@ -61,7 +59,7 @@ the `Run and Debug` Explorer View:
     
     ### Using the terminal
     
    -You also launch NodeCG using your terminal with:
    +You may also launch NodeCG using your terminal with:
     
     
    user@computer:~/nodecg$ npm run start
     
    @@ -75,7 +73,7 @@ info: [nodecg-io-core] Minzig!
     
     info: [nodecg/lib/server] NodeCG running on http://localhost:9090
    -Now you can open the NodeCG dashboard under . +Now you can open the NodeCG dashboard (by default) under . ## Step 3: Log in to nodecg-io @@ -87,23 +85,23 @@ If you are logging in for the first time you will have to set your password. Else you simply have to log in with your previously chosen password. -Now you are in the `nodecg-io` config menu. It should look like this: +Now you are looking at the `nodecg-io` config menu. It should look like this: ![`nodcg-io` config menu](../assets/nodcg-io-dashboard.png) ## Step 4: Learning how to use the GUI -The current GUI is just intended to make the project usable, but is not very +The current GUI is just intended to make the project usable, but it is not very user-friendly. As a more long term solution, a new GUI will be developed that -also focuses at user experience. But till the new GUI is developed you will have +also focuses on user experience. Until the new GUI is developed, you will have to arrange yourself with this one. So, to get started: ![`nodcg-io` colour coded](../assets/nodcg-io-colored.png) ### In pink: NodeCG Tabs -Here you will find every NodeCG-bundle, which has a dashboard. Here you may -select the [`nodecg-io-debug`](../samples/debug.md)-dashboard, if you have it +Here you will find every NodeCG-bundle that has a dashboard. Here you may +select the [`nodecg-io-debug`](../samples/debug.md)-dashboard, if it is installed. ### In yellow: Monaco editor @@ -121,7 +119,7 @@ _Creating a new service instance_: This can be accomplished by selecting the item `'New'`. Then a new dropdown will be revealed, in witch you may select the service type. Additionally, you must -select an instance name. Then click `'Create'`. The new created instance should +select an instance name. Then click `'Create'`. The newly created instance should be selected. _Configure a service instance_: @@ -136,11 +134,11 @@ This can be accomplished by selecting an existing instance. Then click ### In violet: Bundles section -This section has tree dropdowns: +This section has three dropdowns: 1. Bundle: Here you can select a bundle to configure. -2. Service: If this bundle uses more than one service, you can select her the - service to set or unset. +2. Service: If this bundle uses more than one service, you may select the + service to set or unset here. 3. Service Instance: Here you can select one instance of the service type set at 2 or `none`. @@ -148,11 +146,11 @@ This section has tree dropdowns: This button will set the service instance for every bundle/service combination to none, effectively removing the access to every service from all bundles. -**Caution**: This cant be undone, and you will have to set up all the bundles +**Caution**: This can not be undone, and you will have to set up all the bundles again. _The service instances will be unaffected._ ## Step 5: Configure the sample -The configuration for every sample bundle is too different to be included here, +The configurations for every sample bundle differ too greatly from each other to be included here, so you have to take a look at the documentation for your sample bundle. You will find it on the left-hand side of this page in the category `Services`. From a0df3ef524e7a9dbfb70766b9e3aa2210838bd50 Mon Sep 17 00:00:00 2001 From: Tim_Tech_Dev Date: Thu, 28 Oct 2021 21:51:55 +0200 Subject: [PATCH 3/4] Revise try_sample_bundle.md - Revise try_sample_bundle.md because the CLI does not work as expected - Move how to install services from try_sample_bundle.md to install.md - Fix typo in mkdocs.yml Tim Signed-off-by: Tim_Tech_Dev --- docs/getting_started/install.md | 162 ++++++++++++++++----- docs/getting_started/try_example_bundle.md | 80 +++------- mkdocs.yml | 2 +- 3 files changed, 152 insertions(+), 92 deletions(-) diff --git a/docs/getting_started/install.md b/docs/getting_started/install.md index 8c3f4cd0..372640fc 100644 --- a/docs/getting_started/install.md +++ b/docs/getting_started/install.md @@ -2,7 +2,8 @@ ## Prerequisites -In order to download necessary tools and to install nodecg-io using the CLI you need network access. +In order to download necessary tools and to install nodecg-io using the CLI you +need network access. ### Required Applications @@ -15,16 +16,22 @@ You'll need the following tools: ### Native Build Tools -Some services depend on packages that require native build tools. You _ONLY_ need to install these if you want to use a service that depends on native modules or if you want to install a development version. +Some services depend on packages that require native build tools. You _ONLY_ +need to install these if you want to use a service that depends on native +modules or if you want to install a development version. -The services that require these include StreamDeck, Midi and Serial. Please note that this list might not be up-to-date. +The services that require these include StreamDeck, Midi and Serial. Please note +that this list might not be up-to-date. -Here's how to install the native build tools on the most popular operating systems, if you need them: +Here's how to install the native build tools on the most popular operating +systems, if you need them: #### Windows -For Windows, you'll need the Visual Studio Build Tools, if you have Visual Studio installed you should already have them. -If you don't have Visual Studio just install the Visual Studio Build Tools by running the following command as an **Administrator**: +For Windows, you'll need the Visual Studio Build Tools, if you have Visual +Studio installed you should already have them. If you don't have Visual Studio +just install the Visual Studio Build Tools by running the following command as +an **Administrator**: ```shell npm install -g windows-build-tools @@ -32,17 +39,20 @@ npm install -g windows-build-tools #### Linux -For Linux, you'll need a C++ compiler and some other packages. On Ubuntu/Debian based operating systems run the following command: +For Linux, you'll need a C++ compiler and some other packages. On Ubuntu/Debian +based operating systems run the following command: ```shell sudo apt install build-essential libusb-1.0-0-dev libasound2-dev libudev-dev ``` -For other Linux distros you'll need the corresponding packages, just search on the internet how the packages are named for your specific distro. +For other Linux distros you'll need the corresponding packages, just search on +the internet how the packages are named for your specific distro. #### macOS -For macOS, you'll need the Xcode command line tools. To install them run the following command: +For macOS, you'll need the Xcode command line tools. To install them run the +following command: ```shell xcode-select --install @@ -56,38 +66,119 @@ Install the nodecg-io CLI using the following command: npm install -g nodecg-io-cli ``` -_Note:_ If you are running on Linux, you may need to use `sudo` if your npm installation uses a non-writeable path (default on Ubuntu apt packages, usually does not apply to packages installed using [nvm](https://github.com/nvm-sh/nvm)) +_Note:_ If you are running on Linux, you may need to use `sudo` if your npm +installation uses a non-writeable path (default on Ubuntu apt packages, usually +does not apply to packages installed using [nvm](https://github.com/nvm-sh/nvm)) ## Install nodecg-io using the nodecg-io CLI -With the nodecg-io CLI installed you can run this command inside a NodeCG installation to install nodecg-io: +> nodecg-io will always be installed into a `nodecg-io/` directory inside your +> NodeCG installation so that your bundles and all bundles from nodecg-io are +> separated. The CLI will add this path to the loaded bundles in your NodeCG +> configuration automatically, you don't need to worry about it. + +With the nodecg-io CLI installed you can run this command inside a NodeCG +installation to install nodecg-io: ```shell -nodecg-io install +$ nodecg-io install +Installing nodecg-io... ``` -You will get a prompt which asks you which version you want to install. - -- By selecting an actual version (e.g., `0.1`) you create a production install that downloads the required packages from npm and setups a npm workspace to install all dependencies. Here you can choose which services you want to install. - -- By selecting `development` you create a development install that clones the nodecg-io git repo and builds everything from scratch. We only recommend a dev install if you are sure that you want to contribute to nodecg-io. Here you always must install all services. - -For starters, we recommend using the latest non-development version. - -nodecg-io will always be installed into a `nodecg-io/` directory inside your NodeCG installation so that your bundles and all bundles from nodecg-io are separated. The CLI will add this path to the loaded bundles in your NodeCG configuration automatically, you don't need to worry about it. - -If you want to every change your nodecg-io installation to add/remove a service or change the version, you can always re-run `nodecg-io install`. If a nodecg-io installation is found, its options will be preselected in the prompt. Re-running `nodecg-io install` will also update all packages to the latest patch version, if you have a production installation, and pull the repository and rebuild, if you have a development installation. - -## Start NodeCG - -When starting NodeCG you should see that all nodecg-io related bundles should be loaded and that you can now access nodecg-io in your NodeCG dashboard. - -There are many example bundles premade for most services, so you may take a -look at the [“Try an included sample”](../getting_started/try_example_bundle.md)-Guide (It -will also tell you how to log in and how to use the GUI). -Or you could directly take a deep dive into our framework and either [create a new bundle](./create_new_bundle.md) -or [integrate an existing bundle](./existing_bundle.md). There are other bundles -using nodecg-io, witch you could try, so may take a look around GitHub or GitLab. +You will get a prompt which asks you which version you want to install: + +
    user@computer:~/nodecg$ nodecg-io install
    +Installing nodecg-io...
    +Detected nodecg installation at /home/user/nodecg.
    +? Which version do you want to install? (Use arrow keys) 
    +  development 
    +❯ 0.1
    + +There are two possible installation types: + +- By selecting an actual version (e.g., `0.1`) you create a production install + that downloads the required packages from npm and setups a npm workspace to + install all dependencies. Here you can choose which services you want to + install. Here you can not easily install our premade examples. + +- By selecting `development` you create a development install that clones the + nodecg-io git repo and builds everything from scratch. We only recommend a + development install if you are sure that you want to contribute to nodecg-io + or want to try an included example. Here you always must install all + services and examples. + +For starters, we recommend using the development version, so you may try our +premade examples. + +### Production install + +
    + Click to see more! + +Because you selected a production install you may select the services to be +included in this next step: + +
    user@computer:~/nodecg$ nodecg-io install
    +Installing nodecg-io...
    +Detected nodecg installation at /home/user/nodecg.
    +? Which version do you want to install? 0.1
    +? Which services do you want to use? (Press <space> to select, <a> to toggle all,
    +<i> to invert selection, and <enter> to proceed)
    +❯◯ ahk
    + ◯ android
    + ◯ curseforge
    + ◯ discord
    + ◯ intellij
    + ◯ irc
    + ◯ midi-input
    +(Move up and down to reveal more choices)
    + +If you want to every change your nodecg-io installation to add/remove a service +or change the version, you can always re-run `nodecg-io install`. If a nodecg-io +installation is found, its options will be preselected in the prompt. Re-running +`nodecg-io install` will also update all packages to the latest patch version. + +
    + +### Development install + +
    + Click to see more! + +Because you selected a production install you may select to use the samples and +documentation to be included in these next steps: + +
    user@computer:~/nodecg$ nodecg-io install
    +Installing nodecg-io...
    +Detected nodecg installation at /home/user/nodecg.
    +? Which version do you want to install? development
    +? Would you like to use the provided samples? (y/N) 
    + +
    user@computer:~/nodecg$ nodecg-io install
    +Installing nodecg-io...
    +Detected nodecg installation at /home/user/nodecg.
    +? Which version do you want to install? development
    +? Would you like to use the provided samples? No
    +? Would you like to clone the documentation? (y/N) 
    + +If you want to every change your nodecg-io installation to add/remove a service +or change the version, you can always re-run `nodecg-io install`. If a nodecg-io +installation is found, its options will be preselected in the prompt. Re-running +`nodecg-io install` will also pull the repository and rebuild it. + +
    + +### Continue reading + +There are many example bundles premade for most services, so you may take a look +at the +[“Try an included sample”](../getting_started/try_example_bundle.md)-Guide (It +will also tell you how to start NodeCG, log in and how to use the GUI). Or you +could directly take a deep dive into our framework and either +[create a new bundle](./create_new_bundle.md) or +[integrate an existing bundle](./existing_bundle.md). There are other bundles +using nodecg-io, witch you could try, so may take a look around GitHub or +GitLab. ## Uninstall nodecg-io @@ -97,4 +188,5 @@ If you want to uninstall nodecg-io you can run the following command: nodecg-io uninstall ``` -This will remove the `nodecg-io` directory inside your NodeCG installation and also will remove it from the loaded bundle paths in your NodeCG configuration. +This will remove the `nodecg-io` directory inside your NodeCG installation and +also will remove it from the loaded bundle paths in your NodeCG configuration. diff --git a/docs/getting_started/try_example_bundle.md b/docs/getting_started/try_example_bundle.md index 8c762d80..d57abe3a 100644 --- a/docs/getting_started/try_example_bundle.md +++ b/docs/getting_started/try_example_bundle.md @@ -3,50 +3,17 @@ Trying one of the premade example bundles is a good way to get to know the framework and especially the selected service. -## Step 1: Installing the Sample - -If you installed **dev** branch or cloned nodecg-io directly from GitHub all the -samples should be already installed (you can move to step 2). In case you -installed the **production** branch of nodecg-io, you may have to download the -sample before you can use it. Installing and uninstalling of sample bundles can be done with the nodecg-io -CLI. This can be done as follows. - -Run this command inside your NodeCG folder: - -```shell -$ nodecg-io install -Installing nodecg-io... -``` - -You will be presented with a pair of options: - - - -1. You can select the version of nodecg-io to install. **Select the version that is already installed here.** (Since this is not the migration guide) -
    user@computer:~/nodecg$ nodecg-io install
    -   Installing nodecg-io...
    -   Detected nodecg installation at /home/user/nodecg.
    -   ? Which version do you want to install?  (Use arrow keys) 
    -     development 
    -   ❯ 0.1
    -2. You can select the sample bundles to be included. **Select the sample(s) you want to try here.** -
    user@computer:~/nodecg$ nodecg-io install
    -   Installing nodecg-io...
    -   Detected nodecg installation at /home/user/nodecg.
    -   ? Which version do you want to install? 0.1
    -   ? Which services do you want to use? (Press <space> to select, <a> to toggle all, <i> to invert selection, and <enter> to proceed)
    -   ❯◯ ahk
    -    ◯ android
    -    ◯ curseforge
    -    ◯ discord
    -    ◯ intellij
    -    ◯ irc
    -    ◯ midi-input
    -   (Move up and down to reveal more choices)
    - - - -## Step 2: Run NodeCG +> In case you installed the **production** branch of nodecg-io, you are out of +> luck. Because the build process will cause problems if you just take one of +> the samples and rebuild elsewhere. + +If you installed **dev** branch via the `nodecg-io-cli` and did not select the +“use the samples”-option run `nodecg-io install` and select it. + +In case you cloned the repository directly from GitHub, everything should be +included. But you may want to pull recent changes and rebuild the project. + +## Step 1: Run NodeCG Now you need to start NodeCG. There are a couple of different ways to do this: @@ -73,9 +40,10 @@ info: [nodecg-io-core] Minzig! info: [nodecg/lib/server] NodeCG running on http://localhost:9090
    -Now you can open the NodeCG dashboard (by default) under . +Now you can open the NodeCG dashboard (by default) under +. -## Step 3: Log in to nodecg-io +## Step 2: Log in to nodecg-io Now navigate to the `nodecg-io` tab in the NodeCG dashboard. @@ -89,7 +57,7 @@ Now you are looking at the `nodecg-io` config menu. It should look like this: ![`nodcg-io` config menu](../assets/nodcg-io-dashboard.png) -## Step 4: Learning how to use the GUI +## Step 3: Learning how to use the GUI The current GUI is just intended to make the project usable, but it is not very user-friendly. As a more long term solution, a new GUI will be developed that @@ -100,9 +68,8 @@ to arrange yourself with this one. So, to get started: ### In pink: NodeCG Tabs -Here you will find every NodeCG-bundle that has a dashboard. Here you may -select the [`nodecg-io-debug`](../samples/debug.md)-dashboard, if it is -installed. +Here you will find every NodeCG-bundle that has a dashboard. Here you may select +the [`nodecg-io-debug`](../samples/debug.md)-dashboard, if it is installed. ### In yellow: Monaco editor @@ -119,8 +86,8 @@ _Creating a new service instance_: This can be accomplished by selecting the item `'New'`. Then a new dropdown will be revealed, in witch you may select the service type. Additionally, you must -select an instance name. Then click `'Create'`. The newly created instance should -be selected. +select an instance name. Then click `'Create'`. The newly created instance +should be selected. _Configure a service instance_: @@ -149,8 +116,9 @@ to none, effectively removing the access to every service from all bundles. **Caution**: This can not be undone, and you will have to set up all the bundles again. _The service instances will be unaffected._ -## Step 5: Configure the sample +## Step 4: Configure the sample -The configurations for every sample bundle differ too greatly from each other to be included here, -so you have to take a look at the documentation for your sample bundle. You will -find it on the left-hand side of this page in the category `Services`. +The configurations for every sample bundle differ too greatly from each other to +be included here, so you have to take a look at the documentation for your +sample bundle. You will find it on the left-hand side of this page in the +category `Services`. diff --git a/mkdocs.yml b/mkdocs.yml index 58c673b3..4c30b4d0 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -38,7 +38,7 @@ nav: - Home: index.md - Getting Started: - Installation: getting_started/install.md - - Using a sample bunndle: getting_started/try_example_bundle.md + - Using a sample bundle: getting_started/try_example_bundle.md - Your first bundle: getting_started/create_new_bundle.md - Migrating an existing bundle: getting_started/existing_bundle.md - Configuration: getting_started/configuration.md From a7ae69fa44c7823e3ffc9cba4694416d42dd8bb0 Mon Sep 17 00:00:00 2001 From: Tim_Tech_Dev Date: Fri, 29 Oct 2021 22:52:37 +0200 Subject: [PATCH 4/4] Simplify the sample bundles even further - Remove mentions of monaco & automatic selection - Revise descriptions of setting dependencies in the GUI Tim Signed-off-by: Tim_Tech_Dev --- docs/samples/ahk.md | 11 +++------ docs/samples/android.md | 11 ++++----- docs/samples/artnet.md | 23 ++++++----------- docs/samples/curseforge.md | 10 +++----- docs/samples/dbus-ratbagd.md | 28 ++++++++------------- docs/samples/debug.md | 9 +++---- docs/samples/discord-rpc.md | 23 ++++++----------- docs/samples/discord.md | 20 ++++++--------- docs/samples/github.md | 20 ++++++--------- docs/samples/gsheets.md | 21 ++++++---------- docs/samples/intellij.md | 17 ++++--------- docs/samples/irc.md | 21 +++++----------- docs/samples/midi-input.md | 32 +++++++++--------------- docs/samples/midi-io.md | 42 +++++++++----------------------- docs/samples/midi-output.md | 31 +++++++++-------------- docs/samples/mqtt-client.md | 12 +++------ docs/samples/nanoleaf.md | 22 +++++------------ docs/samples/obs.md | 18 ++++---------- docs/samples/philipshue.md | 19 +++++---------- docs/samples/rcon.md | 12 +++------ docs/samples/reddit.md | 19 ++++----------- docs/samples/sacn-receiver.md | 20 ++++----------- docs/samples/sacn-sender.md | 20 ++++----------- docs/samples/serial.md | 20 +++++---------- docs/samples/shlink.md | 19 ++++----------- docs/samples/slack.md | 18 ++++---------- docs/samples/spotify.md | 19 ++++----------- docs/samples/sql.md | 20 +++++---------- docs/samples/streamdeck.md | 9 +++---- docs/samples/streamelements.md | 20 ++++----------- docs/samples/telegram.md | 12 +++------ docs/samples/tiane.md | 22 +++++------------ docs/samples/twitch-addons.md | 20 ++++----------- docs/samples/twitch-api.md | 20 ++++----------- docs/samples/twitch-chat.md | 20 ++++----------- docs/samples/twitch-pubsub.md | 20 ++++----------- docs/samples/twitter.md | 19 ++++----------- docs/samples/websocket-client.md | 10 +++----- docs/samples/websocket-server.md | 13 ++++------ docs/samples/xdotool.md | 12 +++------ docs/samples/youtube.md | 20 ++++----------- 41 files changed, 233 insertions(+), 541 deletions(-) diff --git a/docs/samples/ahk.md b/docs/samples/ahk.md index e5ebc8ea..af6963aa 100644 --- a/docs/samples/ahk.md +++ b/docs/samples/ahk.md @@ -17,11 +17,8 @@ will also tell you how to log in and how to use the GUI. ### Configure the AutoHotkey sample bundle -1. In NodeCG, create a new ahk service instance using the left upper menu. -2. Enter the host and port of the HotkeylessAHK Server. - The created instance should be automatically selected, if not select it in - the upper left menu. Enter your host and port in monaco (the text-editor on - the right) in this format: +1. In NodeCG, create a new ahk service instance. +2. Enter the host and port of the HotkeylessAHK Server: ```json { @@ -32,6 +29,6 @@ will also tell you how to log in and how to use the GUI. After entering it, click save. -3. Set the created ahk service instance to the service dependency of the ahk - bundle. +3. Set the sample's (`ahk-sendcommand`) dependency to be the newly created + service instance (of type `ahk`). 4. A small window with the text “Hello World” should have popped up. diff --git a/docs/samples/android.md b/docs/samples/android.md index eebb0729..2e47e033 100644 --- a/docs/samples/android.md +++ b/docs/samples/android.md @@ -40,7 +40,7 @@ will also tell you how to log in and how to use the GUI. The hexadecimal number in the first column is your device ID. You'll need this later. -10. In NodeCG, create a new android service instance using the left upper menu. +10. In NodeCG, create a new android service instance. 11. Enter the following: ```json @@ -51,9 +51,8 @@ will also tell you how to log in and how to use the GUI. Replace `device_id` with your device ID. -12. Set the created android service instance to the service dependency of the - android sample bundle. - Select the android bundle and the android service in the left bottom menu. - Then select the service instance that should be used by the android sample - bundle (in this case the name of the previously created android instance). + After entering it, click save. + +12. Set the sample's (`android`) dependency to be the newly created service + instance (of type `android`). 13. You should see that WLAN is now activated on your device. diff --git a/docs/samples/artnet.md b/docs/samples/artnet.md index e6837834..21d50d84 100644 --- a/docs/samples/artnet.md +++ b/docs/samples/artnet.md @@ -21,12 +21,8 @@ will also tell you how to log in and how to use the GUI. ### Configure the Art-Net sample bundle -1. In NodeCG, create a new Art-Net service instance using the left upper menu. -2. Enter the needed option. - - The created instance should be automatically selected, if not select it in - the upper left dropdown. Enter your universe in monaco (the text-editor on - the right) in this format: +1. In NodeCG, create a new Art-Net service instance. +2. Enter the host to witch the service should broadcast: **Host** @@ -38,19 +34,14 @@ will also tell you how to log in and how to use the GUI. } ``` - After entering it, click save. + After entering it, click save. + You may overwrite this broadcast address in code with `client.bind("host address");`. -3. Set the created Art-Net service instance to the service dependency of the - artnet-console bundle. - Select the artnet-console bundle and the Art-Net service in the left bottom - dropdown and then select the service instance that should be used by the - artnet-console bundle (in this case the name of the previously created - Art-Net instance). - -4. Check the NodeCG logs - You should see data logged. +3. Set the sample's (`artnet-console`) dependency to be the newly created + service instance (of type `artnet`). +4. Check the NodeCG logs. You should see data logged. ### Explanations diff --git a/docs/samples/curseforge.md b/docs/samples/curseforge.md index 955f7926..cdc01b74 100644 --- a/docs/samples/curseforge.md +++ b/docs/samples/curseforge.md @@ -14,11 +14,7 @@ will also tell you how to log in and how to use the GUI. ### Configure the CurseForge bundle -1. In NodeCG, create a new CurseForge service instance using the left upper - menu. -2. Set the CurseForge service instance to the service dependency of the - CurseForge bundle. Select the CurseForge bundle and the CurseForge service in - the left bottom menu. Then select the service instance that should be used by - the CurseForge bundle (in this case the name of the previously created - CurseForge instance). +1. In NodeCG, create a new CurseForge service instance. +2. Set the sample's (`curseforge`) dependency to be the newly created service + instance (of type `curseforge`). 3. Check the NodeCG logs. You should see two lists of add-ons. diff --git a/docs/samples/dbus-ratbagd.md b/docs/samples/dbus-ratbagd.md index 28c3d4a3..1756ab0b 100644 --- a/docs/samples/dbus-ratbagd.md +++ b/docs/samples/dbus-ratbagd.md @@ -18,23 +18,15 @@ will also tell you how to log in and how to use the GUI. ### Configure the DBus ratbagd sample bundle -1. In NodeCG, create a new D-Bus service instance using the left upper menu. +1. In NodeCG, create a new D-Bus service instance. 2. Configure the D-Bus service There should not be any additional configuration needed for the D-Bus - service. Just enter an empty JSON object like this: - - ```json - {} - ``` - - After entering it, click save. - -3. Set the created D-Bus service instance to the service dependency of the - `dbus-ratbagd` bundle. - Select the `dbus-ratbagd` bundle and the D-Bus service in the left bottom - menu. Then select the service instance that should be used by the - `dbus-ratbagd` sample bundle (in this case the name of the previously created - D-Bus instance). -4. Check the NodeCG logs - You should see an error or a success message and a list of connected device - names. + service. + +3. Set the sample's (`dbus-ratbagd`) dependency to be the newly created service + instance (of type `dbus`). + +4. Check the NodeCG logs: + + You should see an error or a success message and a list of connected device + names. diff --git a/docs/samples/debug.md b/docs/samples/debug.md index 2da433c9..267bb432 100644 --- a/docs/samples/debug.md +++ b/docs/samples/debug.md @@ -14,12 +14,9 @@ will also tell you how to log in and how to use the GUI. ### Configure the Debug sample bundle -1. In NodeCG, create a new Debug service instance using the left upper menu. -2. Set the Debug service instance to the service dependency of the Debug sample - bundle. Select the Debug sample bundle and the Debug service in the left - bottom menu. Then select the service instance that should be used by the - Debug sample bundle (in this case the name of the previously created Debug - instance). +1. In NodeCG, create a new Debug service instance. +2. Set the sample's (`debug`) dependency to be the newly created service + instance (of type `debug`). 3. Go to the nodecg-io-debug dashboard and use some buttons or other inputs. 4. Check the NodeCG log. It should contain a message for each action you did and the passed values. diff --git a/docs/samples/discord-rpc.md b/docs/samples/discord-rpc.md index ab1e8d36..29540fe5 100644 --- a/docs/samples/discord-rpc.md +++ b/docs/samples/discord-rpc.md @@ -21,12 +21,8 @@ _Note:_ If you don't have an application yet, you can create one ### Configure the Discord RPC sample bundle -1. In NodeCG, create a new `discord-rpc` service instance using the left upper - menu. -2. Enter required information. - The created instance should be automatically selected, if not select it in - the upper left menu. Enter your information in monaco (the text-editor on the - right) in this format: +1. In NodeCG, create a new `discord-rpc` service instance. +2. Enter the `clientId` and `clientSecret` for the service: ```json { @@ -37,12 +33,9 @@ _Note:_ If you don't have an application yet, you can create one After entering it, click save. -3. Set the created `discord-rpc` service instance to the service dependency of - the `discord-rpc` bundle. - Select the `discord-rpc` bundle and the `discord-rpc` service in the left - bottom menu. Then select the service instance that should be used by the - `discord-rpc` sample bundle (in this case the name of the previously created - `discord-rpc` instance). -4. Check the NodeCG logs - You should see an error or a success message displaying your discord - username. +3. Set the sample's (`discord-rpc`) dependency to be the newly created service + instance (of type `discord-rpc`). +4. Check the NodeCG logs: + + You should see an error or a success message displaying your discord + username. diff --git a/docs/samples/discord.md b/docs/samples/discord.md index 4ec1c349..008fe712 100644 --- a/docs/samples/discord.md +++ b/docs/samples/discord.md @@ -22,11 +22,8 @@ guide. ### Configure the Discord sample bundle -1. In NodeCG, create a new discord service instance using the left upper menu. -2. Enter your bot token. - The created instance should be automatically selected, if not select it in - the upper left menu. Enter your Bot token in monaco (the text-editor on the - right) in this format: +1. In NodeCG, create a new discord service instance. +2. Enter your bot token: ```json { @@ -36,11 +33,8 @@ guide. After entering it, click save. -3. Set the created discord service instance to the service dependency of the - Discord-guild-chat bundle. - Select the Discord-guild-chat bundle and the Discord service in the left - bottom menu. Then select the service instance that should be used by the - Discord-guild-chat bundle (in this case the name of the previously created - discord instance). -4. Check the NodeCG logs. - You should see an error or a Login message. +3. Set the sample's (`discord-guild-chat`) dependency to be the newly created + service instance (of type `discord`). +4. Check the NodeCG logs: + + You should see an error or a Login message. diff --git a/docs/samples/github.md b/docs/samples/github.md index ae51f86c..0c1a5f48 100644 --- a/docs/samples/github.md +++ b/docs/samples/github.md @@ -21,11 +21,8 @@ _Note:_ If you don't have a token yet, you can create one ### Configure the GitHub sample bundle -1. In NodeCG, create a new GitHub service instance using the left upper menu. -2. Enter the GitHub token. - The created instance should be automatically selected, if not select it in - the upper left menu. Enter your GitHub token in monaco (the text-editor on - the right) in this format: +1. In NodeCG, create a new GitHub service instance. +2. Enter the GitHub token: ```json { @@ -35,12 +32,9 @@ _Note:_ If you don't have a token yet, you can create one After entering it, click save. -3. Set the created GitHub service instance to the service dependency of the - GitHub bundle. - Select the GitHub bundle and the GitHub service in the left bottom menu. Then - select the service instance that should be used by the GitHub sample bundle - (in this case the name of the previously created GitHub instance). +3. Set the sample's (`github`) dependency to be the newly created service + instance (of type `github`). +4. Check the NodeCG logs: -4. Check the NodeCG logs - You should see an error or a success message and a list of all your - repositories. + You should see an error or a success message and a list of all your + repositories. diff --git a/docs/samples/gsheets.md b/docs/samples/gsheets.md index 4f4a6a55..2205fe0c 100644 --- a/docs/samples/gsheets.md +++ b/docs/samples/gsheets.md @@ -25,12 +25,8 @@ As the redirect URI add ### Configure the gsheets sample bundle -1. In NodeCG, create a new googleapis service instance using the left upper - menu. -2. Enter credentials for googleapis. - The created instance should be automatically selected, if not select it in - the upper left menu. Enter your gsheets OAuth credentials in monaco (the - text-editor on the right) in this format: +1. In NodeCG, create a new googleapis service instance. +2. Enter the credentials for googleapis: ```json { @@ -45,12 +41,9 @@ As the redirect URI add _Note:_ You can add multiple scopes if the googleapis instance is used for multiple bundles. -3. Set the created googleapis service instance to the service dependency of the - gsheets bundle. - Select the gsheets bundle and the googleapis service in the left bottom menu. - Then select the service instance that should be used by the gsheets bundle - (in this case the name of the previously created googleapis instance). +3. Set the sample's (`gsheets`) dependency to be the newly created service + instance (of type `googleapis`). +4. Check the NodeCG logs: -4. Check the NodeCG logs - You should see an error or a success message that is hardcoded in - `samples/gsheets/extension/index.ts`. + You should see an error or a success message that is hardcoded in + `samples/gsheets/extension/index.ts`. diff --git a/docs/samples/intellij.md b/docs/samples/intellij.md index 5a54a53f..c93325ea 100644 --- a/docs/samples/intellij.md +++ b/docs/samples/intellij.md @@ -27,9 +27,8 @@ will also tell you how to log in and how to use the GUI. ### Configure the IntelliJ sample bundle -1. In NodeCG, create a new IntelliJ service instance using the left upper menu. - -2. Enter the following +1. In NodeCG, create a new IntelliJ service instance. +2. Enter the host and port of your IDE's HTTP server: ``` { @@ -42,15 +41,9 @@ will also tell you how to log in and how to use the GUI. guidelines [here](https://github.com/noeppi-noeppi/nodecg-io-intellij/blob/master/README.md). -3. Set the created IntelliJ service instance to the service dependency of the - sample-intellij bundle. - - Select the sample-intellij bundle and the IntelliJ service in the left - bottom menu. Then select the service instance that should be used by the - sample-intellij bundle (in this case the name of the previously created - IntelliJ instance). - -4. Check the NodeCG logs +3. Set the sample's (`intellij-integration`) dependency to be the newly created + service instance (of type `intellij`). +4. Check the NodeCG logs: You should see an error or a list of all plugins installed at your IDE including the preinstalled ones by JetBrains. diff --git a/docs/samples/irc.md b/docs/samples/irc.md index 35158480..8f57af26 100644 --- a/docs/samples/irc.md +++ b/docs/samples/irc.md @@ -13,13 +13,9 @@ will also tell you how to log in and how to use the GUI. ### Configure the IRC sample bundle -1. In NodeCG, create a new IRC service instance using the left upper menu. - -2. Enter credentials for IRC. - - The created instance should be automatically selected, if not select it in - the upper left menu. In this example we will "anonymously" connect to the - twitch IRC chat. Enter the config in this format: +1. In NodeCG, create a new IRC service instance. +2. Enter the credentials for IRC. In this example we will “anonymously” connect + to the twitch IRC chat. Enter the host, port, and nick in this format: ```json { @@ -33,14 +29,9 @@ will also tell you how to log in and how to use the GUI. After entering it, click save. -3. Set the created IRC service instance to the service dependency of the IRC - sample bundle. - - Select the IRC sample bundle and the IRC service in the left bottom menu. - Then select the service instance that should be used by the IRC sample - bundle (in this case the name of the previously created IRC instance). - -4. Check the NodeCG logs +3. Set the sample's (`irc`) dependency to be the newly created service instance + (of type `irc`). +4. Check the NodeCG logs: You should see an error or a success message and all twitch messages that are written in the twitch channel that is hardcoded in diff --git a/docs/samples/midi-input.md b/docs/samples/midi-input.md index 7f8cddec..b86d4239 100644 --- a/docs/samples/midi-input.md +++ b/docs/samples/midi-input.md @@ -17,14 +17,9 @@ will also tell you how to log in and how to use the GUI. ### Configure the midi-input sample bundle -1. In NodeCG, create a new midi-input service instance using the left upper - menu. +1. In NodeCG, create a new midi-input service instance. -2. Enter your device information - - The created instance should be automatically selected, if not select it in - the upper left menu. Enter the name of your device in monaco (the - text-editor on the right) in this format: +2. Enter your device information: ```json { @@ -32,25 +27,20 @@ will also tell you how to log in and how to use the GUI. } ``` - After entering it, click save. **Note:** A script is provided to list all - inputs and outputs. It can be run from the sample directory - `samples/midi-input` using the command `npm run list`. The devices should be - listed with their device names and some other stuff. Under Linux this looks - for example like this: + After entering it, click save. + **Note:** A script is provided to list all inputs and outputs. It can be run + from the sample directory `samples/midi-input` using the command + `npm run list`. The devices should be listed with their device names and + some other stuff. + Under Linux this looks for example like this: ``` nanoKONTROL2:nanoKONTROL2 MIDI 1 28:0 ``` -3. Set the created midi-input service instance to the service dependency of the - midi-input sample bundle. - - Select the midi-input bundle and the midi-input service in the left bottom - menu. Then select the service instance that should be used by the midi-input - bundle (in this case the name of the previously created midi-input - instance). - -4. Check the NodeCG logs +3. Set the sample's (`midi-input`) dependency to be the newly created service + instance (of type `midi-input`). +4. Check the NodeCG logs: You should see an error or a success message and all midi messages that are sent by the device that is configured. diff --git a/docs/samples/midi-io.md b/docs/samples/midi-io.md index 925d84b1..8bdf9924 100644 --- a/docs/samples/midi-io.md +++ b/docs/samples/midi-io.md @@ -17,14 +17,9 @@ will also tell you how to log in and how to use the GUI. ### Configure the midi-io sample bundle -1. In NodeCG, create a new midi-input service instance using the left upper - menu. +1. In NodeCG, create a new midi-input service instance. -2. Enter your device information - - The created instance should be automatically selected, if not select it in - the upper left menu. Enter the name of your device in monaco (the - text-editor on the right) in this format: +2. Enter your device information: ```json { @@ -32,11 +27,12 @@ will also tell you how to log in and how to use the GUI. } ``` - After entering it, click save. **Note:** A script is provided to list all - inputs and outputs. It can be run from the sample directory - `samples/midi-io` using the command `npm run list`. The devices should be - listed with their device names and some other stuff. Under Linux this looks - for example like this: + After entering it, click save. + **Note:** A script is provided to list all inputs and outputs. It can be run + from the sample directory `samples/midi-io` using the command + `npm run list`. The devices should be listed with their device names and + some other stuff. + Under Linux this looks for example like this: ``` nanoKONTROL2:nanoKONTROL2 MIDI 1 28:0 @@ -44,26 +40,10 @@ will also tell you how to log in and how to use the GUI. 3. Create a new midi-output service instance using the left upper menu. -4. Repeat step 5 for your midi-output service. In most cases you want to use the - same device for input and output. - -5. Set the created midi-output service instance to the service dependency of the - midi-io sample bundle. - - Select the midi-io bundle and the midi-output service in the left bottom - menu. Then select the service instance that should be used by the midi-io - bundle (in this case the name of the previously created midi-output - instance). - -6. Set the created midi-input service instance to the service dependency of the - midi-io sample bundle. - - Select the midi-io bundle and the midi-input service in the left bottom - menu. Then select the service instance that should be used by the midi-io - bundle (in this case the name of the previously created midi-input - instance). +4. Set the sample's (`midi-io`) dependencies to be the newly created service + instances (of type `midi-input` & `midi-output`). -7. Check the NodeCG logs +5. Check the NodeCG logs: You should see an error or a success message and midi messages that are received and echoed back to the device that is configured. The messages are diff --git a/docs/samples/midi-output.md b/docs/samples/midi-output.md index 8ea861b9..788c4c77 100644 --- a/docs/samples/midi-output.md +++ b/docs/samples/midi-output.md @@ -17,14 +17,9 @@ will also tell you how to log in and how to use the GUI. ### Configure the midi-output sample bundle -1. In NodeCG, create a new midi-output service instance using the left upper - menu. +1. In NodeCG, create a new midi-output service instance. -2. Enter your device information - - The created instance should be automatically selected, if not select it in - the upper left menu. Enter the name of your device in monaco (the - text-editor on the right) in this format: +2. Enter your device information: ```json { @@ -32,25 +27,21 @@ will also tell you how to log in and how to use the GUI. } ``` - After entering it, click save. **Note:** A script is provided to list all - inputs and outputs. It can be run from the sample directory - `samples/midi-output` using the command `npm run list`. The devices should - be listed with their device names and some other stuff. Under Linux this - looks for example like this: + After entering it, click save. + **Note:** A script is provided to list all inputs and outputs. It can be run + from the sample directory `samples/midi-output` using the command + `npm run list`. The devices should be listed with their device names and + some other stuff. + Under Linux this looks for example like this: ``` nanoKONTROL2:nanoKONTROL2 MIDI 1 28:0 ``` -3. Set the created midi-output service instance to the service dependency of the - midi-output sample bundle. - - Select the midi-output bundle and the midi-output service in the left bottom - menu. Then select the service instance that should be used by the - midi-output bundle (in this case the name of the previously created - midi-output instance). +3. Set the sample's (`midi-output`) dependency to be the newly created service + instance (of type `midi-output`). -4. Check the NodeCG logs +4. Check the NodeCG logs: You should see an error or a success message and random midi messages should be sent to the device that is configured. The messages are only `Noteon` diff --git a/docs/samples/mqtt-client.md b/docs/samples/mqtt-client.md index b6560edc..a22be8ca 100644 --- a/docs/samples/mqtt-client.md +++ b/docs/samples/mqtt-client.md @@ -18,18 +18,14 @@ will also tell you how to log in and how to use the GUI. ### Configure the MQTT-client sample bundle -1. In NodeCG, create a new mqtt-client service instance using the left upper - menu. +1. In NodeCG, create a new mqtt-client service instance. 2. Enter the connection parameters of the mqtt server. The URL should be in following the pattern `://
    :`. Allowed protocols are: `mqtt`, `mqtts`, `tcp`, `tls`, `ws`, `wss`. In case your server needs authentication, set the `username` and `password` - fields otherwise remove them from the configuration. The created instance - should be automatically selected, if not select it in the upper left menu. - Enter your configuration in monaco (the text-editor on the right) in this - format: + fields otherwise remove them from the configuration: ```json { @@ -42,7 +38,7 @@ will also tell you how to log in and how to use the GUI. After entering it, click save. -3. Set the created mqtt-client service instance to the service dependency of the - mqtt-client bundle. +3. Set the sample's (`mqtt-client`) dependency to be the newly created service + instance (of type `mqtt-client`). 4. The console should display if the connection was successfully established and should show inbound messages on the subscribed topic. diff --git a/docs/samples/nanoleaf.md b/docs/samples/nanoleaf.md index 15952187..3ee86236 100644 --- a/docs/samples/nanoleaf.md +++ b/docs/samples/nanoleaf.md @@ -18,13 +18,9 @@ will also tell you how to log in and how to use the GUI. ### Configure the nanoleaf sample bundle -1. In NodeCG, create a new nanoleaf service instance using the left upper menu. +1. In NodeCG, create a new nanoleaf service instance. -2. Enter configuration. - - The created instance should be automatically selected, if not select it in - the upper left menu. Enter your nanoleaf controller IP address in this - format (change the IP accordingly): +2. Enter the IP address of your nanoleaf controller: ```json { @@ -37,14 +33,8 @@ will also tell you how to log in and how to use the GUI. After entering your config and entering pairing mode, click save. -3. Set the created nanoleaf service instance to the service dependency of the - nanoleaf sample bundle. - - Select the nanoleaf sample bundle and the nanoleaf service in the left - bottom menu. Then select the service instance that should be used by the - nanoleaf sample bundle (in this case the name of the previously created - nanoleaf instance). - -4. If everything worked, your nanoleafs should now shine orange. +3. Set the sample's (`nanoleaf`) dependency to be the newly created service + instance (of type `nanoleaf`). - If not you should check the NodeCG logs for any errors. +4. If everything worked, your nanoleafs should now shine orange. + If not you should check the NodeCG logs for any errors. diff --git a/docs/samples/obs.md b/docs/samples/obs.md index 75d2af41..32a7347d 100644 --- a/docs/samples/obs.md +++ b/docs/samples/obs.md @@ -22,13 +22,9 @@ obs-websocket with install instructions is available ### Configure the OBS sample bundle -1. In NodeCG, create a new obs service instance using the left upper menu. +1. In NodeCG, create a new obs service instance. -2. Enter configuration for obs. - - The created instance should be automatically selected, if not select it in - the upper left menu. Enter your obs-websocket connection information in - monaco (the text-editor on the right) in this format: +2. Enter the configuration for obs: ```json { @@ -43,14 +39,10 @@ obs-websocket with install instructions is available After entering it, click save. -3. Set the created obs service instance to the service dependency of the - obs-scenelist bundle. - - Select the obs-scenelist bundle and the OBS service in the left bottom menu. - Then select the service instance that should be used by the obs-scenelist - bundle (in this case the name of the previously created OBS instance). +3. Set the sample's (`obs-scenelist`) dependency to be the newly created service + instance (of type `obs`). -4. Check the NodeCG logs +4. Check the NodeCG logs: You should see an error or a success message and the names of all you scenes that you have set in OBS. diff --git a/docs/samples/philipshue.md b/docs/samples/philipshue.md index b0d2276c..482a4e9d 100644 --- a/docs/samples/philipshue.md +++ b/docs/samples/philipshue.md @@ -18,14 +18,12 @@ will also tell you how to log in and how to use the GUI. ### Configure the Philips Hue sample bundle -1. In NodeCG, create a new Philips Hue service instance using the left upper - menu. +1. In NodeCG, create a new Philips Hue service instance. 2. Enter configuration for hue. - The created instance should be automatically selected, if not select it in - the upper left menu. If you want the bridge to be automatically discovered - just set `discover` to true like this: + If you want the bridge to be automatically discovered just set `discover` to + true like this: ```json { @@ -50,15 +48,10 @@ will also tell you how to log in and how to use the GUI. API key which will be saved so that you only need to press the link button when you connect it for the first time. -3. Set the created Philips Hue service instance to the service dependency of the - philipshue-lights sample bundle. +3. Set the sample's (`philipshue-lights`) dependency to be the newly created + service instance (of type `philipshue`). - Select the philipshue-lights sample bundle and the Philips Hue service in - the left bottom menu. Then select the service instance that should be used - by the philipshue-lights sample bundle (in this case the name of the - previously created Philips Hue instance). - -4. Check the NodeCG logs +4. Check the NodeCG logs: You should see an error or a success message and the number of lights that the bridge knows of. diff --git a/docs/samples/rcon.md b/docs/samples/rcon.md index 0b8097c8..7946c06f 100644 --- a/docs/samples/rcon.md +++ b/docs/samples/rcon.md @@ -17,14 +17,10 @@ will also tell you how to log in and how to use the GUI. ### Configure the rcon sample bundle -1. In NodeCG, create a new rcon service instance using the left upper menu. +1. In NodeCG, create a new rcon service instance. 2. Enter the host, port, and password of the rcon connection. This can be found - in the `server.properties` file (`rcon.port`, `rcon.password`) - - The created instance should be automatically selected, if not select it in - the upper left menu. Enter your host and port in monaco (the text-editor on - the right) in this format: + in the `server.properties` file (`rcon.port`, `rcon.password`): ```json { @@ -36,8 +32,8 @@ will also tell you how to log in and how to use the GUI. After entering it, click save. -3. Set the created rcon service instance to the service dependency of the - rcon-minecraft bundle. +3. Set the sample's (`rcon-minecraft`) dependency to be the newly created + service instance (of type `rcon`). 4. In the NodeCG console you will see a list with all online players. It will also send a /say command to the Minecraft server. diff --git a/docs/samples/reddit.md b/docs/samples/reddit.md index 47a24bbd..08609f7c 100644 --- a/docs/samples/reddit.md +++ b/docs/samples/reddit.md @@ -20,15 +20,11 @@ _Note:_ If you don't have such an application yet, you can get one ### Configure the Reddit sample bundle -1. In NodeCG, create a new Reddit service instance using the left upper menu. +1. In NodeCG, create a new Reddit service instance. 2. Enter your applications ID and secret and your own username and password. The entered username and password must be for the user who registered the - application. - - The created instance should be automatically selected, if not select it in - the upper left menu. Enter your data in monaco (the text-editor on the - right) in this format: + application: ```json { @@ -41,14 +37,9 @@ _Note:_ If you don't have such an application yet, you can get one After entering it, click save. -3. Set the created Reddit service instance to the service dependency of the - reddit-message-read bundle. - - Select the reddit-message-read bundle and the Reddit service in the left - bottom menu. Then select the service instance that should be used by the - reddit-message-read bundle (in this case the name of the previously created - Reddit instance). +3. Set the sample's (`reddit-msg-read`) dependency to be the newly created + service instance (of type `reddit`). -4. Check the NodeCG logs +4. Check the NodeCG logs: You should see the recent posts in `r/skate702` diff --git a/docs/samples/sacn-receiver.md b/docs/samples/sacn-receiver.md index 2cf2ba08..849ae446 100644 --- a/docs/samples/sacn-receiver.md +++ b/docs/samples/sacn-receiver.md @@ -18,13 +18,8 @@ will also tell you how to log in and how to use the GUI. ### Configure the sACN sample bundle -1. In NodeCG, create a new sacn-receiver service instance using the left upper - menu. -2. Enter the needed options. - - The created instance should be automatically selected, if not select it in - the upper left menu. Enter your Bot token in monaco (the text-editor on the - right) in this format: +1. In NodeCG, create a new sacn-receiver service instance. +2. Enter the needed options: **Universes** @@ -71,14 +66,9 @@ will also tell you how to log in and how to use the GUI. After entering them, click save. -3. Set the created sacn-receiver service instance to the service dependency of - the sacn-receiver-sample bundle. - - Select the sacn-receiver-sample bundle and the sacn-receiver service in the - left bottom menu. Then select the service instance that should be used by - the sacn-receiver-sample bundle (in this case the name of the previously - created sACN instance). +3. Set the sample's (`sacn-receiver-sample`) dependency to be the newly created + service instance (of type `sacn-receiver`). -4. Check the NodeCG logs +4. Check the NodeCG logs: You should see data logged. diff --git a/docs/samples/sacn-sender.md b/docs/samples/sacn-sender.md index abf9932f..b0cc16b8 100644 --- a/docs/samples/sacn-sender.md +++ b/docs/samples/sacn-sender.md @@ -18,13 +18,8 @@ will also tell you how to log in and how to use the GUI. ### Configure the sACN sample bundle -1. In NodeCG, create a new sacn-sender service instance using the left upper - menu. -2. Enter the needed options. - - The created instance should be automatically selected, if not select it in - the upper left menu. Enter your universe in monaco (the text-editor on the - right) in this format: +1. In NodeCG, create a new sacn-sender service instance. +2. Enter the needed options: **Universes** @@ -60,14 +55,9 @@ will also tell you how to log in and how to use the GUI. After entering them, click save. -3. Set the created sacn-sender service instance to the service dependency of the - sacn-sender bundle. - - Select the sacn-sender bundle and the sacn-sender service in the left bottom - menu. Then select the service instance that should be used by the - sacn-sender bundle (in this case the name of the previously created sACN - instance). +3. Set the sample's (`sacn-sender`) dependency to be the newly created service + instance (of type `sacn-sender`). -4. Check the NodeCG logs +4. Check the NodeCG logs: You should see data logged. diff --git a/docs/samples/serial.md b/docs/samples/serial.md index 91dfc2fe..67965d3f 100644 --- a/docs/samples/serial.md +++ b/docs/samples/serial.md @@ -19,13 +19,9 @@ will also tell you how to log in and how to use the GUI. ### Configure the serial sample bundle -1. In NodeCG, create a new serial service instance using the left upper menu. +1. In NodeCG, create a new serial service instance. -2. Enter the information of your device. - - The created instance should be automatically selected, if not select it in - the upper left menu. Enter the `com port` or other identifying information - in one of these formats: +2. Enter the information of your device: ```json { @@ -50,21 +46,17 @@ will also tell you how to log in and how to use the GUI. devices you might want to use the `pnpId`, since ports can change between reboots! -3. Set the created serial service instance to the service dependency of the - serial bundle. - - Select the serial bundle and the serial service in the left bottom menu. - Then select the service instance that should be used by the serial bundle - (in this case the name of the previously created serial instance). +3. Set the sample's (`serial`) dependency to be the newly created service + instance (of type `serial`). -4. Check the NodeCG logs +4. Check the NodeCG logs: You should see an error or a success message and nodecg-io will send ping to the microcontroller every 10 seconds. The Arduino device will respond with pong. You should see the pong message displayed in the log. If you see an error or nothing at all, try making sure your microcontroller - is plugged in and recognized correctly. Then restart nodecg, so the service + is plugged in and recognized correctly. Then restart NodeCG, so the service is cleanly restarted. ### Sample Arduino sketch diff --git a/docs/samples/shlink.md b/docs/samples/shlink.md index 63e5568e..6adf7def 100644 --- a/docs/samples/shlink.md +++ b/docs/samples/shlink.md @@ -19,12 +19,8 @@ will also tell you how to log in and how to use the GUI. ### Configure the Shlink sample bundle -1. In NodeCG, create a new Shlink service instance using the left upper menu. -2. Enter the configuration for Shlink. - - The created instance should be automatically selected, if not, select it in - the upper left menu. Enter the connection information for the Shlink server - in monaco (the text-editor on the right) in this format: +1. In NodeCG, create a new Shlink service instance. +2. Enter the configuration for Shlink: ```json { @@ -35,15 +31,10 @@ will also tell you how to log in and how to use the GUI. After entering it, click save. -3. Set the created Shlink service instance to the service dependency of the - `shlink-list-short-urls` bundle. - - Select the `shlink-list-short-urls` bundle and the Shlink service in the - left bottom menu. Then select the service instance that should be used by - the `shlink-list-short-urls` bundle (in this case the name of the previously - created Shlink instance). +3. Set the sample's (`shlink-list-short-urls`) dependency to be the newly + created service instance (of type `shlink`). -4. Check the NodeCG logs +4. Check the NodeCG logs: You should see an error or a success message and the amount of configured short URLs on the Shlink server. diff --git a/docs/samples/slack.md b/docs/samples/slack.md index 9ac138f2..6574de51 100644 --- a/docs/samples/slack.md +++ b/docs/samples/slack.md @@ -21,13 +21,9 @@ token on [this](https://app.slack.com/apps-manage/) page. ### Configure the Slack sample bundle -1. In NodeCG, create a new slack service instance using the left upper menu. +1. In NodeCG, create a new slack service instance. -2. Enter your Slack app token. - - The created instance should be automatically selected, if not select it in - the upper left menu. Enter your token in monaco (the text-editor on the - right) in this format: +2. Enter your Slack app token: ```json { @@ -37,13 +33,9 @@ token on [this](https://app.slack.com/apps-manage/) page. After entering it, click save. -3. Set the created slack service instance to the service dependency of the slack - bundle. - - Select the slack bundle and the slack service in the left bottom menu. Then - select the service instance that should be used by the slack bundle (in this - case the name of the previously created slack instance). +3. Set the sample's (`slack-post`) dependency to be the newly created service + instance (of type `slack`). -4. Check the NodeCG logs +4. Check the NodeCG logs: You should see an error or a login message. diff --git a/docs/samples/spotify.md b/docs/samples/spotify.md index 84157a11..04ae1d8c 100644 --- a/docs/samples/spotify.md +++ b/docs/samples/spotify.md @@ -23,13 +23,9 @@ As a redirect URL use . ### Configure the Spotify sample bundle -1. In NodeCG, create a new Spotify service instance using the left upper menu. +1. In NodeCG, create a new Spotify service instance. -2. Enter credentials for Spotify. - - The created instance should be automatically selected, if not select it in - the upper left menu. Enter your client ID and secret in monaco (the - text-editor on the right) in this format: +2. Enter your client ID and secret for Spotify: ```json { @@ -46,15 +42,10 @@ As a redirect URL use . list of all scopes can be found [here](https://developer.spotify.com/documentation/general/guides/scopes/). -3. Set the created Spotify service instance to the service dependency of the - spotify-current-song bundle. - - Select the spotify-current-song bundle and the Spotify service in the left - bottom menu. Then select the service instance that should be used by the - spotify-current-song bundle (in this case the name of the previously created - Spotify instance). +3. Set the sample's (`spotify-current-song`) dependency to be the newly created + service instance (of type `spotify`). -4. Check the NodeCG logs +4. Check the NodeCG logs: You should see an error or a success message and the current playing song with names and artists. diff --git a/docs/samples/sql.md b/docs/samples/sql.md index be29aa16..be69b54b 100644 --- a/docs/samples/sql.md +++ b/docs/samples/sql.md @@ -21,14 +21,10 @@ different database type later. ### Configure the SQL sample bundle -1. In NodeCG, create a new SQL service instance using the left upper menu. +1. In NodeCG, create a new SQL service instance. -2. Enter configuration for SQL. - - The created instance should be automatically selected, if not select it in - the upper left menu. Enter your used database client and a - [knex connection object](https://knexjs.org/#Installation-client) in monaco - (the text-editor on the right) in this format: +2. Enter your used database client and a + [knex connection object](https://knexjs.org/#Installation-client) for SQL: ```json { @@ -42,14 +38,10 @@ different database type later. After entering it, click save. -3. Set the created SQL service instance to the service dependency of the SQL - sample bundle. - - Select the SQL sample bundle and the SQL service in the left bottom menu. - Then select the service instance that should be used by the SQL sample - bundle (in this case the name of the previously created SQL instance). +3. Set the sample's (`sql`) dependency to be the newly created service instance + (of type `sql`). -4. Check the NodeCG logs +4. Check the NodeCG logs: Your first run of the sample bundle will probably fail because your database doesn't contain the used tables. Check `samples/sql/extension/index.ts` and diff --git a/docs/samples/streamdeck.md b/docs/samples/streamdeck.md index 8483993d..92643d25 100644 --- a/docs/samples/streamdeck.md +++ b/docs/samples/streamdeck.md @@ -22,10 +22,9 @@ Everything after the `sudo udevadm` command can be omitted. ### Configure the Streamdeck Rainbow bundle -1. In NodeCG, create a new StreamDeck service instance using the left upper - menu. +1. In NodeCG, create a new StreamDeck service instance. -2. Enter the configuration +2. Enter the configuration: ```json { @@ -36,7 +35,7 @@ Everything after the `sudo udevadm` command can be omitted. `default` tells the bundle to automatically find a StreamDeck. If you use multiple StreamDecks, you need to put in an ID here. -3. Set the created StreamDeck service instance to the service dependency of the - streamdeck-rainbow bundle. +3. Set the sample's (`streamdeck-rainbow`) dependency to be the newly created + service instance (of type `streamdeck`). 4. Watch your streamdeck. diff --git a/docs/samples/streamelements.md b/docs/samples/streamelements.md index 87a4e132..fc0c7455 100644 --- a/docs/samples/streamelements.md +++ b/docs/samples/streamelements.md @@ -26,14 +26,9 @@ click on `Show Secrets` and copy it. ### Configure the StreamElements sample bundle -1. In NodeCG, create a new StreamElements service instance using the left upper - menu. +1. In NodeCG, create a new StreamElements service instance. -2. Enter credentials for StreamElements. - - The created instance should be automatically selected, if not select it in - the upper left menu. Enter your JWT Token in monaco (the text-editor on the - right) in this format: +2. Enter the JWT Token for StreamElements: ```json { @@ -43,15 +38,10 @@ click on `Show Secrets` and copy it. After entering it, click save. -3. Set the created StreamElements service instance to the service dependency of - the streamelements-events bundle. - - Select the streamelements-events bundle and the StreamElements service in - the left bottom menu. Then select the service instance that should be used - by the streamelements-events bundle (in this case the name of the previously - created streamelements-events instance). +3. Set the sample's (`streamelements-events`) dependency to be the newly created + service instance (of type `streamelements`). -4. Check the nodecg logs +4. Check the NodeCG logs: You should see an error or a success message and a log message for each event of your channel like subs, follows, cheers, raids and so on. diff --git a/docs/samples/telegram.md b/docs/samples/telegram.md index 3d975c47..17d432f9 100644 --- a/docs/samples/telegram.md +++ b/docs/samples/telegram.md @@ -18,13 +18,9 @@ will also tell you how to log in and how to use the GUI. ### Configure the telegram sample bundle -1. Create a new telegram service instance using the left upper menu. +1. Create a new telegram service instance. -2. Enter the token and set polling to true. - - The created instance should be automatically selected, if not select it in - the upper left menu. Enter your host and port in monaco (the text-editor on - the right) in this format: +2. Enter the token and set polling to true: ```json { @@ -35,7 +31,7 @@ will also tell you how to log in and how to use the GUI. After entering it, click save. -3. Set the created telegram service instance to the service dependency of the - telegram bundle. +3. Set the sample's (`telegram-bot`) dependency to be the newly created service + instance (of type `telegram`). 4. You can send `/test` to your bot, and it should respond with two messages. diff --git a/docs/samples/tiane.md b/docs/samples/tiane.md index 71c6f539..96ed6233 100644 --- a/docs/samples/tiane.md +++ b/docs/samples/tiane.md @@ -49,14 +49,10 @@ guide. Make sure `websocket` is either set to `enabled` or `secure` and set a port of your desire. -4. In the NodeCG dashboard, create a new TIANE service instance using the left - upper menu. +4. In the NodeCG dashboard, create a new TIANE service instance. -5. Enter address of the TIANE-Server - - The created instance should be automatically selected, if not select it in - the upper left menu. Enter host and port you just set in - `server/TIANE_config.json` in this format: +5. Enter address of the TIANE-Server. Enter host and port you just set in + `server/TIANE_config.json` in this format: ```json { @@ -66,16 +62,10 @@ guide. After entering it, click save. -6. Create a new Discord service instance. (See the [Discord Sample](discord.md) - on how to do this) - -7. Set the created TIANE and Discord service instances to the service dependency - of the TIANE-Discord bundle. +6. Create a new Discord service instance. - Select the TIANE-Discord bundle and the TIANE service in the left bottom - menu. Then select the service instance that should be used by the - TIANE-Discord bundle (in this case the name of the previously created twitch - instance). Then do the same for the discord bundle. +7. Set the sample's (`tiane-discord`) dependencies to be the newly created + service instances (of type `tiane` & `discord`). 8. Ping your discord bot in the channel you set in the first step and ask TIANE something. diff --git a/docs/samples/twitch-addons.md b/docs/samples/twitch-addons.md index c0371efd..cc120db7 100644 --- a/docs/samples/twitch-addons.md +++ b/docs/samples/twitch-addons.md @@ -23,14 +23,9 @@ as the token is only used to convert channel names to IDs. ### Configure the Twitch-Addons sample bundle -1. In NodeCG, create a new twitch-addons service instance using the left upper - menu. +1. In NodeCG, create a new twitch-addons service instance. -2. Enter credentials for twitch. - - The created instance should be automatically selected, if not select it in - the upper left menu. Enter your Twitch OAuth Key in monaco (the text-editor - on the right) in this format: +2. Enter your Twitch OAuth Key: ```json { @@ -40,15 +35,10 @@ as the token is only used to convert channel names to IDs. After entering it, click save. -3. Set the created twitch-addons service instance to the service dependency of - the twitch-addons bundle. - - Select the twitch-addons bundle and the twitch-addons service in the left - bottom menu. Then select the service instance that should be used by the - bundle (in this case the name of the previously created twitch-addons - instance). +3. Set the sample's (`twitch-addons`) dependency to be the newly created service + instance (of type `twitch-addons`). -4. Check the NodeCG logs +4. Check the NodeCG logs: You should see an error or a success message and all BetterTTV and FFZ emotes from the twitch channel `#derniklaas` diff --git a/docs/samples/twitch-api.md b/docs/samples/twitch-api.md index 60667104..3ef62209 100644 --- a/docs/samples/twitch-api.md +++ b/docs/samples/twitch-api.md @@ -23,14 +23,9 @@ can leave everything off. ### Configure the Twitch API sample bundle -1. In NodeCG, create a new twitch-api service instance using the left upper - menu. +1. In NodeCG, create a new twitch-api service instance. -2. Enter credentials for the twitch API. - - The created instance should be automatically selected, if not select it in - the upper left menu. Enter your Twitch OAuth Key in monaco (the text-editor - on the right) in this format: +2. Enter your Twitch OAuth Key: ```json { @@ -40,15 +35,10 @@ can leave everything off. After entering it, click save. -3. Set the created twitch-api service instance to the service dependency of the - twitch-api bundle. - - Select the twitch-api bundle and the twitch-api service in the left bottom - menu. Then select the service instance that should be used by the twitch-api - sample bundle (in this case the name of the previously created twitch-api - instance). +3. Set the sample's (`twitch-api`) dependency to be the newly created service + instance (of type `twitch-api`). -4. Check the NodeCG logs +4. Check the NodeCG logs: You should see an error or a success message and you current username, how many people you follow and if you are currently streaming. diff --git a/docs/samples/twitch-chat.md b/docs/samples/twitch-chat.md index cf14de3b..b4e6b706 100644 --- a/docs/samples/twitch-chat.md +++ b/docs/samples/twitch-chat.md @@ -22,14 +22,9 @@ token. ### Configure the Twitch sample bundle -1. In NodeCG, create a new twitch-chat service instance using the left upper - menu. +1. In NodeCG, create a new twitch-chat service instance. -2. Enter credentials for twitch. - - The created instance should be automatically selected, if not select it in - the upper left menu. Enter your Twitch OAuth Key in monaco (the text-editor - on the right) in this format: +2. Enter your Twitch OAuth Key: ```json { @@ -39,15 +34,10 @@ token. After entering it, click save. -3. Set the created twitch-chat service instance to the service dependency of the - Twitch-chat bundle. - - Select the Twitch-chat bundle and the twitch-chat service in the left bottom - menu. Then select the service instance that should be used by the - Twitch-chat bundle (in this case the name of the previously created - twitch-chat instance). +3. Set the sample's (`twitch-chat`) dependency to be the newly created service + instance (of type `twitch-chat`). -4. Check the NodeCG logs +4. Check the NodeCG logs: You should see an error or a success message and all twitch messages that are written in the twitch channel that is hardcoded in diff --git a/docs/samples/twitch-pubsub.md b/docs/samples/twitch-pubsub.md index c589adec..974143ef 100644 --- a/docs/samples/twitch-pubsub.md +++ b/docs/samples/twitch-pubsub.md @@ -21,14 +21,9 @@ scopes: `channel_subscriptions`, `bits:read` and `channel:read:redemptions` ### Configure the Twitch PubSub sample bundle -1. In NodeCG, create a new twitch-pubsub service instance using the left upper - menu. +1. In NodeCG, create a new twitch-pubsub service instance. -2. Enter credentials for twitch-pubsub. - - The created instance should be automatically selected, if not select it in - the upper left menu. Enter your Twitch OAuth Key in monaco (the text-editor - on the right) in this format: +2. Enter your Twitch OAuth Key: ```json { @@ -38,15 +33,10 @@ scopes: `channel_subscriptions`, `bits:read` and `channel:read:redemptions` After entering it, click save. -3. Set the created twitch-pubsub service instance to the service dependency of - the twitch-pubsub sample bundle. - - Select the twitch-pubsub sample bundle and the twitch-pubsub service in the - left bottom menu. Then select the service instance that should be used by - the twitch-pubsub sample bundle (in this case the name of the previously - created twitch-pubsub instance). +3. Set the sample's (`twitch-pubsub`) dependency to be the newly created service + instance (of type `twitch-pubsub`). -4. Check the NodeCG logs +4. Check the NodeCG logs: You should see an error or a success message and a log entry for each subscription, bits, bits badge unlock and channel point redemption event. diff --git a/docs/samples/twitter.md b/docs/samples/twitter.md index b5b01b7b..159b9c1c 100644 --- a/docs/samples/twitter.md +++ b/docs/samples/twitter.md @@ -26,13 +26,9 @@ and tokens. ### Configure the sample bundle -1. In NodeCG, create a new twitter service instance using the left upper menu. +1. In NodeCG, create a new twitter service instance. -2. Enter credentials for twitter. - - The created instance should be automatically selected, if not select it in - the upper left menu. Enter your Twitter keys and tokens in monaco (the - text-editor on the right) in this format: +2. Enter your Twitter keys and tokens: ```json { @@ -45,15 +41,10 @@ and tokens. After entering it, click save. -3. Set the created twitter service instance to the service dependency of the - twitter-timeline bundle. - - Select the twitter-timeline bundle and the twitter service in the left - bottom menu. Then select the service instance that should be used by the - twitter-timeline bundle (in this case the name of the previously created - twitter instance). +3. Set the sample's (`twitter-timeline`) dependency to be the newly created + service instance (of type `twitter`). -4. Check the NodeCG logs +4. Check the NodeCG logs: You should see an error or a success message and up to 50 Twitter messages tweeted by the user that is hardcoded in diff --git a/docs/samples/websocket-client.md b/docs/samples/websocket-client.md index f727ff8d..c6e9d13b 100644 --- a/docs/samples/websocket-client.md +++ b/docs/samples/websocket-client.md @@ -18,15 +18,11 @@ For simplicity's sake this sample will rely upon the websocket-server sample. Please set up the [WebSocket-server bundle](./websocket-server.md) first and then follow these steps: -1. In NodeCG, create a new ws-client service instance using the left upper menu. +1. In NodeCG, create a new ws-client service instance. 2. Enter the address of the sample server. This has to be a URL following the pattern `ws://localhost:`. - The created instance should be automatically selected, if not select it in - the upper left menu. Enter your port in monaco (the text-editor on the - right) in this format: - ```json { "address": "ws://localhost:7777" @@ -35,8 +31,8 @@ then follow these steps: After entering it, click save. -3. Set the created ws-client service instance to the service dependency of the - ws-client bundle. +3. Set the sample's (`websocket-client`) dependency to be the newly created + service instance (of type `websocket-client`). 4. A websocket-client has been connected and the console should display if a ping is sent or a pong is received. diff --git a/docs/samples/websocket-server.md b/docs/samples/websocket-server.md index c6eca116..9cb8ec86 100644 --- a/docs/samples/websocket-server.md +++ b/docs/samples/websocket-server.md @@ -14,12 +14,8 @@ will also tell you how to log in and how to use the GUI. ### Configure the websocket-server sample bundle -1. In NodeCG, create a new ws-server service instance using the left upper menu. -2. Enter a port for the server. This has to be a number from 0 to 65535. - - The created instance should be automatically selected, if not select it in - the upper left menu. Enter your port in monaco (the text-editor on the - right) in this format: +1. In NodeCG, create a new ws-server service instance. +2. Enter a port for the server. This has to be a number from 0 to 65535: ```json { @@ -29,6 +25,7 @@ will also tell you how to log in and how to use the GUI. After entering it, click save. -3. Set the created ws-server service instance to the service dependency of the - ws-server bundle. +3. Set the sample's (`websocket-server`) dependency to be the newly created + service instance (of type `websocket-server`). + 4. A websocket-server has been started at the specified port. diff --git a/docs/samples/xdotool.md b/docs/samples/xdotool.md index 060c59c4..2c53afb9 100644 --- a/docs/samples/xdotool.md +++ b/docs/samples/xdotool.md @@ -17,13 +17,9 @@ will also tell you how to log in and how to use the GUI. ### Configure the Xdotool sample bundle -1. In NodeCG, create a new xdotool service instance using the left upper menu. +1. In NodeCG, create a new xdotool service instance. -2. Enter settings port `-1` tells nodecg-io to use a locally installed xdotool. - - The created instance should be automatically selected, if not select it in - the upper left menu. Configure local xdotool in monaco (the text-editor on - the right) using this config: +2. Enter settings port `-1` tells nodecg-io to use a locally installed xdotool: ```json { @@ -34,7 +30,7 @@ will also tell you how to log in and how to use the GUI. After entering it, click save. -3. Set the created xdotool service instance to the service dependency of the - xdotool bundle. +3. Set the sample's (`xdotool-windowminimize`) dependency to be the newly + created service instance (of type `xdotool`). 4. Your browser window should get minimized. diff --git a/docs/samples/youtube.md b/docs/samples/youtube.md index 1f44316a..4af41a98 100644 --- a/docs/samples/youtube.md +++ b/docs/samples/youtube.md @@ -24,14 +24,9 @@ As redirect URI add . ### Configure the YouTube sample bundle -1. In NodeCG, create a new googleapis service instance using the left upper - menu. +1. In NodeCG, create a new googleapis service instance. -2. Enter credentials for googleapis. - - The created instance should be automatically selected, if not select it in - the upper left menu. Enter your YouTube OAuth credentials in monaco (the - text-editor on the right) in this format: +2. Enter your YouTube OAuth credentials: ```json { @@ -46,15 +41,10 @@ As redirect URI add . _Note:_ You can add multiple scopes if the googleapis instance is used for multiple bundles. -3. Set the created googleapis service instance to the service dependency of the - YouTube bundle. - - Select the YouTube bundle and the googleapis service in the left bottom - menu. Then select the service instance that should be used by the YouTube - bundle (in this case the name of the previously created googleapis - instance). +3. Set the sample's (`youtube-playlist`) dependency to be the newly created + service instance (of type `googleapis`). -4. Check the NodeCG logs +4. Check the NodeCG logs: You should see an error or a success message that is hardcoded in `samples/youtube-playlist/extension/index.ts`.