diff --git a/.gitignore b/.gitignore index 547c24f8..ac83a0e7 100644 --- a/.gitignore +++ b/.gitignore @@ -4,3 +4,4 @@ _site/ assets/css/main copy.scss assets/css/content copy.scss _algolia_api_key +_config_local.yml diff --git a/Gemfile b/Gemfile index 0645b41b..b5d9b48d 100644 --- a/Gemfile +++ b/Gemfile @@ -7,15 +7,15 @@ git_source(:github) {|repo_name| "https://github.com/#{repo_name}" } # gem "rails" gem 'jekyll' gem "webrick", "~> 1.7" -gem "github-pages", "~> 215", group: :jekyll_plugins +gem 'github-pages', group: :jekyll_plugins gem 'tzinfo-data' gem 'wdm', '>= 0.1.0' if Gem.win_platform? group :jekyll_plugins do - gem 'jekyll-algolia' - gem 'jekyll-sitemap' - gem 'jekyll-feed' - gem 'jekyll-seo-tag' - gem 'jekyll-toc' - gem 'jekyll-redirect-from' - end + gem 'jekyll-algolia' + gem 'jekyll-sitemap' + gem 'jekyll-feed' + gem 'jekyll-seo-tag' + gem 'jekyll-toc' + gem 'jekyll-redirect-from' + end \ No newline at end of file diff --git a/Gemfile.lock b/Gemfile.lock index 6cf36275..988ba27b 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -1,67 +1,65 @@ GEM remote: https://rubygems.org/ specs: - activesupport (3.2.22.5) - i18n (~> 0.6, >= 0.6.4) - multi_json (~> 1.0) - addressable (2.8.0) - public_suffix (>= 2.0.2, < 5.0) + activesupport (7.1.2) + base64 + bigdecimal + concurrent-ruby (~> 1.0, >= 1.0.2) + connection_pool (>= 2.2.5) + drb + i18n (>= 1.6, < 2) + minitest (>= 5.1) + mutex_m + tzinfo (~> 2.0) + addressable (2.8.6) + public_suffix (>= 2.0.2, < 6.0) algolia_html_extractor (2.6.4) json (~> 2.0) nokogiri (~> 1.10) algoliasearch (1.27.5) httpclient (~> 2.8, >= 2.8.3) json (>= 1.5.1) + base64 (0.2.0) + bigdecimal (3.1.5) coffee-script (2.4.1) coffee-script-source execjs coffee-script-source (1.11.1) colorator (1.1.0) - commonmarker (0.17.13) - ruby-enum (~> 0.5) - concurrent-ruby (1.1.9) - dnsruby (1.61.7) - simpleidn (~> 0.1) - em-websocket (0.5.2) + commonmarker (0.23.10) + concurrent-ruby (1.2.2) + connection_pool (2.4.1) + dnsruby (1.70.0) + simpleidn (~> 0.2.1) + drb (2.2.0) + ruby2_keywords + em-websocket (0.5.3) eventmachine (>= 0.12.9) - http_parser.rb (~> 0.6.0) - ethon (0.14.0) + http_parser.rb (~> 0) + ethon (0.16.0) ffi (>= 1.15.0) eventmachine (1.2.7-x64-mingw32) - execjs (2.8.1) - faraday (1.8.0) - faraday-em_http (~> 1.0) - faraday-em_synchrony (~> 1.0) - faraday-excon (~> 1.1) - faraday-httpclient (~> 1.0.1) - faraday-net_http (~> 1.0) - faraday-net_http_persistent (~> 1.1) - faraday-patron (~> 1.0) - faraday-rack (~> 1.0) - multipart-post (>= 1.2, < 3) + execjs (2.9.1) + faraday (2.8.1) + base64 + faraday-net_http (>= 2.0, < 3.1) ruby2_keywords (>= 0.0.4) - faraday-em_http (1.0.0) - faraday-em_synchrony (1.0.0) - faraday-excon (1.1.0) - faraday-httpclient (1.0.1) - faraday-net_http (1.0.1) - faraday-net_http_persistent (1.2.0) - faraday-patron (1.0.0) - faraday-rack (1.0.0) - ffi (1.15.4-x64-mingw32) + faraday-net_http (3.0.2) + ffi (1.16.3-x64-mingw32) filesize (0.2.0) forwardable-extended (2.6.0) gemoji (3.0.1) - github-pages (215) - github-pages-health-check (= 1.17.2) - jekyll (= 3.9.0) + github-pages (228) + github-pages-health-check (= 1.17.9) + jekyll (= 3.9.3) jekyll-avatar (= 0.7.0) jekyll-coffeescript (= 1.1.1) - jekyll-commonmark-ghpages (= 0.1.6) + jekyll-commonmark-ghpages (= 0.4.0) jekyll-default-layout (= 0.1.4) jekyll-feed (= 0.15.1) jekyll-gist (= 1.5.0) jekyll-github-metadata (= 2.13.0) + jekyll-include-cache (= 0.2.1) jekyll-mentions (= 1.6.0) jekyll-optional-front-matter (= 0.3.2) jekyll-paginate (= 1.1.0) @@ -70,50 +68,50 @@ GEM jekyll-relative-links (= 0.6.1) jekyll-remote-theme (= 0.4.3) jekyll-sass-converter (= 1.5.2) - jekyll-seo-tag (= 2.7.1) + jekyll-seo-tag (= 2.8.0) jekyll-sitemap (= 1.4.0) jekyll-swiss (= 1.0.0) - jekyll-theme-architect (= 0.1.1) - jekyll-theme-cayman (= 0.1.1) - jekyll-theme-dinky (= 0.1.1) - jekyll-theme-hacker (= 0.1.2) - jekyll-theme-leap-day (= 0.1.1) - jekyll-theme-merlot (= 0.1.1) - jekyll-theme-midnight (= 0.1.1) - jekyll-theme-minimal (= 0.1.1) - jekyll-theme-modernist (= 0.1.1) - jekyll-theme-primer (= 0.5.4) - jekyll-theme-slate (= 0.1.1) - jekyll-theme-tactile (= 0.1.1) - jekyll-theme-time-machine (= 0.1.1) + jekyll-theme-architect (= 0.2.0) + jekyll-theme-cayman (= 0.2.0) + jekyll-theme-dinky (= 0.2.0) + jekyll-theme-hacker (= 0.2.0) + jekyll-theme-leap-day (= 0.2.0) + jekyll-theme-merlot (= 0.2.0) + jekyll-theme-midnight (= 0.2.0) + jekyll-theme-minimal (= 0.2.0) + jekyll-theme-modernist (= 0.2.0) + jekyll-theme-primer (= 0.6.0) + jekyll-theme-slate (= 0.2.0) + jekyll-theme-tactile (= 0.2.0) + jekyll-theme-time-machine (= 0.2.0) jekyll-titles-from-headings (= 0.5.3) jemoji (= 0.12.0) - kramdown (= 2.3.1) + kramdown (= 2.3.2) kramdown-parser-gfm (= 1.1.0) - liquid (= 4.0.3) + liquid (= 4.0.4) mercenary (~> 0.3) minima (= 2.5.1) - nokogiri (>= 1.10.4, < 2.0) + nokogiri (>= 1.13.6, < 2.0) rouge (= 3.26.0) terminal-table (~> 1.4) - github-pages-health-check (1.17.2) + github-pages-health-check (1.17.9) addressable (~> 2.3) dnsruby (~> 1.60) octokit (~> 4.0) - public_suffix (>= 2.0.2, < 5.0) + public_suffix (>= 3.0, < 5.0) typhoeus (~> 1.3) - html-pipeline (2.14.0) + html-pipeline (2.14.3) activesupport (>= 2) nokogiri (>= 1.4) - http_parser.rb (0.6.0) + http_parser.rb (0.8.0) httpclient (2.8.3) - i18n (0.9.5) + i18n (1.14.1) concurrent-ruby (~> 1.0) - jekyll (3.9.0) + jekyll (3.9.3) addressable (~> 2.4) colorator (~> 1.0) em-websocket (~> 0.5) - i18n (~> 0.7) + i18n (>= 0.7, < 2) jekyll-sass-converter (~> 1.0) jekyll-watch (~> 2.0) kramdown (>= 1.17, < 3) @@ -136,13 +134,13 @@ GEM jekyll-coffeescript (1.1.1) coffee-script (~> 2.2) coffee-script-source (~> 1.11.1) - jekyll-commonmark (1.3.1) - commonmarker (~> 0.14) - jekyll (>= 3.7, < 5.0) - jekyll-commonmark-ghpages (0.1.6) - commonmarker (~> 0.17.6) - jekyll-commonmark (~> 1.2) - rouge (>= 2.0, < 4.0) + jekyll-commonmark (1.4.0) + commonmarker (~> 0.22) + jekyll-commonmark-ghpages (0.4.0) + commonmarker (~> 0.23.7) + jekyll (~> 3.9.0) + jekyll-commonmark (~> 1.4.0) + rouge (>= 2.0, < 5.0) jekyll-default-layout (0.1.4) jekyll (~> 3.0) jekyll-feed (0.15.1) @@ -152,6 +150,8 @@ GEM jekyll-github-metadata (2.13.0) jekyll (>= 3.4, < 5.0) octokit (~> 4.0, != 4.4.0) + jekyll-include-cache (0.2.1) + jekyll (>= 3.7, < 5.0) jekyll-mentions (1.6.0) html-pipeline (~> 2.3) jekyll (>= 3.7, < 5.0) @@ -171,69 +171,69 @@ GEM rubyzip (>= 1.3.0, < 3.0) jekyll-sass-converter (1.5.2) sass (~> 3.4) - jekyll-seo-tag (2.7.1) + jekyll-seo-tag (2.8.0) jekyll (>= 3.8, < 5.0) jekyll-sitemap (1.4.0) jekyll (>= 3.7, < 5.0) jekyll-swiss (1.0.0) - jekyll-theme-architect (0.1.1) - jekyll (~> 3.5) + jekyll-theme-architect (0.2.0) + jekyll (> 3.5, < 5.0) jekyll-seo-tag (~> 2.0) - jekyll-theme-cayman (0.1.1) - jekyll (~> 3.5) + jekyll-theme-cayman (0.2.0) + jekyll (> 3.5, < 5.0) jekyll-seo-tag (~> 2.0) - jekyll-theme-dinky (0.1.1) - jekyll (~> 3.5) + jekyll-theme-dinky (0.2.0) + jekyll (> 3.5, < 5.0) jekyll-seo-tag (~> 2.0) - jekyll-theme-hacker (0.1.2) + jekyll-theme-hacker (0.2.0) jekyll (> 3.5, < 5.0) jekyll-seo-tag (~> 2.0) - jekyll-theme-leap-day (0.1.1) - jekyll (~> 3.5) + jekyll-theme-leap-day (0.2.0) + jekyll (> 3.5, < 5.0) jekyll-seo-tag (~> 2.0) - jekyll-theme-merlot (0.1.1) - jekyll (~> 3.5) + jekyll-theme-merlot (0.2.0) + jekyll (> 3.5, < 5.0) jekyll-seo-tag (~> 2.0) - jekyll-theme-midnight (0.1.1) - jekyll (~> 3.5) + jekyll-theme-midnight (0.2.0) + jekyll (> 3.5, < 5.0) jekyll-seo-tag (~> 2.0) - jekyll-theme-minimal (0.1.1) - jekyll (~> 3.5) + jekyll-theme-minimal (0.2.0) + jekyll (> 3.5, < 5.0) jekyll-seo-tag (~> 2.0) - jekyll-theme-modernist (0.1.1) - jekyll (~> 3.5) + jekyll-theme-modernist (0.2.0) + jekyll (> 3.5, < 5.0) jekyll-seo-tag (~> 2.0) - jekyll-theme-primer (0.5.4) + jekyll-theme-primer (0.6.0) jekyll (> 3.5, < 5.0) jekyll-github-metadata (~> 2.9) jekyll-seo-tag (~> 2.0) - jekyll-theme-slate (0.1.1) - jekyll (~> 3.5) + jekyll-theme-slate (0.2.0) + jekyll (> 3.5, < 5.0) jekyll-seo-tag (~> 2.0) - jekyll-theme-tactile (0.1.1) - jekyll (~> 3.5) + jekyll-theme-tactile (0.2.0) + jekyll (> 3.5, < 5.0) jekyll-seo-tag (~> 2.0) - jekyll-theme-time-machine (0.1.1) - jekyll (~> 3.5) + jekyll-theme-time-machine (0.2.0) + jekyll (> 3.5, < 5.0) jekyll-seo-tag (~> 2.0) jekyll-titles-from-headings (0.5.3) jekyll (>= 3.3, < 5.0) - jekyll-toc (0.17.1) + jekyll-toc (0.18.0) jekyll (>= 3.9) - nokogiri (~> 1.11) + nokogiri (~> 1.12) jekyll-watch (2.2.1) listen (~> 3.0) jemoji (0.12.0) gemoji (~> 3.0) html-pipeline (~> 2.2) jekyll (>= 3.0, < 5.0) - json (2.5.1) - kramdown (2.3.1) + json (2.7.1) + kramdown (2.3.2) rexml kramdown-parser-gfm (1.1.0) kramdown (~> 2.0) - liquid (4.0.3) - listen (3.7.0) + liquid (4.0.4) + listen (3.8.0) rb-fsevent (~> 0.10, >= 0.10.3) rb-inotify (~> 0.9, >= 0.9.10) mercenary (0.3.6) @@ -241,25 +241,23 @@ GEM jekyll (>= 3.5, < 5.0) jekyll-feed (~> 0.9) jekyll-seo-tag (~> 2.1) - multi_json (1.15.0) - multipart-post (2.1.1) - nokogiri (1.12.4-x64-mingw32) + minitest (5.20.0) + mutex_m (0.2.0) + nokogiri (1.15.5-x64-mingw32) racc (~> 1.4) - octokit (4.21.0) - faraday (>= 0.9) - sawyer (~> 0.8.0, >= 0.5.3) + octokit (4.25.1) + faraday (>= 1, < 3) + sawyer (~> 0.9) pathutil (0.16.2) forwardable-extended (~> 2.6) - progressbar (1.11.0) - public_suffix (4.0.6) - racc (1.5.2) - rb-fsevent (0.11.0) + progressbar (1.13.0) + public_suffix (4.0.7) + racc (1.7.3) + rb-fsevent (0.11.2) rb-inotify (0.10.1) ffi (~> 1.0) - rexml (3.2.5) + rexml (3.2.6) rouge (3.26.0) - ruby-enum (0.9.0) - i18n ruby2_keywords (0.0.5) rubyzip (2.3.2) safe_yaml (1.0.5) @@ -268,33 +266,32 @@ GEM sass-listen (4.0.0) rb-fsevent (~> 0.9, >= 0.9.4) rb-inotify (~> 0.9, >= 0.9.7) - sawyer (0.8.2) + sawyer (0.9.2) addressable (>= 2.3.5) - faraday (> 0.8, < 2.0) + faraday (>= 0.17.3, < 3) simpleidn (0.2.1) unf (~> 0.1.4) terminal-table (1.8.0) unicode-display_width (~> 1.1, >= 1.1.1) - typhoeus (1.4.0) + typhoeus (1.4.1) ethon (>= 0.9.0) - tzinfo (2.0.4) + tzinfo (2.0.6) concurrent-ruby (~> 1.0) - tzinfo-data (1.2021.1) + tzinfo-data (1.2023.4) tzinfo (>= 1.0.0) unf (0.1.4) unf_ext - unf_ext (0.0.8-x64-mingw32) + unf_ext (0.0.9.1-x64-mingw32) unicode-display_width (1.8.0) verbal_expressions (0.1.5) wdm (0.1.1) - webrick (1.7.0) + webrick (1.8.1) PLATFORMS x64-mingw32 - x64-unknown DEPENDENCIES - github-pages (~> 215) + github-pages jekyll jekyll-algolia jekyll-feed @@ -307,4 +304,4 @@ DEPENDENCIES webrick (~> 1.7) BUNDLED WITH - 2.2.18 + 2.1.4 diff --git a/_config.yml b/_config.yml index 98fbe486..8e22ddc5 100644 --- a/_config.yml +++ b/_config.yml @@ -1,361 +1,355 @@ -title: SAMMI -tagline: SAMMI | Stream Automation, Management, Monitoring and Innovation | Works with Twitch, YouTube, OBS -description: Transform your ordinary stream into interactive experience for your viewers with SAMMI -name: SAMMI • Free Streamer Tool -stableVersion: 202311 -url: "https://sammi.solutions" -author: - twitter: SAMMISolutions -repository: https://github.com/SAMMISolutions/docs -logo: /assets/favicon/favicon-32x32.png -social: - name: SAMMI - links: - - https://twitter.com/SAMMISolutions - - https://github.com/SAMMISolutions -timezone: US/Pacific -google_analytics: G-Q3ZGBDKL0V -twitter: - username: SAMMISolutions - card: summary -plugins: - - jekyll-feed - - jekyll-sitemap - - jekyll-seo-tag - - jekyll-toc - - jekyll-mentions - - jekyll-relative-links - - jekyll-redirect-from -sass: - style: compressed -relative_links: - enabled: true - collections: true -kramdown: - auto_ids: false -toc: - min_level: 1 - max_level: 6 - ordered_list: false - no_toc_section_class: no_toc_section - list_id: toc - list_class: section-nav - sublist_class: '' - item_class: "nav-link d-flex flex-row" - item_prefix: toc- -defaults: -- scope: - path: docs - type: pages - values: - layout: post -- scope: - path: docs/commands - values: - menu: Commands -- scope: - path: doc_posts/_commands-array - values: - parent: Arrays - backlink: array -- scope: - path: doc_posts/_commands-buffer - values: - parent: Buffers - backlink: buffer -- scope: - path: doc_posts/_commands-button - values: - parent: Buttons - backlink: button -- scope: - path: doc_posts/_commands-date-time - values: - parent: Date and Time - backlink: date-time -- scope: - path: doc_posts/_commands-file-csv - values: - parent: Files - subparent: CSV Files - backlink: file-csv -- scope: - path: doc_posts/_commands-file-general - values: - parent: Files - subparent: General - backlink: file-general -- scope: - path: doc_posts/_commands-file-ini - values: - parent: Files - subparent: INI Files - backlink: file-ini -- scope: - path: doc_posts/_commands-misc - values: - parent: Miscellaneous - backlink: misc -- scope: - path: doc_posts/_commands-mouse-kb - values: - parent: Mouse & Keyboard - backlink: mouse-kb -- scope: - path: doc_posts/_commands-number - values: - parent: Numbers - backlink: number -- scope: - path: doc_posts/_commands-object - values: - parent: Objects - backlink: object -- scope: - path: doc_posts/_commands-obs-* - values: - parent: OBS -- scope: - path: doc_posts/_commands-obs-filters - values: - subparent: Filters - backlink: obs-filters -- scope: - path: doc_posts/_commands-obs-general - values: - subparent: General - backlink: obs-general -- scope: - path: doc_posts/_commands-obs-media - values: - subparent: Media - backlink: obs-media -- scope: - path: doc_posts/_commands-obs-motion - values: - subparent: Motion - backlink: obs-motion -- scope: - path: doc_posts/_commands-obs-recording - values: - subparent: Recording - backlink: obs-recording -- scope: - path: doc_posts/_commands-obs-scenes - values: - subparent: Scenes - backlink: obs-scenes -- scope: - path: doc_posts/_commands-obs-sources - values: - subparent: Sources - backlink: obs-sources -- scope: - path: doc_posts/_commands-obs-streaming - values: - subparent: Streaming - backlink: obs-streaming -- scope: - path: doc_posts/_commands-sounds - values: - parent: Sound Effects - backlink: sounds -- scope: - path: doc_posts/_commands-statements - values: - parent: Statements & Loops - backlink: statements -- scope: - path: doc_posts/_commands-string - values: - parent: Strings - backlink: string -- scope: - path: doc_posts/_commands-trigger - values: - parent: Trigger methods - backlink: trigger -- scope: - path: doc_posts/_commands-twitch-* - values: - parent: Twitch -- scope: - path: doc_posts/_commands-twitch-chat - values: - subparent: Chat and Messages - backlink: twitch-chat -- scope: - path: doc_posts/_commands-twitch-chpr - values: - subparent: Channel Point Rewards - backlink: twitch-chpr -- scope: - path: doc_posts/_commands-twitch-info - values: - subparent: Information - backlink: twitch-info -- scope: - path: doc_posts/_commands-twitch-misc - values: - subparent: Miscellaneous - backlink: twitch-misc -- scope: - path: doc_posts/_commands-twitch-moderation - values: - subparent: Moderation - backlink: twitch-moderation -- scope: - path: doc_posts/_commands-twitch-polls - values: - subparent: Polls and Predictions - backlink: twitch-polls -- scope: - path: doc_posts/_commands-variable - values: - parent: Variables - backlink: variable -- scope: - path: doc_posts/_commands-wait - values: - parent: Wait For/Until - backlink: wait -- scope: - path: doc_posts/_commands-youtube - values: - parent: YouTube - backlink: youtube -- scope: - path: doc_posts/_commands-* - values: - layout: default_post - permalink: commands/:name - menu: Commands -- scope: - path: docs/integrations - values: - menu: Integrations -- scope: - path: docs/local api - values: - menu: Local API -- scope: - path: docs/faq - values: - menu: FAQ -- scope: - path: docs/troubleshooting - values: - menu: Troubleshooting -sass: - sass_dir: _sass -algolia: - application_id: 'I48YE43FLX' - index_name: 'lioranboard' -collections_dir: doc_posts -collections: - getting-started: - output: true - about: - output: true - components: - output: true - integrations: - output: true - integrations-obs: - output: true - integrations-twitch: - output: true - integrations-youtube: - output: true - triggers: - output: true - api-overview: - output: true - api-reference: - output: true - api-webhooks: - output: true - faq-general: - output: true - faq-receiver: - output: true - faq-commands: - output: true - troubleshooting-common: - output: true - troubleshooting-errors: - output: true - troubleshooting-bugs: - output: true - troubleshooting-buttons: - output: true - troubleshooting-outputs: - output: true - commands-introduction: - output: true - commands-variable: - output: true - commands-number: - output: true - commands-string: - output: true - commands-array: - output: true - commands-object: - output: true - commands-date-time: - output: true - commands-mouse-kb: - output: true - commands-statements: - output: true - commands-wait: - output: true - commands-trigger: - output: true - commands-file-general: - output: true - commands-file-ini: - output: true - commands-file-csv: - output: true - commands-twitch-info: - output: true - commands-twitch-chat: - output: true - commands-twitch-chpr: - output: true - commands-twitch-polls: - output: true - commands-twitch-moderation: - output: true - commands-twitch-misc: - output: true - commands-youtube: - output: true - commands-buffer: - output: true - commands-sounds: - output: true - commands-button: - output: true - commands-misc: - output: true - commands-obs-general: - output: true - commands-obs-filters: - output: true - commands-obs-media: - output: true - commands-obs-motion: - output: true - commands-obs-recording: - output: true - commands-obs-scenes: - output: true - commands-obs-sources: - output: true - commands-obs-streaming: - output: true - commands-obs-transitions: - output: true +title: SAMMI +tagline: SAMMI | Stream Automation, Management, Monitoring and Innovation | Works with Twitch, YouTube, OBS +description: Transform your ordinary stream into interactive experience for your viewers with SAMMI +name: SAMMI • Free Streamer Tool +stableVersion: 202640 +url: https://sammi.solutions +author: + twitter: SAMMISolutions +repository: https://github.com/SAMMISolutions/docs +logo: /assets/favicon/favicon-32x32.png +social: + name: SAMMI + links: + - https://twitter.com/SAMMISolutions + - https://github.com/SAMMISolutions +timezone: US/Pacific +google_analytics: G-Q3ZGBDKL0V +twitter: + username: SAMMISolutions + card: summary +plugins: +- jekyll-feed +- jekyll-sitemap +- jekyll-seo-tag +- jekyll-toc +- jekyll-mentions +- jekyll-relative-links +- jekyll-redirect-from +sass: + sass_dir: _sass +relative_links: + enabled: true + collections: true +kramdown: + auto_ids: false +toc: + min_level: 1 + max_level: 6 + ordered_list: false + no_toc_section_class: no_toc_section + list_id: toc + list_class: section-nav + sublist_class: '' + item_class: nav-link d-flex flex-row + item_prefix: toc- +defaults: +- scope: + path: docs + type: pages + values: + layout: post +- scope: + path: docs/commands + values: + menu: Commands +- scope: + path: doc_posts/_commands-array + values: + parent: Arrays + backlink: array +- scope: + path: doc_posts/_commands-buffer + values: + parent: Buffers + backlink: buffer +- scope: + path: doc_posts/_commands-button + values: + parent: Buttons + backlink: button +- scope: + path: doc_posts/_commands-date-time + values: + parent: Date and Time + backlink: date-time +- scope: + path: doc_posts/_commands-file-csv + values: + parent: Files + subparent: CSV Files + backlink: file-csv +- scope: + path: doc_posts/_commands-file-general + values: + parent: Files + subparent: General + backlink: file-general +- scope: + path: doc_posts/_commands-file-ini + values: + parent: Files + subparent: INI Files + backlink: file-ini +- scope: + path: doc_posts/_commands-misc + values: + parent: Miscellaneous + backlink: misc +- scope: + path: doc_posts/_commands-mouse-kb + values: + parent: Mouse & Keyboard + backlink: mouse-kb +- scope: + path: doc_posts/_commands-number + values: + parent: Numbers + backlink: number +- scope: + path: doc_posts/_commands-object + values: + parent: Objects + backlink: object +- scope: + path: doc_posts/_commands-obs-* + values: + parent: OBS +- scope: + path: doc_posts/_commands-obs-filters + values: + subparent: Filters + backlink: obs-filters +- scope: + path: doc_posts/_commands-obs-general + values: + subparent: General + backlink: obs-general +- scope: + path: doc_posts/_commands-obs-media + values: + subparent: Media + backlink: obs-media +- scope: + path: doc_posts/_commands-obs-motion + values: + subparent: Motion + backlink: obs-motion +- scope: + path: doc_posts/_commands-obs-recording + values: + subparent: Recording + backlink: obs-recording +- scope: + path: doc_posts/_commands-obs-scenes + values: + subparent: Scenes + backlink: obs-scenes +- scope: + path: doc_posts/_commands-obs-sources + values: + subparent: Sources + backlink: obs-sources +- scope: + path: doc_posts/_commands-obs-streaming + values: + subparent: Streaming + backlink: obs-streaming +- scope: + path: doc_posts/_commands-sounds + values: + parent: Sound Effects + backlink: sounds +- scope: + path: doc_posts/_commands-statements + values: + parent: Statements & Loops + backlink: statements +- scope: + path: doc_posts/_commands-string + values: + parent: Strings + backlink: string +- scope: + path: doc_posts/_commands-trigger + values: + parent: Trigger methods + backlink: trigger +- scope: + path: doc_posts/_commands-twitch-* + values: + parent: Twitch +- scope: + path: doc_posts/_commands-twitch-chat + values: + subparent: Chat and Messages + backlink: twitch-chat +- scope: + path: doc_posts/_commands-twitch-chpr + values: + subparent: Channel Point Rewards + backlink: twitch-chpr +- scope: + path: doc_posts/_commands-twitch-info + values: + subparent: Information + backlink: twitch-info +- scope: + path: doc_posts/_commands-twitch-misc + values: + subparent: Miscellaneous + backlink: twitch-misc +- scope: + path: doc_posts/_commands-twitch-moderation + values: + subparent: Moderation + backlink: twitch-moderation +- scope: + path: doc_posts/_commands-twitch-polls + values: + subparent: Polls and Predictions + backlink: twitch-polls +- scope: + path: doc_posts/_commands-variables + values: + parent: Variables + backlink: variables +- scope: + path: doc_posts/_commands-wait + values: + parent: Wait For/Until + backlink: wait +- scope: + path: doc_posts/_commands-youtube + values: + parent: YouTube + backlink: youtube +- scope: + path: doc_posts/_commands-* + values: + layout: default_post + permalink: commands/:name + menu: Commands +- scope: + path: docs/integrations + values: + menu: Integrations +- scope: + path: docs/local api + values: + menu: Local API +- scope: + path: docs/faq + values: + menu: FAQ +- scope: + path: docs/troubleshooting + values: + menu: Troubleshooting +algolia: + application_id: RL52QQ5HZ9 + index_name: sammi +collections_dir: doc_posts +collections: + getting-started: + output: true + about: + output: true + components: + output: true + integrations: + output: true + triggers: + output: true + api-overview: + output: true + api-reference: + output: true + api-webhooks: + output: true + faq-general: + output: true + faq-receiver: + output: true + faq-commands: + output: true + troubleshooting-common: + output: true + troubleshooting-errors: + output: true + troubleshooting-buttons: + output: true + troubleshooting-outputs: + output: true + commands-introduction: + output: true + commands-variables: + output: true + commands-number: + output: true + commands-string: + output: true + commands-array: + output: true + commands-object: + output: true + commands-date-time: + output: true + commands-mouse-kb: + output: true + commands-statements: + output: true + commands-wait: + output: true + commands-trigger: + output: true + commands-file-general: + output: true + commands-file-ini: + output: true + commands-file-csv: + output: true + commands-twitch-info: + output: true + commands-twitch-chat: + output: true + commands-twitch-chpr: + output: true + commands-twitch-polls: + output: true + commands-twitch-moderation: + output: true + commands-twitch-misc: + output: true + commands-youtube: + output: true + commands-buffer: + output: true + commands-sounds: + output: true + commands-button: + output: true + commands-misc: + output: true + commands-obs-general: + output: true + commands-obs-filters: + output: true + commands-obs-media: + output: true + commands-obs-motion: + output: true + commands-obs-recording: + output: true + commands-obs-scenes: + output: true + commands-obs-sources: + output: true + commands-obs-streaming: + output: true + commands-obs-transitions: + output: true + commands-integrations: + output: true + commands-deck-app: + output: true diff --git a/_data/navigation.yml b/_data/navigation.yml index 57f0264d..b0d88a35 100644 --- a/_data/navigation.yml +++ b/_data/navigation.yml @@ -4,123 +4,120 @@ main: - name: Components collection: components - name: Integrations - submenus: - - name: OBS Studio - link: integrations/obs - collection: integrations-obs - - name: Twitch - link: integrations/twitch - collection: integrations-twitch - - name: YouTube Live - link: integrations/youtube - collection: integrations-youtube + collection: integrations - name: Commands submenus: - - name: Introduction - link: commands/introduction - collection: commands-introduction - - name: Variables - link: commands/variables - collection: commands-variable - - name: Numbers - link: commands/number - collection: commands-number - - name: Strings - link: commands/string - collection: commands-string - name: Arrays link: commands/array collection: commands-stack - - name: Objects - link: commands/object - collection: commands-object + - name: Buffers + link: commands/buffer + collection: commands-buffer + - name: Buttons + link: commands/button + collection: commands-button - name: Date and Time link: commands/date-time collection: commands-date-time - - name: Statements & Loops - link: commands/statements - collection: commands-statements - - name: Wait For/Until - link: commands/wait - collection: commands-wait - - name: Trigger methods - link: commands/trigger - collection: commands-trigger + - name: Deck App + link: commands/deck-app + collection: commands-deck-app + - name: Files + subitems: + - name: CSV Files + link: commands/file-csv + collection: commands-file-csv + - name: General + link: commands/file-general + collection: commands-file-general + - name: INI Files + link: commands/file-ini + collection: commands-file-ini + - name: Integrations + link: commands/integrations + collection: commands-integrations + - name: Introduction + link: commands/introduction + collection: commands-introduction + - name: Miscellaneous + link: commands/misc + collection: commands-misc + - name: Mouse & Keyboard + link: commands/mouse-kb + collection: commands-mouse-kb + - name: Numbers + link: commands/number + collection: commands-number - name: OBS subitems: + - name: Filters + link: commands/obs-filters + collection: commands-obs-filters - name: General link: commands/obs-general collection: commands-obs-general + - name: Media + link: commands/obs-media + collection: commands-obs-media + - name: Motion + link: commands/obs-motion + collection: commands-obs-motion + - name: Recording + link: commands/obs-recording + collection: commands-obs-recording - name: Scenes link: commands/obs-scenes collection: commands-obs-scenes - name: Sources link: commands/obs-sources collection: commands-obs-sources - - name: Motion - link: commands/obs-motion - collection: commands-obs-motion - - name: Filters - link: commands/obs-filters - collection: commands-obs-filters - name: Streaming link: commands/obs-streaming collection: commands-obs-streaming - - name: Recording - link: commands/obs-recording - collection: commands-obs-recording - - name: Media - link: commands/obs-media - collection: commands-obs-media + - name: Objects + link: commands/object + collection: commands-object + - name: Sound Effects + link: commands/sounds + collection: commands-sounds + - name: Statements & Loops + link: commands/statements + collection: commands-statements + - name: Strings + link: commands/string + collection: commands-string + - name: Trigger methods + link: commands/trigger + collection: commands-trigger - name: Twitch subitems: - - name: Information - link: commands/twitch-info - collection: commands-twitch-info - - name: Chat and Messages - link: commands/twitch-chat - collection: commands-twitch-chat - name: Channel Point Rewards link: commands/twitch-chpr collection: commands-twitch-chpr - - name: Polls and Predictions - link: commands/twitch-polls - collection: commands-twitch-polls + - name: Chat and Messages + link: commands/twitch-chat + collection: commands-twitch-chat + - name: Information + link: commands/twitch-info + collection: commands-twitch-info + - name: Miscellaneous + link: commands/twitch-misc + collection: commands-twitch-misc - name: Moderation link: commands/twitch-moderation collection: commands-twitch-moderation - - name: Miscellaneous - link: commands/twitch-misc - collection: commands-twitch-misc + - name: Polls and Predictions + link: commands/twitch-polls + collection: commands-twitch-polls + - name: Variables + link: commands/variables + collection: commands-variables + - name: Wait For/Until + link: commands/wait + collection: commands-wait - name: YouTube link: commands/youtube collection: commands-youtube - - name: Files - subitems: - - name: General - link: commands/file-general - collection: commands-file - - name: CSV Files - link: commands/file-csv - collection: commands-file-csv - - name: INI Files - link: commands/file-ini - collection: commands-file-ini - - name: Buffers - link: commands/buffer - collection: commands-buffer - - name: Buttons - link: commands/button - collection: commands-button - - name: Mouse & Keyboard - link: commands/mouse-kb - collection: commands-mouse-kb - - name: Sound Effects - link: commands/sounds - collection: commands-sounds - - name: Miscellaneous - link: commands/misc - collection: commands-misc - name: Triggers collection: triggers - name: Local API @@ -144,20 +141,17 @@ main: collection: faq-commands - name: Troubleshooting submenus: - - name: Buttons & Commands - link: troubleshooting/buttons - collection: troubleshooting-buttons - name: Common Issues link: troubleshooting/common collection: troubleshooting-common - - name: Error Messages on Crash + - name: Buttons & Commands + link: troubleshooting/buttons + collection: troubleshooting-buttons + - name: Crash Errors link: troubleshooting/errors collection: troubleshooting-errors - name: Recording Outputs link: troubleshooting/outputs collection: troubleshooting-outputs - - name: Known Bugs - link: troubleshooting/bugs - collection: troubleshooting-bugs - name: About collection: about diff --git a/_includes/async.html b/_includes/async.html new file mode 100644 index 00000000..254ca55c --- /dev/null +++ b/_includes/async.html @@ -0,0 +1,4 @@ + \ No newline at end of file diff --git a/_includes/example_public.html b/_includes/example_public.html index 05a20c2e..51307422 100644 --- a/_includes/example_public.html +++ b/_includes/example_public.html @@ -4,11 +4,11 @@ {{ include.title }} - diff --git a/_includes/image.html b/_includes/image.html index b3897feb..cb1dfec5 100644 --- a/_includes/image.html +++ b/_includes/image.html @@ -1,2 +1,2 @@ {% if include.external %}{% assign img = include.src %}{% assign id = include.src | strip | remove: '.'| remove: '0' | remove: '1' | remove: '2' | remove: '3' | remove: '4' | remove: '5' | remove: '6' | remove: '7' | remove: '8' | remove: '9' | remove: '/' | remove: 'http:' | remove: 'https:' %}{% else %}{% assign img = "/assets/images/" | append: page.collection | append: "/" | append: include.src | relative_url %}{% assign id = include.src | strip | split: '.' %}{% endif %}
{{ include.alt }}
{{ include.alt }}
- \ No newline at end of file + \ No newline at end of file diff --git a/_includes/media_modal.html b/_includes/media_modal.html index 930df359..da49bdb8 100644 --- a/_includes/media_modal.html +++ b/_includes/media_modal.html @@ -8,11 +8,11 @@ {{ include.alt }} - diff --git a/_includes/navigation.html b/_includes/navigation.html index 1132d100..5aba9948 100644 --- a/_includes/navigation.html +++ b/_includes/navigation.html @@ -16,6 +16,20 @@ {% for subitem in submenu.subitems %} {% endfor %} @@ -27,7 +41,7 @@ {% elsif site[item.collection] %} -
- - - - - - - - - - - -
- -
- - - - Questions or concerns? Reading this privacy notice will help you understand your privacy rights and choices. If you do not agree with our policies and practices, please do not use our Services. If you still have any questions or concerns, please contact us at - SAMMI@gmail.com - . - - - -
-

-

-
SUMMARY OF KEY POINTS
-

-
This summary provides key points from our privacy notice, but you can find out more details about any of these topics by clicking the link following each key point or by using our table of contents below to find the section you are looking for. You can also click here to go directly to our table of contents.
-

-
- - - What personal information do we process? When you visit, use, or navigate our Services, we may process personal information depending on how you interact with - - SAMMI - - and the Services, the choices you make, and the products and features you use. Click - - - here to learn more. -
-

-
- - - Do we process any sensitive personal information? - - We do not process sensitive personal information. - - - -
-

-
- - - Do we receive any information from third parties? - - We do not receive any information from third parties. - - - -
-

-
How do we process your information? We process your information to provide, improve, and administer our Services, communicate with you, for security and fraud prevention, and to comply with law. We may also process your information for other purposes with your consent. We process your information only when we have a valid legal reason to do so. Click here to learn more.
-

-
- - - - In what situations and with which - - parties do we share personal information? - - We may share information in specific situations and with specific - - third parties. Click - - - here - - - to learn more. - - - -
-

-
- - - How do we keep your information safe? We have - - organizational - - and technical processes and procedures in place to protect your personal information. However, no electronic transmission over the internet or information storage technology can be guaranteed to be 100% secure, so we cannot promise or guarantee that hackers, cybercriminals, or other - - unauthorized - - third parties will not be able to defeat our security and improperly collect, access, steal, or modify your information. Click - - - here - - - to learn more. - - - -
-

-
What are your rights? Depending on where you are located geographically, the applicable privacy law may mean you have certain rights regarding your personal information. Click here to learn more.
-

-
- - - How do you exercise your rights? The easiest way to exercise your rights is by filling out our data subject request form available - - - - here - - - - , or by contacting us. We will consider and act upon any request in accordance with applicable data protection laws. - - -
-

-
- - - Want to learn more about what - - SAMMI - - does with any information we collect? Click - - - here to review the notice in full. -
-

-

-
- - - - TABLE OF CONTENTS - - - -
-

-
1. WHAT INFORMATION DO WE COLLECT?
-
- - - - 2. HOW DO WE PROCESS YOUR INFORMATION? - - - - -
-
- - - - 3. WHAT LEGAL BASES DO WE RELY ON TO PROCESS YOUR PERSONAL INFORMATION? - - - - -
-
- - 4. WHEN AND WITH WHOM DO WE SHARE YOUR PERSONAL INFORMATION? - - - - - - - - - - - - - - -
-
- - 5. DO WE USE COOKIES AND OTHER TRACKING TECHNOLOGIES? - - - - - - - - - - - - - - - - - - - - -
-
- - 6. HOW LONG DO WE KEEP YOUR INFORMATION? - - - - - - - - - - - - -
-
- - 7. HOW DO WE KEEP YOUR INFORMATION SAFE? - - - - - - - - - - - -
-
8. WHAT ARE YOUR PRIVACY RIGHTS?
-
9. CONTROLS FOR DO-NOT-TRACK FEATURES
-
10. DO CALIFORNIA RESIDENTS HAVE SPECIFIC PRIVACY RIGHTS?
-
11. DO WE MAKE UPDATES TO THIS NOTICE?
-
12. HOW CAN YOU CONTACT US ABOUT THIS NOTICE?
-
13. HOW CAN YOU REVIEW, UPDATE, OR DELETE THE DATA WE COLLECT FROM YOU?
-

-
1. WHAT INFORMATION DO WE COLLECT?
-

-
Personal information you disclose to us
-
-

-
In Short: We collect personal information that you provide to us.
-
-

-
- - We collect personal information that you voluntarily provide to us when you - - - - - express an interest in obtaining information about us or our products and Services, when you participate in activities on the Services, or otherwise when you contact us. -
-

-
- - - - - - -
-
- - - Sensitive Information. - - We do not process sensitive information. - - -
-

-
- - - - - - - - - - - - - - - - -
-
All personal information that you provide to us must be true, complete, and accurate, and you must notify us of any changes to such personal information.
-

-
- - - - -
-
Information automatically collected
-
-

-
In Short: Some information — such as your Internet Protocol (IP) address and/or browser and device characteristics — is collected automatically when you visit our Services.
-
-

-
We automatically collect certain information when you visit, use, or navigate the Services. This information does not reveal your specific identity (like your name or contact information) but may include device and usage information, such as your IP address, browser and device characteristics, operating system, language preferences, referring URLs, device name, country, location, information about how and when you use our Services, and other technical information. This information is primarily needed to maintain the security and operation of our Services, and for our internal analytics and reporting purposes.
-

-
- - - - -
-
- - Like many businesses, we also collect information through cookies and similar technologies. - - - - -
-

-
- - - - - - - -
-
- - The information we collect includes: - - - -
- -
- -
- -
- -
- -
- - - - - - - - - - - - - - - - - - - - - -
-
2. HOW DO WE PROCESS YOUR INFORMATION?
-
-

-
In Short: We process your information to provide, improve, and administer our Services, communicate with you, for security and fraud prevention, and to comply with law. We may also process your information for other purposes with your consent.
-
-

-
- - We process your personal information for a variety of reasons, depending on how you interact with our Services, including: - - - -
- - - - -
- - - - -
- - - - -
- - - - -
- - -
- - -
- - -
- - -

- - - -

- - - -

- - - -

- - - -

- - -
- - -
- - -
- - - - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- -
-
    -
  • - To save or protect an individual's vital interest. We may process your information when necessary to save or protect an individual’s vital interest, such as to prevent harm. - -
  • -
-
- - - - - -
-

-
3. WHAT LEGAL BASES DO WE RELY ON TO PROCESS YOUR INFORMATION?
-

-
- - - - In Short: We only process your personal information when we believe it is necessary and we have a valid legal reason (i.e. - - , - - legal basis) to do so under applicable law, like with your consent, to comply with laws, to provide you with services to enter into or - - fulfill - - our contractual obligations, to protect your rights, or to - - fulfill - - our legitimate business interests. - - - - - - - - - - - -
-

-
- If you are located in the EU or UK, this section applies to you. - - - - - -
-

-
The General Data Protection Regulation (GDPR) and UK GDPR require us to explain the valid legal bases we rely on in order to process your personal information. As such, we may rely on the following legal bases to process your personal information:
-
    -
  • - - - Consent. We may process your information if you have given us permission (i.e. - - , - - consent) to use your personal information for a specific purpose. You can withdraw your consent at any time. Click - - - here to learn more. -
  • -
-
- - -
- - -
-
    -
  • - - - Legal Obligations. We may process your information where we believe it is necessary for compliance with our legal obligations, such as to cooperate with a law enforcement body or regulatory agency, exercise or defend our legal rights, or disclose your information as evidence in litigation in which we are involved. - -
    -
    -
    -
  • -
-
- -
-
    -
  • - Vital Interests. We may process your information where we believe it is necessary to protect your vital interests or the vital interests of a third party, such as situations involving potential threats to the safety of any person. - -
  • -
-
- - - - - - - -
-

-
- - - If you are located in Canada, this section applies to you. - - - -
-

-
- - - We may process your information if you have given us specific permission (i.e. - - , - - express consent) to use your personal information for a specific purpose, or in situations where your permission can be inferred (i.e. - - , - - implied consent). You can withdraw your consent at any time. Click - - - here to learn more. -
-

-
In some exceptional cases, we may be legally permitted under applicable law to process your information without your consent, including, for example:
-
    -
  • If collection is clearly in the interests of an individual and consent cannot be obtained in a timely way
  • -
-
- - - - - -
-
    -
  • - - - For investigations and fraud detection and prevention - - - -
  • -
-
- -
-
    -
  • - For business transactions provided certain conditions are met - -
  • -
-
- -
-
    -
  • - If it is contained in a witness statement and the collection is necessary to assess, process, or settle an insurance claim - -
  • -
-
- -
-
    -
  • - For identifying injured, ill, or deceased persons and communicating with next of kin - -
  • -
-
- - - - - -
-
    -
  • - - - If we have reasonable grounds to believe an individual has been, is, or may be victim of financial abuse - - - -
  • -
-
- - - - - -
-
    -
  • - - - If it is reasonable to expect collection and use with consent would compromise the availability or the accuracy of the information and the collection is reasonable for purposes related to investigating a breach of an agreement or a contravention of the laws of Canada or a province - - - -
  • -
-
- - - - - -
-
    -
  • - - - If disclosure is required to comply with a subpoena, warrant, court order, or rules of the court relating to the production of records - - - -
  • -
-
- -
-
    -
  • - - - If it was produced by an individual in the course of their employment, business, or profession and the collection is consistent with the purposes for which the information was produced - - - -
  • -
-
- - - - - -
-
    -
  • - - - If the collection is solely for journalistic, artistic, or literary purposes - - - -
  • -
-
- - - - - -
-
    -
  • - - If the information is publicly available and is specified by the regulations - - -
  • -
-
- - -
-

-
4. WHEN AND WITH WHOM DO WE SHARE YOUR PERSONAL INFORMATION?
-

-
- - In Short: - - We may share information in specific situations described in this section and/or with the following - - third parties. - - - -
-
- - - -
-

-
- - - We - - may need to share your personal information in the following situations: - - -
-
    -
  • Business Transfers. We may share or transfer your information in connection with, or during negotiations of, any merger, sale of company assets, financing, or acquisition of all or a portion of our business to another company.
  • -
-
- - - - - - -
- - - - -
- - -
- - -
- - -
- - - - - - - - - - - - -
-

-
5. DO WE USE COOKIES AND OTHER TRACKING TECHNOLOGIES?
-

-
In Short: We may use cookies and other tracking technologies to collect and store your information.
-

-
- - We may use cookies and similar tracking technologies (like web beacons and pixels) to access or store information. Specific information about how we use such technologies and how you can refuse certain cookies is set out in our Cookie Notice - - - . - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-

6. HOW LONG DO WE KEEP YOUR INFORMATION?

In Short: We keep your information for as long as necessary to fulfill the purposes outlined in this privacy notice unless otherwise required by law.

We will only keep your personal information for as long as it is necessary for the purposes set out in this privacy notice, unless a longer retention period is required or permitted by law (such as tax, accounting, or other legal requirements). No purpose in this notice will require us keeping your personal information for longer than 2 years.

When we have no ongoing legitimate business need to process your personal information, we will either delete or anonymize such information, or, if this is not possible (for example, because your personal information has been stored in backup archives), then we will securely store your personal information and isolate it from any further processing until deletion is possible.

7. HOW DO WE KEEP YOUR INFORMATION SAFE?

In Short: We aim to protect your personal information through a system of organizational and technical security measures.

We have implemented appropriate and reasonable technical and organizational security measures designed to protect the security of any personal information we process. However, despite our safeguards and efforts to secure your information, no electronic transmission over the Internet or information storage technology can be guaranteed to be 100% secure, so we cannot promise or guarantee that hackers, cybercriminals, or other unauthorized third parties will not be able to defeat our security and improperly collect, access, steal, or modify your information. Although we will do our best to protect your personal information, transmission of personal information to and from our Services is at your own risk. You should only access the Services within a secure environment.

8. WHAT ARE YOUR PRIVACY RIGHTS?

In Short: In some regions, such as the European Economic Area (EEA), United Kingdom (UK), and Canada, you have rights that allow you greater access to and control over your personal information. You may review, change, or terminate your account at any time.

In some regions (like the EEA, UK, and Canada), you have certain rights under applicable data protection laws. These may include the right (i) to request access and obtain a copy of your personal information, (ii) to request rectification or erasure; (iii) to restrict the processing of your personal information; and (iv) if applicable, to data portability. In certain circumstances, you may also have the right to object to the processing of your personal information. You can make such a request by contacting us by using the contact details provided in the section "HOW CAN YOU CONTACT US ABOUT THIS NOTICE?" below.

We will consider and act upon any request in accordance with applicable data protection laws.
If you are located in the EEA or UK and you believe we are unlawfully processing your personal information, you also have the right to complain to your local data protection supervisory authority. You can find their contact details here: https://ec.europa.eu/justice/data-protection/bodies/authorities/index_en.htm.

If you are located in Switzerland, the contact details for the data protection authorities are available here: https://www.edoeb.admin.ch/edoeb/en/home.html.

Withdrawing your consent: If we are relying on your consent to process your personal information, which may be express and/or implied consent depending on the applicable law, you have the right to withdraw your consent at any time. You can withdraw your consent at any time by contacting us by using the contact details provided in the section "HOW CAN YOU CONTACT US ABOUT THIS NOTICE?" below.

However, please note that this will not affect the lawfulness of the processing before its withdrawal, nor when applicable law allows, will it affect the processing of your personal information conducted in reliance on lawful processing grounds other than consent.

Cookies and similar technologies: Most Web browsers are set to accept cookies by default. If you prefer, you can usually choose to set your browser to remove cookies and to reject cookies. If you choose to remove cookies or reject cookies, this could affect certain features or services of our Services. To opt out of interest-based advertising by advertisers on our Services visit http://www.aboutads.info/choices/.

If you have questions or comments about your privacy rights, you may email us at SAMMI@gmail.com.

9. CONTROLS FOR DO-NOT-TRACK FEATURES

Most web browsers and some mobile operating systems and mobile applications include a Do-Not-Track ("DNT") feature or setting you can activate to signal your privacy preference not to have data about your online browsing activities monitored and collected. At this stage no uniform technology standard for recognizing and implementing DNT signals has been finalized. As such, we do not currently respond to DNT browser signals or any other mechanism that automatically communicates your choice not to be tracked online. If a standard for online tracking is adopted that we must follow in the future, we will inform you about that practice in a revised version of this privacy notice.

10. DO CALIFORNIA RESIDENTS HAVE SPECIFIC PRIVACY RIGHTS?

In Short: Yes, if you are a resident of California, you are granted specific rights regarding access to your personal information.

California Civil Code Section 1798.83, also known as the "Shine The Light" law, permits our users who are California residents to request and obtain from us, once a year and free of charge, information about categories of personal information (if any) we disclosed to third parties for direct marketing purposes and the names and addresses of all third parties with which we shared personal information in the immediately preceding calendar year. If you are a California resident and would like to make such a request, please submit your request in writing to us using the contact information provided below.

If you are under 18 years of age, reside in California, and have a registered account with Services, you have the right to request removal of unwanted data that you publicly post on the Services. To request removal of such data, please contact us using the contact information provided below and include the email address associated with your account and a statement that you reside in California. We will make sure the data is not publicly displayed on the Services, but please be aware that the data may not be completely or comprehensively removed from all our systems (e.g., backups, etc.).
-

-
11. DO WE MAKE UPDATES TO THIS NOTICE?
-

-
In Short: Yes, we will update this notice as necessary to stay compliant with relevant laws.
-

-
- - We may update this privacy notice from time to time. The updated version will be indicated by an updated - - "Revised" - - date and the updated version will be effective as soon as it is accessible. If we make material changes to this privacy notice, we may notify you either by prominently posting a notice of such changes or by directly sending you a notification. We encourage you to review this privacy notice frequently to be informed of how we are protecting your information. - - -
-

-
12. HOW CAN YOU CONTACT US ABOUT THIS NOTICE?
-

-
- - If you have questions or comments about this notice, you may - - - email us at - SAMMI@gmail.com. - - - - -

13. HOW CAN YOU REVIEW, UPDATE, OR DELETE THE DATA WE COLLECT FROM YOU?
-

-
- - Based on the applicable laws of your country, you may have the right to request access to the personal information we collect from you, change that information, or delete it. To request to review, update, or delete your personal information, please - - submit a request form by clicking - - here - - . -
- - + +
+
PRIVACY POLICY

Last updated February 10, 2024



This privacy notice for SAMMI Solutions ('we', 'us', or 'our'), describes how and why we might collect, store, use, and/or share ('process') your information when you use our services ('Services'), such as when you:
  • Visit our website at sammi.solutions, or any website of ours that links to this privacy notice
  • Download and use our mobile application (SAMMI Core), or any other application of ours that links to this privacy notice
  • Engage with us in other related ways, including any sales, marketing, or events
Questions or concerns? Reading this privacy notice will help you understand your privacy rights and choices. If you do not agree with our policies and practices, please do not use our Services. If you still have any questions or concerns, please contact us at info@sammi.solutions.


SUMMARY OF KEY POINTS

This summary provides key points from our privacy notice, but you can find out more details about any of these topics by clicking the link following each key point or by using our table of contents below to find the section you are looking for.

What personal information do we process? When you visit, use, or navigate our Services, we may process personal information depending on how you interact with us and the Services, the choices you make, and the products and features you use. Learn more about personal information you disclose to us.

Do we process any sensitive personal information? We do not process sensitive personal information.

Do we receive any information from third parties? We do not receive any information from third parties.

How do we process your information? We process your information to provide, improve, and administer our Services, communicate with you, for security and fraud prevention, and to comply with law. We may also process your information for other purposes with your consent. We process your information only when we have a valid legal reason to do so. Learn more about how we process your information.

In what situations and with which parties do we share personal information? We may share information in specific situations and with specific third parties. Learn more about when and with whom we share your personal information.

How do we keep your information safe? We have organisational and technical processes and procedures in place to protect your personal information. However, no electronic transmission over the internet or information storage technology can be guaranteed to be 100% secure, so we cannot promise or guarantee that hackers, cybercriminals, or other unauthorised third parties will not be able to defeat our security and improperly collect, access, steal, or modify your information. Learn more about how we keep your information safe.

What are your rights? Depending on where you are located geographically, the applicable privacy law may mean you have certain rights regarding your personal information. Learn more about your privacy rights.

How do you exercise your rights? The easiest way to exercise your rights is by submitting a data subject access request, or by contacting us. We will consider and act upon any request in accordance with applicable data protection laws.

Want to learn more about what we do with any information we collect? Review the privacy notice in full.


TABLE OF CONTENTS



1. WHAT INFORMATION DO WE COLLECT?

Personal information you disclose to us

In Short: We collect personal information that you provide to us.

We collect personal information that you voluntarily provide to us when you express an interest in obtaining information about us or our products and Services, when you participate in activities on the Services, or otherwise when you contact us.

Personal Information Provided by You. The personal information that we collect depends on the context of your interactions with us and the Services, the choices you make, and the products and features you use. The personal information we collect may include the following:
  • de-identified user ids
Sensitive Information. We do not process sensitive information.

Application Data. If you use our application(s), we also may collect the following information if you choose to provide us with access or permission:
  • Mobile Device Data. We automatically collect device information (such as your mobile device ID, model, and manufacturer), operating system, version information and system configuration information, device and application identification numbers, browser type and version, hardware model Internet service provider and/or mobile carrier, and Internet Protocol (IP) address (or proxy server). If you are using our application(s), we may also collect information about the phone network associated with your mobile device, your mobile device’s operating system or platform, the type of mobile device you use, your mobile device’s unique device ID, and information about the features of our application(s) you accessed.
This information is primarily needed to maintain the security and operation of our application(s), for troubleshooting, and for our internal analytics and reporting purposes.

All personal information that you provide to us must be true, complete, and accurate, and you must notify us of any changes to such personal information.

Information automatically collected

In Short: Some information — such as your Internet Protocol (IP) address and/or browser and device characteristics — is collected automatically when you visit our Services.

We automatically collect certain information when you visit, use, or navigate the Services. This information does not reveal your specific identity (like your name or contact information) but may include device and usage information, such as your IP address, browser and device characteristics, operating system, language preferences, referring URLs, device name, country, location, information about how and when you use our Services, and other technical information. This information is primarily needed to maintain the security and operation of our Services, and for our internal analytics and reporting purposes.

The information we collect includes:
  • Log and Usage Data. Log and usage data is service-related, diagnostic, usage, and performance information our servers automatically collect when you access or use our Services and which we record in log files. Depending on how you interact with us, this log data may include your IP address, device information, browser type, and settings and information about your activity in the Services (such as the date/time stamps associated with your usage, pages and files viewed, searches, and other actions you take such as which features you use), device event information (such as system activity, error reports (sometimes called 'crash dumps'), and hardware settings).
  • SAMMI Core Analytics. Information collected is only used for analytical purposes, and includes an non-identifiable user-ID, the platform SAMMI Core is being run on, SAMMI Core language and version, OBS version, and number of Twitch and YouTube connections currently connected to the app.
  • SAMMI Core Crash Logs. Information collected upon a crash includes the crash type, OS version, crash message as well as any user comments that may have been provided.
2. HOW DO WE PROCESS YOUR INFORMATION?

In Short: We process your information to provide, improve, and administer our Services, communicate with you, for security and fraud prevention, and to comply with law. We may also process your information for other purposes with your consent.

We process your personal information for a variety of reasons, depending on how you interact with our Services, including:

  • To identify usage trends. We may process information about how you use our Services to better understand how they are being used so we can improve them.
  • To save or protect an individual's vital interest. We may process your information when necessary to save or protect an individual’s vital interest, such as to prevent harm.

3. WHAT LEGAL BASES DO WE RELY ON TO PROCESS YOUR INFORMATION?

In Short: We only process your personal information when we believe it is necessary and we have a valid legal reason (i.e. legal basis) to do so under applicable law, like with your consent, to comply with laws, to provide you with services to enter into or fulfil our contractual obligations, to protect your rights, or to fulfil our legitimate business interests.

If you are located in the EU or UK, this section applies to you.

The General Data Protection Regulation (GDPR) and UK GDPR require us to explain the valid legal bases we rely on in order to process your personal information. As such, we may rely on the following legal bases to process your personal information:
  • Consent. We may process your information if you have given us permission (i.e. consent) to use your personal information for a specific purpose. You can withdraw your consent at any time. Learn more about withdrawing your consent.
  • Legitimate Interests. We may process your information when we believe it is reasonably necessary to achieve our legitimate business interests and those interests do not outweigh your interests and fundamental rights and freedoms. For example, we may process your personal information for some of the purposes described in order to:
  • Analyse how our Services are used so we can improve them to engage and retain users
  • Legal Obligations. We may process your information where we believe it is necessary for compliance with our legal obligations, such as to cooperate with a law enforcement body or regulatory agency, exercise or defend our legal rights, or disclose your information as evidence in litigation in which we are involved.
  • Vital Interests. We may process your information where we believe it is necessary to protect your vital interests or the vital interests of a third party, such as situations involving potential threats to the safety of any person.

If you are located in Canada, this section applies to you.

We may process your information if you have given us specific permission (i.e. express consent) to use your personal information for a specific purpose, or in situations where your permission can be inferred (i.e. implied consent). You can withdraw your consent at any time.

In some exceptional cases, we may be legally permitted under applicable law to process your information without your consent, including, for example:
  • If collection is clearly in the interests of an individual and consent cannot be obtained in a timely way
  • For investigations and fraud detection and prevention
  • For business transactions provided certain conditions are met
  • If it is contained in a witness statement and the collection is necessary to assess, process, or settle an insurance claim
  • For identifying injured, ill, or deceased persons and communicating with next of kin
  • If we have reasonable grounds to believe an individual has been, is, or may be victim of financial abuse
  • If it is reasonable to expect collection and use with consent would compromise the availability or the accuracy of the information and the collection is reasonable for purposes related to investigating a breach of an agreement or a contravention of the laws of Canada or a province
  • If disclosure is required to comply with a subpoena, warrant, court order, or rules of the court relating to the production of records
  • If it was produced by an individual in the course of their employment, business, or profession and the collection is consistent with the purposes for which the information was produced
  • If the collection is solely for journalistic, artistic, or literary purposes
  • If the information is publicly available and is specified by the regulations

4. WHEN AND WITH WHOM DO WE SHARE YOUR PERSONAL INFORMATION?

In Short: We may share information in specific situations described in this section and/or with the following third parties.

We may need to share your personal information in the following situations:
  • Business Transfers. We may share or transfer your information in connection with, or during negotiations of, any merger, sale of company assets, financing, or acquisition of all or a portion of our business to another company.

5. HOW LONG DO WE KEEP YOUR INFORMATION?

In Short: We keep your information for as long as necessary to fulfil the purposes outlined in this privacy notice unless otherwise required by law.

We will only keep your personal information for as long as it is necessary for the purposes set out in this privacy notice, unless a longer retention period is required or permitted by law (such as tax, accounting, or other legal requirements).

When we have no ongoing legitimate business need to process your personal information, we will either delete or anonymise such information, or, if this is not possible (for example, because your personal information has been stored in backup archives), then we will securely store your personal information and isolate it from any further processing until deletion is possible.

6. HOW DO WE KEEP YOUR INFORMATION SAFE?

In Short: We aim to protect your personal information through a system of organisational and technical security measures.

We have implemented appropriate and reasonable technical and organisational security measures designed to protect the security of any personal information we process. However, despite our safeguards and efforts to secure your information, no electronic transmission over the Internet or information storage technology can be guaranteed to be 100% secure, so we cannot promise or guarantee that hackers, cybercriminals, or other unauthorised third parties will not be able to defeat our security and improperly collect, access, steal, or modify your information. Although we will do our best to protect your personal information, transmission of personal information to and from our Services is at your own risk. You should only access the Services within a secure environment.

7. DO WE COLLECT INFORMATION FROM MINORS?

In Short: We do not knowingly collect data from or market to children under 18 years of age.

We do not knowingly solicit data from or market to children under 18 years of age. By using the Services, you represent that you are at least 18 or that you are the parent or guardian of such a minor and consent to such minor dependent’s use of the Services. If we learn that personal information from users less than 18 years of age has been collected, we will deactivate the account and take reasonable measures to promptly delete such data from our records. If you become aware of any data we may have collected from children under age 18, please contact us at info@sammi.solutions.

8. WHAT ARE YOUR PRIVACY RIGHTS?

In Short: In some regions, such as the European Economic Area (EEA), United Kingdom (UK), Switzerland, and Canada, you have rights that allow you greater access to and control over your personal information. You may review, change, or terminate your account at any time.

In some regions (like the EEA, UK, Switzerland, and Canada), you have certain rights under applicable data protection laws. These may include the right (i) to request access and obtain a copy of your personal information, (ii) to request rectification or erasure; (iii) to restrict the processing of your personal information; (iv) if applicable, to data portability; and (v) not to be subject to automated decision-making. In certain circumstances, you may also have the right to object to the processing of your personal information. You can make such a request by contacting us by using the contact details provided in the section 'HOW CAN YOU CONTACT US ABOUT THIS NOTICE?' below.

We will consider and act upon any request in accordance with applicable data protection laws.
 
If you are located in the EEA or UK and you believe we are unlawfully processing your personal information, you also have the right to complain to your Member State data protection authority or UK data protection authority.

If you are located in Switzerland, you may contact the Federal Data Protection and Information Commissioner.

Withdrawing your consent: If we are relying on your consent to process your personal information, which may be express and/or implied consent depending on the applicable law, you have the right to withdraw your consent at any time. You can withdraw your consent at any time by contacting us by using the contact details provided in the section 'HOW CAN YOU CONTACT US ABOUT THIS NOTICE?' below.

However, please note that this will not affect the lawfulness of the processing before its withdrawal nor, when applicable law allows, will it affect the processing of your personal information conducted in reliance on lawful processing grounds other than consent.

If you have questions or comments about your privacy rights, you may email us at info@sammi.solutions.

9. CONTROLS FOR DO-NOT-TRACK FEATURES

Most web browsers and some mobile operating systems and mobile applications include a Do-Not-Track ('DNT') feature or setting you can activate to signal your privacy preference not to have data about your online browsing activities monitored and collected. At this stage no uniform technology standard for recognising and implementing DNT signals has been finalised. As such, we do not currently respond to DNT browser signals or any other mechanism that automatically communicates your choice not to be tracked online. If a standard for online tracking is adopted that we must follow in the future, we will inform you about that practice in a revised version of this privacy notice.

10. DO UNITED STATES RESIDENTS HAVE SPECIFIC PRIVACY RIGHTS?

In Short: If you are a resident of California, Colorado, Connecticut, Utah or Virginia, you are granted specific rights regarding access to your personal information.

What categories of personal information do we collect?

We have collected the following categories of personal information in the past twelve (12) months:

CategoryExamplesCollected
A. Identifiers
Contact details, such as real name, alias, postal address, telephone or mobile contact number, unique personal identifier, online identifier, Internet Protocol address, email address, and account name

NO

B. Personal information as defined in the California Customer Records statute
Name, contact information, education, employment, employment history, and financial information

NO

C. Protected classification characteristics under state or federal law
Gender and date of birth

NO

D. Commercial information
Transaction information, purchase history, financial details, and payment information

NO

E. Biometric information
Fingerprints and voiceprints

NO

F. Internet or other similar network activity
Browsing history, search history, online behaviour, interest data, and interactions with our and other websites, applications, systems, and advertisements

NO

G. Geolocation data
Device location

NO

H. Audio, electronic, visual, thermal, olfactory, or similar information
Images and audio, video or call recordings created in connection with our business activities

NO

I. Professional or employment-related information
Business contact details in order to provide you our Services at a business level or job title, work history, and professional qualifications if you apply for a job with us

NO

J. Education Information
Student records and directory information

NO

K. Inferences drawn from collected personal information
Inferences drawn from any of the collected personal information listed above to create a profile or summary about, for example, an individual’s preferences and characteristics

NO

L. Sensitive personal Information

NO


We will use and retain the collected personal information as needed to provide the Services or for:
  • Category B - As long as the user is using the app
We may also collect other personal information outside of these categories through instances where you interact with us in person, online, or by phone or mail in the context of:
  • Receiving help through our customer support channels;
  • Participation in customer surveys or contests; and
  • Facilitation in the delivery of our Services and to respond to your inquiries.
How do we use and share your personal information?

Learn about how we use your personal information in the section, 'HOW DO WE PROCESS YOUR INFORMATION?'

Will your information be shared with anyone else?

We may disclose your personal information with our service providers pursuant to a written contract between us and each service provider. Learn more about how we disclose personal information to in the section, 'WHEN AND WITH WHOM DO WE SHARE YOUR PERSONAL INFORMATION?'

We may use your personal information for our own business purposes, such as for undertaking internal research for technological development and demonstration. This is not considered to be 'selling' of your personal information.

We have not disclosed, sold, or shared any personal information to third parties for a business or commercial purpose in the preceding twelve (12) months. We will not sell or share personal information in the future belonging to website visitors, users, and other consumers.

California Residents

California Civil Code Section 1798.83, also known as the 'Shine The Light' law permits our users who are California residents to request and obtain from us, once a year and free of charge, information about categories of personal information (if any) we disclosed to third parties for direct marketing purposes and the names and addresses of all third parties with which we shared personal information in the immediately preceding calendar year. If you are a California resident and would like to make such a request, please submit your request in writing to us using the contact information provided below.

If you are under 18 years of age, reside in California, and have a registered account with the Services, you have the right to request removal of unwanted data that you publicly post on the Services. To request removal of such data, please contact us using the contact information provided below and include the email address associated with your account and a statement that you reside in California. We will make sure the data is not publicly displayed on the Services, but please be aware that the data may not be completely or comprehensively removed from all our systems (e.g. backups, etc.).

CCPA Privacy Notice

This section applies only to California residents. Under the California Consumer Privacy Act (CCPA), you have the rights listed below.

The California Code of Regulations defines a 'residents' as:

(1) every individual who is in the State of California for other than a temporary or transitory purpose and
(2) every individual who is domiciled in the State of California who is outside the State of California for a temporary or transitory purpose

All other individuals are defined as 'non-residents'.

If this definition of 'resident' applies to you, we must adhere to certain rights and obligations regarding your personal information.

Your rights with respect to your personal data

Right to request deletion of the data — Request to delete

You can ask for the deletion of your personal information. If you ask us to delete your personal information, we will respect your request and delete your personal information, subject to certain exceptions provided by law, such as (but not limited to) the exercise by another consumer of his or her right to free speech, our compliance requirements resulting from a legal obligation, or any processing that may be required to protect against illegal activities.

Right to be informed — Request to know

Depending on the circumstances, you have a right to know:
  • whether we collect and use your personal information;
  • the categories of personal information that we collect;
  • the purposes for which the collected personal information is used;
  • whether we sell or share personal information to third parties;
  • the categories of personal information that we sold, shared, or disclosed for a business purpose;
  • the categories of third parties to whom the personal information was sold, shared, or disclosed for a business purpose;
  • the business or commercial purpose for collecting, selling, or sharing personal information; and
  • the specific pieces of personal information we collected about you.
In accordance with applicable law, we are not obligated to provide or delete consumer information that is de-identified in response to a consumer request or to re-identify individual data to verify a consumer request.

Right to Non-Discrimination for the Exercise of a Consumer’s Privacy Rights

We will not discriminate against you if you exercise your privacy rights.

Right to Limit Use and Disclosure of Sensitive Personal Information

We do not process consumer's sensitive personal information.

Verification process

Upon receiving your request, we will need to verify your identity to determine you are the same person about whom we have the information in our system. These verification efforts require us to ask you to provide information so that we can match it with information you have previously provided us. For instance, depending on the type of request you submit, we may ask you to provide certain information so that we can match the information you provide with the information we already have on file, or we may contact you through a communication method (e.g. phone or email) that you have previously provided to us. We may also use other verification methods as the circumstances dictate.

We will only use personal information provided in your request to verify your identity or authority to make the request. To the extent possible, we will avoid requesting additional information from you for the purposes of verification. However, if we cannot verify your identity from the information already maintained by us, we may request that you provide additional information for the purposes of verifying your identity and for security or fraud-prevention purposes. We will delete such additionally provided information as soon as we finish verifying you.

Other privacy rights
  • You may object to the processing of your personal information.
  • You may request correction of your personal data if it is incorrect or no longer relevant, or ask to restrict the processing of the information.
  • You can designate an authorised agent to make a request under the CCPA on your behalf. We may deny a request from an authorised agent that does not submit proof that they have been validly authorised to act on your behalf in accordance with the CCPA.
  • You may request to opt out from future selling or sharing of your personal information to third parties. Upon receiving an opt-out request, we will act upon the request as soon as feasibly possible, but no later than fifteen (15) days from the date of the request submission.
To exercise these rights, you can contact us by submitting a data subject access request, by email at info@sammi.solutions, or by referring to the contact details at the bottom of this document. If you have a complaint about how we handle your data, we would like to hear from you.

Colorado Residents

This section applies only to Colorado residents. Under the Colorado Privacy Act (CPA), you have the rights listed below. However, these rights are not absolute, and in certain cases, we may decline your request as permitted by law.
  • Right to be informed whether or not we are processing your personal data
  • Right to access your personal data
  • Right to correct inaccuracies in your personal data
  • Right to request deletion of your personal data
  • Right to obtain a copy of the personal data you previously shared with us
  • Right to opt out of the processing of your personal data if it is used for targeted advertising, the sale of personal data, or profiling in furtherance of decisions that produce legal or similarly significant effects ('profiling')
To submit a request to exercise these rights described above, please email info@sammi.solutions or submit a data subject access request.

If we decline to take action regarding your request and you wish to appeal our decision, please email us at info@sammi.solutions. Within forty-five (45) days of receipt of an appeal, we will inform you in writing of any action taken or not taken in response to the appeal, including a written explanation of the reasons for the decisions.

Connecticut Residents

This section applies only to Connecticut residents. Under the Connecticut Data Privacy Act (CTDPA), you have the rights listed below. However, these rights are not absolute, and in certain cases, we may decline your request as permitted by law.
  • Right to be informed whether or not we are processing your personal data
  • Right to access your personal data
  • Right to correct inaccuracies in your personal data
  • Right to request deletion of your personal data
  • Right to obtain a copy of the personal data you previously shared with us
  • Right to opt out of the processing of your personal data if it is used for targeted advertising, the sale of personal data, or profiling in furtherance of decisions that produce legal or similarly significant effects ('profiling')
To submit a request to exercise these rights described above, please email info@sammi.solutions or submit a data subject access request.

If we decline to take action regarding your request and you wish to appeal our decision, please email us at info@sammi.solutions. Within sixty (60) days of receipt of an appeal, we will inform you in writing of any action taken or not taken in response to the appeal, including a written explanation of the reasons for the decisions.

Utah Residents

This section applies only to Utah residents. Under the Utah Consumer Privacy Act (UCPA), you have the rights listed below. However, these rights are not absolute, and in certain cases, we may decline your request as permitted by law.
  • Right to be informed whether or not we are processing your personal data
  • Right to access your personal data
  • Right to request deletion of your personal data
  • Right to obtain a copy of the personal data you previously shared with us
  • Right to opt out of the processing of your personal data if it is used for targeted advertising or the sale of personal data
To submit a request to exercise these rights described above, please email info@sammi.solutions or submit a data subject access request.

Virginia Residents

Under the Virginia Consumer Data Protection Act (VCDPA):

'Consumer' means a natural person who is a resident of the Commonwealth acting only in an individual or household context. It does not include a natural person acting in a commercial or employment context.

'Personal data' means any information that is linked or reasonably linkable to an identified or identifiable natural person. 'Personal data' does not include de-identified data or publicly available information.

'Sale of personal data' means the exchange of personal data for monetary consideration.

If this definition of 'consumer' applies to you, we must adhere to certain rights and obligations regarding your personal data.

Your rights with respect to your personal data
  • Right to be informed whether or not we are processing your personal data
  • Right to access your personal data
  • Right to correct inaccuracies in your personal data
  • Right to request deletion of your personal data
  • Right to obtain a copy of the personal data you previously shared with us
  • Right to opt out of the processing of your personal data if it is used for targeted advertising, the sale of personal data, or profiling in furtherance of decisions that produce legal or similarly significant effects ('profiling')
Exercise your rights provided under the Virginia VCDPA

You may contact us by email at info@sammi.solutions or submit a data subject access request.

If you are using an authorised agent to exercise your rights, we may deny a request if the authorised agent does not submit proof that they have been validly authorised to act on your behalf.

Verification process

We may request that you provide additional information reasonably necessary to verify you and your consumer's request. If you submit the request through an authorised agent, we may need to collect additional information to verify your identity before processing your request.

Upon receiving your request, we will respond without undue delay, but in all cases, within forty-five (45) days of receipt. The response period may be extended once by forty-five (45) additional days when reasonably necessary. We will inform you of any such extension within the initial 45-day response period, together with the reason for the extension.

Right to appeal

If we decline to take action regarding your request, we will inform you of our decision and reasoning behind it. If you wish to appeal our decision, please email us at info@sammi.solutions. Within sixty (60) days of receipt of an appeal, we will inform you in writing of any action taken or not taken in response to the appeal, including a written explanation of the reasons for the decisions. If your appeal is denied, you may contact the Attorney General to submit a complaint.

11. DO OTHER REGIONS HAVE SPECIFIC PRIVACY RIGHTS?

In Short: You may have additional rights based on the country you reside in.

Australia and New Zealand

We collect and process your personal information under the obligations and conditions set by Australia's Privacy Act 1988 and New Zealand's Privacy Act 2020 (Privacy Act).

This privacy notice satisfies the notice requirements defined in both Privacy Acts, in particular: what personal information we collect from you, from which sources, for which purposes, and other recipients of your personal information.

If you do not wish to provide the personal information necessary to fulfill their applicable purpose, it may affect our ability to provide our services, in particular:
  • offer you the products or services that you want
  • respond to or help with your requests
At any time, you have the right to request access to or correction of your personal information. You can make such a request by contacting us by using the contact details provided in the section 'HOW CAN YOU REVIEW, UPDATE, OR DELETE THE DATA WE COLLECT FROM YOU?'

If you believe we are unlawfully processing your personal information, you have the right to submit a complaint about a breach of the Australian Privacy Principles to the Office of the Australian Information Commissioner and a breach of New Zealand's Privacy Principles to the Office of New Zealand Privacy Commissioner.

Republic of South Africa

At any time, you have the right to request access to or correction of your personal information. You can make such a request by contacting us by using the contact details provided in the section 'HOW CAN YOU REVIEW, UPDATE, OR DELETE THE DATA WE COLLECT FROM YOU?'

If you are unsatisfied with the manner in which we address any complaint with regard to our processing of personal information, you can contact the office of the regulator, the details of which are:

General enquiries: enquiries@inforegulator.org.za

12. DO WE MAKE UPDATES TO THIS NOTICE?

In Short: Yes, we will update this notice as necessary to stay compliant with relevant laws.

We may update this privacy notice from time to time. The updated version will be indicated by an updated 'Revised' date and the updated version will be effective as soon as it is accessible. If we make material changes to this privacy notice, we may notify you either by prominently posting a notice of such changes or by directly sending you a notification. We encourage you to review this privacy notice frequently to be informed of how we are protecting your information.

13. HOW CAN YOU CONTACT US ABOUT THIS NOTICE?

If you have questions or comments about this notice, you may email us at info@sammi.solutions or contact us by post at:

SAMMI Solutions
__________
__________

14. HOW CAN YOU REVIEW, UPDATE, OR DELETE THE DATA WE COLLECT FROM YOU?

Based on the applicable laws of your country, you may have the right to request access to the personal information we collect from you, change that information, or delete it. To request to review, update, or delete your personal information, please fill out and submit a data subject access request.
-
-
- This privacy policy was created using Termly's Privacy Policy Generator. -
-

-
-
COOKIE POLICY
-

-
- - - - - Last updated - June 18, 2022 - - - - -
-

-

-

-
- - - - This Cookie Policy explains how - SAMMI - - (" - - Company - - ", "we", "us", and "our") uses cookies and similar technologies to recognize you when you visit our websites at - - https://sammi.solutions - , - - ("Websites"). It explains what these technologies are and why we use them, as well as your rights to control our use of them. - - - - -
-

-
- - - - In some cases we may use cookies to collect personal information, or that becomes personal information if we combine it with other information. - - - - - -
-

-
What are cookies?
-

-
Cookies are small data files that are placed on your computer or mobile device when you visit a website. Cookies are widely used by website owners in order to make their websites work, or to work more efficiently, as well as to provide reporting information.
-

-
- - - - Cookies set by the website owner (in this case, - SAMMI - ) are called "first party cookies". Cookies set by parties other than the website owner are called "third party cookies". Third party cookies enable third party features or functionality to be provided on or through the website (e.g. like advertising, interactive content and analytics). The parties that set these third party cookies can recognize your computer both when it visits the website in question and also when it visits certain other websites. - - - -
-

-
Why do we use cookies?
-

-
- - - - We use first - - and third - - party cookies for several reasons. Some cookies are required for technical reasons in order for our Websites to operate, and we refer to these as "essential" or "strictly necessary" cookies. Other cookies also enable us to track and target the interests of our users to enhance the experience on our Online Properties. - - Third parties serve cookies through our Websites for advertising, analytics and other purposes. - - This is described in more detail below. - - - -
-

-
- - - - The specific types of first - - and third - - party cookies served through our Websites and the purposes they perform are described below (please note that the specific cookies served may vary depending on the specific Online Properties you visit): - - - -
-

-
How can I control cookies?
-

-
You have the right to decide whether to accept or reject cookies. You can exercise your cookie rights by setting your preferences in the Cookie Consent Manager. The Cookie Consent Manager allows you to select which categories of cookies you accept or reject. Essential cookies cannot be rejected as they are strictly necessary to provide you with services.
-

-
The Cookie Consent Manager can be found in the notification banner and on our website. If you choose to reject cookies, you may still use our website though your access to some functionality and areas of our website may be restricted. You may also set or amend your web browser controls to accept or refuse cookies. As the means by which you can refuse cookies through your web browser controls vary from browser-to-browser, you should visit your browser's help menu for more information.
-

-
In addition, most advertising networks offer you a way to opt out of targeted advertising. If you would like to find out more information, please visit http://www.aboutads.info/choices/ or http://www.youronlinechoices.com.
-

-
The specific types of first and third party cookies served through our Websites and the purposes they perform are described in the table below (please note that the specific cookies served may vary depending on the specific Online Properties you visit):

Essential website cookies:
-
-

-
These cookies are strictly necessary to provide you with services available through our Websites and to use some of its features, such as access to secure areas.
-

-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Name:_GRECAPTCHA
Purpose:Used to filter spam traffic and allow only legitimate visitors to use Termly's services.
Provider:www.google.com
Service:reCAPTCHA View Service Privacy Policy
Country:United States
Type:http_cookie
Expires in:5 months 27 days
-
-
-

-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Name:__tlbcpv
Purpose:Used to record unique visitor views of the consent banner.
Provider:.termly.io
Service:Termly View Service Privacy Policy
Country:United States
Type:http_cookie
Expires in:1 year
-
-
-
-
-
-

Analytics and customization cookies:
-

These cookies collect information that is used either in aggregate form to help us understand how our Websites are being used or how effective our marketing campaigns are, or to help us customize our Websites for you.

-
- -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Name:_gat
Purpose:Used to monitor number of Google Analytics server requests when using Google Tag Manager
Provider:.itch.io
Service:Google Analytics View Service Privacy Policy
Country:United States
Type:http_cookie
Expires in:1 minute
-
-
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Name:_gid
Purpose:Keeps an entry of unique ID which is then used to come up with statistical data on website usage by visitors. It is a HTTP cookie type and expires after a browsing session.
Provider:.itch.io
Service:Google Analytics View Service Privacy Policy
Country:United States
Type:http_cookie
Expires in:1 day
-
-
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Name:_ga_#
Purpose:Used to distinguish individual users by means of designation of a randomly generated number as client identifier, which allows calculation of visits and sessions
Provider:.https://sammi.solutions
Service:Google analytics View Service Privacy Policy
Country:Netherlands
Type:http_cookie
Expires in:1 year 11 months 29 days
-
-
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Name:_ga
Purpose:It records a particular ID used to come up with data about website usage by the user. It is a HTTP cookie that expires after 2 years.
Provider:.itch.io
Service:Google Analytics View Service Privacy Policy
Country:United States
Type:http_cookie
Expires in:1 year 11 months 29 days
-
-
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Name:_ga
Purpose:It records a particular ID used to come up with data about website usage by the user. It is a HTTP cookie that expires after 2 years.
Provider:.https://sammi.solutions
Service:Google Analytics View Service Privacy Policy
Country:Netherlands
Type:http_cookie
Expires in:1 year 11 months 29 days
-
-
-
-
-
-

Advertising cookies:
-
-

These cookies are used to make advertising messages more relevant to you. They perform functions like preventing the same ad from continuously reappearing, ensuring that ads are properly displayed for advertisers, and in some cases selecting advertisements that are based on your interests.

-
- -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Name:VISITOR_INFO1_LIVE
Purpose:YouTube is a Google-owned platform for hosting and sharing videos. YouTube collects user data through videos embedded in websites, which is aggregated with profile data from other Google services in order to display targeted advertising to web visitors across a broad range of their own and other websites. Used by Google in combination with SID to verify Google user account and most recent login time.
Provider:.youtube.com
Service:YouTube View Service Privacy Policy
Country:United States
Type:server_cookie
Expires in:5 months 27 days
-
-
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Name:a
Purpose:Registers a unique ID that identifies a returning user's device. The ID is used for targeted ads.
Provider:https://sammi.solutions
Service:Cox Digital Solutions (Fomerly Adify) View Service Privacy Policy
Country:United States
Type:pixel_tracker
Expires in:session
-
-
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Name:YSC
Purpose:YouTube is a Google-owned platform for hosting and sharing videos. YouTube collects user data through videos embedded in websites, which is aggregated with profile data from other Google services in order to display targeted advertising to web visitors across a broad range of their own and other websites. Used by Google in combination with SID to verify Google user account and most recent login time.
Provider:.youtube.com
Service:YouTube View Service Privacy Policy
Country:United States
Type:http_cookie
Expires in:session
-
-
-
-
-
-

Unclassified cookies:
-
-

These are cookies that have not yet been categorized. We are in the process of classifying these cookies with the help of their providers.

-
- -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Name:unique_id
Purpose:__________
Provider:.twitch.tv
Service:__________
Country:United States
Type:http_cookie
Expires in:1 year 29 days
-
-
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Name:itchio_refs
Purpose:__________
Provider:.itch.io
Service:__________
Country:United States
Type:http_cookie
Expires in:14 days
-
-
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Name:itchio_token
Purpose:__________
Provider:.itch.io
Service:__________
Country:United States
Type:http_cookie
Expires in:session
-
-
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Name:ref%3aregister%3areferrer
Purpose:__________
Provider:.itch.io
Service:__________
Country:United States
Type:server_cookie
Expires in:session
-
-
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Name:algoliasearch-client-js
Purpose:__________
Provider:https://sammi.solutions
Service:__________
Country:Netherlands
Type:html_local_storage
Expires in:persistent
-
-
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Name:server_session_id
Purpose:__________
Provider:.twitch.tv
Service:__________
Country:United States
Type:http_cookie
Expires in:session
-
-
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Name:unique_id_durable
Purpose:__________
Provider:.twitch.tv
Service:__________
Country:United States
Type:server_cookie
Expires in:1 year 29 days
-
-
-
-
-
-

-
What about other tracking technologies, like web beacons?
-

-
- - Cookies are not the only way - - - to recognize or track visitors to a website. We may use other, similar technologies from time to time, like web beacons (sometimes called "tracking pixels" or "clear gifs"). These are tiny graphics files that contain a unique identifier that enable us to recognize when someone has visited our Websites - - or opened an e-mail including them - - . This allows us, for example, to monitor - - - - the traffic patterns of users from one page within a website to another, to deliver or communicate with cookies, to understand whether you have come to the website from an online advertisement displayed on a third-party website, to improve site performance, and to measure the success of e-mail marketing campaigns. In many instances, these technologies are reliant on cookies to function properly, and so declining cookies will impair their functioning. - - - - - -
-

-
>Do you use Flash cookies or Local Shared Objects?
-

-
Websites may also use so-called "Flash Cookies" (also known as Local Shared Objects or "LSOs") to, among other things, collect and store information about your use of our services, fraud prevention and for other site operations.
-

-
- If you do not want Flash Cookies stored on your computer, you can adjust the settings of your Flash player to block Flash Cookies storage using the tools contained in the - - - Website Storage Settings Panel - - . You can also control Flash Cookies by going to the - - Global Storage Settings Panel and following the instructions (which may include instructions that explain, for example, how to delete existing Flash Cookies (referred to "information" on the Macromedia site), how to prevent Flash LSOs from being placed on your computer without your being asked, and (for Flash Player 8 and later) how to block Flash Cookies that are not being delivered by the operator of the page you are on at the time). -
-

-
- Please note that setting the Flash Player to restrict or limit acceptance of Flash Cookies may reduce or impede the functionality of some Flash applications, including, potentially, Flash applications used in connection with our services or online content. - - - - - - - - - - - -
-

-
- - - - - - Do you serve targeted advertising? - - - - -
-

-
- Third parties may serve cookies on your computer or mobile device to serve advertising through our Websites. These companies may use information about your visits to this and other websites in order to provide relevant advertisements about goods and services that you may be interested in. They may also employ technology that is used to measure the effectiveness of advertisements. This can be accomplished by them using cookies or web beacons to collect information about your visits to this and other sites in order to provide relevant advertisements about goods and services of potential interest to you. The information collected through this process does not enable us or them to identify your name, contact details or other details that directly identify you unless you choose to provide these. - - - - - - - - - - -
-

-
How often will you update this Cookie Policy?
-

-
We may update this Cookie Policy from time to time in order to reflect, for example, changes to the cookies we use or for other operational, legal or regulatory reasons. Please therefore re-visit this Cookie Policy regularly to stay informed about our use of cookies and related technologies.
-

-
The date at the top of this Cookie Policy indicates when it was last updated.
-

-
Where can I get further information?
-

-
- - - - - If you have any questions about our use of cookies or other technologies, please email us at - SAMMI@gmail.com. - - - - -
-

- -
-
- This cookie policy was created using Termly's Cookie Consent Manager. -
+
+
+ This privacy policy was created using Termly's Privacy Policy Generator. +
diff --git a/doc_posts/_about/roadmap.md b/doc_posts/_about/roadmap.md new file mode 100644 index 00000000..9920732e --- /dev/null +++ b/doc_posts/_about/roadmap.md @@ -0,0 +1,24 @@ +--- +layout: default +title: Roadmap +permalink: /roadmap +menu: About +num: 1 +type: fullpage +ignore: true +published: false +sitemap: false +--- + +Here lies our current planned roadmap of features we are currently working on/towards, as well as a list of actively maintained services which we are always interating upon. + +Please note that any of these are subject to change at any time. + +## Roadmap +- mtion studio (Delayed) **Deadline:** Janurary 20th 2025 + +## Actively Maintained Services +- OBS Websocket +- Twitch EventSub +- Twitch API commands +- YouTube diff --git a/doc_posts/_api-overview/enabling-api.md b/doc_posts/_api-overview/enabling-api.md index 67721e2a..6151f6d2 100644 --- a/doc_posts/_api-overview/enabling-api.md +++ b/doc_posts/_api-overview/enabling-api.md @@ -10,6 +10,6 @@ Optionally you can choose a password which every call to the API will need to pa {% include image.html w="75" src="settings.png" alt="SAMMI API Settings" %} -The default port SAMMI API uses is `9450`. While we strongly encourage you to not change it, you can change it in the `SAMMI/settings.ini` file by setting the `server_port` value under `[Settings]` section to your own desired port. +The default port SAMMI API uses is `9450`. While we strongly encourage you to not change it, you can change it in the `SAMMI/settings.ini` file by setting the `api_server_port` value under `[Settings]` section to your own desired port. {% include alert.html text="SAMMI API only runs locally. Unless you expose your localhost, you cannot make calls to the API or post webhooks if a public address is required." type="warning" %} diff --git a/doc_posts/_api-overview/introduction.md b/doc_posts/_api-overview/introduction.md index 4071d48c..e5469534 100644 --- a/doc_posts/_api-overview/introduction.md +++ b/doc_posts/_api-overview/introduction.md @@ -5,8 +5,8 @@ num: 1 There are two ways to communicate with SAMMI: -1. Via its websocket which is implemented in Bridge +1. Via its websocket using [Bridge helper functions](https://github.com/SAMMISolutions/SAMMI-Bridge#sammi-bridge) 2. Via its API -While SAMMI's websocket is convenient for continuous back and forth communication with faster responses, its implementation is a bit more complicated.\ +While SAMMI's websocket is convenient for continuous back and forth communication with faster responses, its implementation is a bit more complicated, as you need to create a Bridge extension and handle any communication in the extension code.\ On the other hand, if you only need to request or send one piece of information at the time, you can simply call SAMMI's API with a HTTP request, coming from your browser, command line or a third party app that can execute it. \ No newline at end of file diff --git a/doc_posts/_commands-array/array-concat.md b/doc_posts/_commands-array/array-concat.md index 021157a6..8e869599 100644 --- a/doc_posts/_commands-array/array-concat.md +++ b/doc_posts/_commands-array/array-concat.md @@ -15,6 +15,7 @@ Both arrays must already exist. |-------|--------|-------- Array Name | String | The array to append to| Array To Transfer | String| The array to append at the end of the first array| +Delete Array | Checkbox | Whether to delete the transferred array after appending it. If checked, the array is moved instead of copied. {:class='table table-primary'} diff --git a/doc_posts/_commands-array/array-insert.md b/doc_posts/_commands-array/array-insert.md index 7716c3e8..2f1a3db2 100644 --- a/doc_posts/_commands-array/array-insert.md +++ b/doc_posts/_commands-array/array-insert.md @@ -5,7 +5,8 @@ redirect_from: - commands/96 --- -Inserts a value into an array in a specific index (position), shifting other values to the right. +Inserts a value into an array in a specific index (position), shifting other values to the right. +Supports setting the array value directly to objects/arrays without having to parse and stringify them. @@ -23,7 +24,7 @@ Inserts a value into an array in a specific index (position), shifting other val {% include image.html w="75" src="array-insert.png" alt="Visual representation of inserting a value into an array by index" %} -{% include alert.html text="You can insert other strings and numbers into an array, but not another array or object, unless it is stringified." type="warning" %} +{% include alert.html text="You can insert other strings and numbers into an array, but not another array or object, unless you use Set Button Variable command instead." type="warning" %} | Box Name | Type | Description | |-------|--------|-------- diff --git a/doc_posts/_commands-array/array-introduction.md b/doc_posts/_commands-array/array-introduction.md index 8e05dca4..7d9aeeee 100644 --- a/doc_posts/_commands-array/array-introduction.md +++ b/doc_posts/_commands-array/array-introduction.md @@ -23,7 +23,26 @@ Array position (also called index) can contain other variables or complex math, Some command boxes allow you to use not only position, but also **top** for retrieving and manipulating values in an array. Selecting **top** will target a value at the END of an array (last index). **0** will target a value at the BEGINNING of an array (index of 0). -Array is cleared every time you close or reset SAMMI. If you wish to save it, you can use [Array Stringify]({{ "commands/array#arraystringify" | relative_url }}) and [File: Save String]({{ "commands/file-ini#filesavetext" | relative_url }}) commands. +Array is cleared every time you close or reset SAMMI. If you wish to save it in a file, you can use [Stringify Array]({{ "commands/array#stringifyarray" | relative_url }}) and [INI: Save Text]({{ "commands/file-ini#inisavetext" | relative_url }}) commands. + +#### Array Weights +Allows you to weight the chances of the [Array Random]({{ "commands/array#arrayrandom" | relative_url }}) command + +Useful for making certain array positions more or less common when returning a random value. + +To add weights to an array you must create a second array with the same name +_weight added to its name. + +Array positions in the weight array must match the original array to assign the correct weight to those positions. + +Setting the weight value to the same number for multiple positions will give those positions an equal chance to be picked value% of the time divided by how many you set to the same value. E.g. Two positions set to 30 will give each a roughly 15% chance. + +Setting the weight to 0 will make the chance 0 and it will not be picked in the Array Random command. + +Numbers above 100 are possible but they will heavily weight the randomization towards that value. + +Negative numbers are not possible but decimal numbers are. + +Ideally the values you set add up to 100, 1 or the number of items in the array to get the most accurate weighting. #### Convert stacks saved in .ini files from LB1 to arrays in SAMMI If you're using the same .ini files from LioranBoard 1, you will notice that your stringified stacks don't get properly parsed when loaded back into SAMMI (they end up being objects instead of arrays). diff --git a/doc_posts/_commands-array/array-random.md b/doc_posts/_commands-array/array-random.md index 74808381..1216ade7 100644 --- a/doc_posts/_commands-array/array-random.md +++ b/doc_posts/_commands-array/array-random.md @@ -6,20 +6,21 @@ redirect_from: --- Returns a random value inside an array.\ -Very useful for displaying a random image or playing a random sound.\ +Very useful for displaying a random image or playing a random sound, to name some use cases.\ The randomization will happen with an equal chance for each value. {% include alert.html text="Need to add weights? Create a second array with the same name +_weight added to its name and add values that will act as weights (chances to happen) to add to the randomization." type="info" %} - +{% include alert.html text="Array Random does not support retrieving objects/arrays as values. You can use the Save Variable As (position) box in conjunction with the Get Button Variable command instead." type="warning" %} | Box Name | Type | Description | |-------|--------|-------- |Array Name |String | Name of the stack | Save Variable As | String | Variable name to save the random value into| -| Save Variable As (position) | String (optional) | You can enter another variable name if you wish to get the index(position) of the random value in the array +| Save Variable As (position) | String (optional) | You can enter a variable name here if you wish to get the index(position) of the random value in the array {:class='table table-primary'} -{% include example_public.html src="https://i.imgur.com/j8KycqT.png" size="100" title="Getting random array value based on different chances" pastebin="nR5kphiF" %} +{% include example_public.html src="/docs/assets/images/commands-array/arrRand_Ex.png" size="100" title="Getting random array value based on different chances" pastebin="nR5kphiF" %} +{% include example_public.html src="https://imgur.com/a/pkOzHry.png" size="100" title="Getting random Object/Array value from an array." pastebin="gxB26pWd" %} diff --git a/doc_posts/_commands-array/array-replace.md b/doc_posts/_commands-array/array-replace.md index e7082ad4..5e283f36 100644 --- a/doc_posts/_commands-array/array-replace.md +++ b/doc_posts/_commands-array/array-replace.md @@ -5,7 +5,8 @@ redirect_from: - commands/99 --- -Replaces a value inside an array, overriding the previous one. Position of all values remains the same. +Replaces a value inside an array, overriding the previous one. Position of all values remains the same. +Supports setting the array value directly to objects/arrays without having to parse and stringify them. | Box Name | Type | Description | |-------|--------|-------- diff --git a/doc_posts/_commands-buffer/buffer-save.md b/doc_posts/_commands-buffer/buffer-save.md index a655c2a1..1a782ce7 100644 --- a/doc_posts/_commands-buffer/buffer-save.md +++ b/doc_posts/_commands-buffer/buffer-save.md @@ -5,7 +5,7 @@ redirect_from: - commands/111 --- -With this command you can save the contents (raw data) of a buffer to a file, ready to be read back into memory using the Buffer: Load command. +With this command you can save the contents (raw data) of a buffer to a file, ready to be read back into memory using the Buffer: Load command. If a folder has not been created, a new one will be created with this command. {% include alert.html text="SAMMI cannot modify SAMMI system files or files outside of its own directory if Enhanced Protection in SAMMI Settings is enabled." type="warning" %} @@ -17,4 +17,4 @@ With this command you can save the contents (raw data) of a buffer to a file, re Example File Path: `/$global.main_directory$/test.txt` -{% include example_public.html src="https://i.imgur.com/3OuLvOu.png" size="100" title="Example use of correct File Path in SAMMI folder" %} +{% include example_public.html src="/docs/assets/images/commands-buffer/bufferSave_Ex.png" size="100" title="Example use of correct File Path in SAMMI folder" %} diff --git a/doc_posts/_commands-button/button-get-color.md b/doc_posts/_commands-button/button-get-color.md new file mode 100644 index 00000000..04a3ff51 --- /dev/null +++ b/doc_posts/_commands-button/button-get-color.md @@ -0,0 +1,18 @@ +--- +title: "Get Button Color" +num: 5 +version: 202610 +redirect_from: + - commands/325 +--- + +Returns the current color of a button or group as a hexadecimal RGB string without the `#` prefix. + +If Button/Group ID is left empty, SAMMI uses the button currently executing the command. + +| Box Name | Type | Description | +|-------|--------|-------- +|Button/Group ID|String|Button ID or group ID to get the color from. +|Save Variable As|String|Variable name to save the color value. +{:class='table table-primary'} + diff --git a/doc_posts/_commands-button/button-get-instance-id.md b/doc_posts/_commands-button/button-get-instance-id.md new file mode 100644 index 00000000..cf939f08 --- /dev/null +++ b/doc_posts/_commands-button/button-get-instance-id.md @@ -0,0 +1,16 @@ +--- +title: "Get Instance ID" +num: 7 +version: 202610 +redirect_from: + - commands/327 +--- + +Returns the instance ID of the active button execution. + +{% include alert.html text="Requires Developer Mode." type="info" %} + +| Box Name | Type | Description | +|-------|--------|-------- +|Save Variable As|String|Variable name to save the instance ID. +{:class='table table-primary'} diff --git a/doc_posts/_commands-button/button-get-text.md b/doc_posts/_commands-button/button-get-text.md new file mode 100644 index 00000000..3a8460ab --- /dev/null +++ b/doc_posts/_commands-button/button-get-text.md @@ -0,0 +1,18 @@ +--- +title: "Get Button Text" +num: 6 +version: 202610 +redirect_from: + - commands/326 +--- + +Returns the current text of a button or group. + +If Button/Group ID is left empty, SAMMI uses the button currently executing the command. + +| Box Name | Type | Description | +|-------|--------|-------- +|Button/Group ID|String|Button ID or group ID to get the text from. +|Save Variable As|String|Variable name to save the text value. +{:class='table table-primary'} + diff --git a/doc_posts/_commands-button/button-modify.md b/doc_posts/_commands-button/button-modify.md index c58215d9..f3469488 100644 --- a/doc_posts/_commands-button/button-modify.md +++ b/doc_posts/_commands-button/button-modify.md @@ -19,7 +19,7 @@ If you wish to reset the button back to its default appearance, set the values t |Color|color picker|Select new color for the button. {:class='table table-primary'} -{% include example_public.html src="https://i.imgur.com/t5MJmm8.gif" size="100" title="Modify colour and text of a button" pastebin="pRqfUXF8" %} +{% include example_public.html src="/docs/assets/images/commands-button/buttonMod_Ex.gif" size="100" title="Modify colour and text of a button" pastebin="pRqfUXF8" %} diff --git a/doc_posts/_commands-button/button-trigger.md b/doc_posts/_commands-button/button-trigger.md index 58a02548..c12411ff 100644 --- a/doc_posts/_commands-button/button-trigger.md +++ b/doc_posts/_commands-button/button-trigger.md @@ -6,7 +6,8 @@ redirect_from: --- Triggers any button by its ID.\ -If the button ID does not exist, sends an extension trigger instead. +If the button ID does not exist, sends an extension trigger instead.\ +Inside the button that was triggered by this command, you can use [Trigger Pull Data]({{ "commands/trigger#triggerpulldata" | relative_url }}) command to get the button and instance ID of the originating button, which can be used to set non persistent variables in the originating button. {% include alert.html text="You can right click on a button and left click on its ID to copy it into your clipboard." type="info" %} @@ -17,7 +18,7 @@ If the button ID does not exist, sends an extension trigger instead. |Queueable| checkbox | If checked and the button is already activated, it will wait for it to finish and trigger the button again. Will get queued as many times as you execute the command.
If unchecked and the button is already activated, nothing will happen. {:class='table table-primary'} -{% include example_public.html src="https://i.imgur.com/5DoZWxU.png" size="100" title="Auto-trigger a button to send messages in chat" pastebin="rJrMeWFs" %} +{% include example_public.html src="/docs/assets/images/commands-button/buttonTrig_Ex.png" size="100" title="Auto-trigger a button to send messages in chat" pastebin="rJrMeWFs" %} diff --git a/doc_posts/_commands-date-time/date-time-duration.md b/doc_posts/_commands-date-time/date-time-duration.md new file mode 100644 index 00000000..19108358 --- /dev/null +++ b/doc_posts/_commands-date-time/date-time-duration.md @@ -0,0 +1,20 @@ +--- +title: "Date/Time Duration" +num: 4 +version: 202320 +redirect_from: + - commands/307 +--- + +Converts a duration into other units. Returns an object with the number of years, months, days, hours, minutes, and seconds the provided duration converts to. + +|Box Name|Type|Description| +|--------|--------|-------- +|Variable Name|String|Variable to save the object in.| +|Duration|String|Input duration.| +|Unit|Dropdown|Input duration unit: Seconds, Minutes, Hours, Days, Months, or Years.| +|Operator|Dropdown|+= or -=| +|Number/Variable|String|Amount to be added or subtracted.| +|Unit|Dropdown|Addition/Subtraction duration unit: Seconds, Minutes, Hours, Days, Months, or Years.| +|Output Format|Dropdown|Biggest unit to return: Seconds, Minutes, Hours, Days, Months, or Years.| +{:class="table table-primary"} diff --git a/doc_posts/_commands-date-time/date-time-math.md b/doc_posts/_commands-date-time/date-time-math.md index 8bc2f33c..d5f8b1c4 100644 --- a/doc_posts/_commands-date-time/date-time-math.md +++ b/doc_posts/_commands-date-time/date-time-math.md @@ -5,7 +5,7 @@ redirect_from: - commands/248 --- -Returns a Date/Time, in the format specified, after adding or subtracting an amount of time. +Returns a Date/Time, in the format specified, after adding or subtracting an amount of time. Includes your computer's timezone in the calculation. |Box Name|Type|Description| |--------|--------|-------- @@ -19,3 +19,5 @@ Returns a Date/Time, in the format specified, after adding or subtracting an amo {:class="table table-primary"} {% include alert.html text="TIP: You can use this command with an empty Number/Variable to just change the format of a date/time." type="info" %} +{% include alert.html text="TIP: Use the {Z} Format to make your code aware of your timezone, otherwise it might cause slight issues!" type="info" %} + diff --git a/doc_posts/_commands-deck-app/deckapp-send-json.md b/doc_posts/_commands-deck-app/deckapp-send-json.md new file mode 100644 index 00000000..fcd05d45 --- /dev/null +++ b/doc_posts/_commands-deck-app/deckapp-send-json.md @@ -0,0 +1,19 @@ +--- +title: "Deck App: Send JSON" +num: 5 +version: 202610 +redirect_from: + - commands/328 +--- + +Sends a custom JSON payload to one or all connected Deck App clients. + +{% include alert.html text="Available in Deck Hopper Pro." type="info" %} +{% include alert.html text="Requires Developer Mode." type="info" %} + +| Box Name | Type | Description | +|-------|--------|-------- +|Client Name|String|Name of your Deck App. Leave empty to send to all connected Deck App clients. +|Event Name|String|Custom event name to send to the Deck App. +|JSON Payload|JSON String|JSON string containing the data to send. +{:class='table table-primary'} diff --git a/doc_posts/_commands-deck-app/deckapp-switch-deck.md b/doc_posts/_commands-deck-app/deckapp-switch-deck.md new file mode 100644 index 00000000..5fec83f1 --- /dev/null +++ b/doc_posts/_commands-deck-app/deckapp-switch-deck.md @@ -0,0 +1,16 @@ +--- +title: "Deck App: Switch Deck" +num: 1 +version: 202320 +redirect_from: + - commands/308 +--- + +Switches to a different deck in your Deck App. If Client Name is left empty, the command is sent to all connected Deck Apps. + +| Box Name | Type | Description | +|-------|--------|-------- +|Client Name|String|Name of your Deck App (set in the Deck App's connection settings). +|Select Deck/Enter ID|Dropdown|Dropdown of available decks to switch to. +|Enable Deck|Checkbox|If this is ticked, the command will check if the deck is already enabled, and if not, the deck will be enabled before switching to it. +{:class='table table-primary'} diff --git a/doc_posts/_commands-deck-app/deckapp-wait-for-choice.md b/doc_posts/_commands-deck-app/deckapp-wait-for-choice.md new file mode 100644 index 00000000..b8704431 --- /dev/null +++ b/doc_posts/_commands-deck-app/deckapp-wait-for-choice.md @@ -0,0 +1,22 @@ +--- +title: "Deck App: Wait for Choice" +num: 3 +version: 202331 +redirect_from: + - commands/322 +--- + +{% include alert.html text="Available in Deck Hopper Pro." type="info" %} + +Similar to Wait for User Choice command, but the prompt will originate from SAMMI Panel instead. +Command is available in [Developer Mode](https://sammi.solutions/docs/faq/general#developermode). + +Pauses a button execution for the specified amount of time, and a pop up message appears for the user asking for their choice. Once the user presses OK or the time runs out, it resumes the button execution and continues with the rest of the commands. + +| Box Name | Type | Description | +|-------|--------|-------- +|Client Name| String | Name of your Deck App (set in the Deck App's connection settings). +|Message| String | Popup message to show the user +|Timeout After | Number | Time in milliseconds before SAMMI resumes the button execution, leave empty to wait indefinitely +|Save Variable As | String | Variable name to save the result +{:class='table table-primary'} diff --git a/doc_posts/_commands-deck-app/deckapp-wait-for-input.md b/doc_posts/_commands-deck-app/deckapp-wait-for-input.md new file mode 100644 index 00000000..ed73e2eb --- /dev/null +++ b/doc_posts/_commands-deck-app/deckapp-wait-for-input.md @@ -0,0 +1,24 @@ +--- +title: "Deck App: Wait for Input" +num: 2 +version: 202331 +redirect_from: + - commands/321 +--- + +{% include alert.html text="Available in Deck Hopper Pro." type="info" %} + +Similar to Wait for User Input command, but the prompt will originate from the Deck App instead. +Command is available in [Developer Mode](https://sammi.solutions/docs/faq/general#developermode). + +Pauses a button execution for the specified amount of time, and a pop up message appears for the user asking for their input. Once the user presses OK or the time runs out, it resumes the button execution and continues with the rest of the commands. + + +| Box Name | Type | Description | +|-------|--------|-------- +|Client Name| String | Name of your Deck App (set in the Deck App's connection settings). +|Message| String | Popup message to show the user +|Default Text | String | Default value prefilled in the input field +|Timeout After | Number | Time in milliseconds before SAMMI resumes the button execution, leave empty to wait indefinitely +|Save Variable As | String | Variable name to save the result +{:class='table table-primary'} diff --git a/doc_posts/_commands-deck-app/deckapp-wait-for-multi-choice.md b/doc_posts/_commands-deck-app/deckapp-wait-for-multi-choice.md new file mode 100644 index 00000000..17a9fe32 --- /dev/null +++ b/doc_posts/_commands-deck-app/deckapp-wait-for-multi-choice.md @@ -0,0 +1,23 @@ +--- +title: "Deck App: Wait for Multi Choice" +num: 4 +version: 202331 +redirect_from: + - commands/323 +--- + +{% include alert.html text="Available in Deck Hopper Pro." type="info" %} + +Command is available in [Developer Mode](https://sammi.solutions/docs/faq/general#developermode). + +Pauses a button execution for the specified amount of time, and a pop up message appears for the user asking for their choice. Once the user presses OK or the time runs out, it resumes the button execution and continues with the rest of the commands. + +| Box Name | Type | Description | +|-------|--------|-------- +|Client Name| String | Name of your Deck App (set in the Deck App's connection settings). +|Message| String | Popup message to show the user +|Default Choice | String | Default choice value, must be the exact match of one of the choices in the choice array +|Choice Array name | String | Name of the array of choices to select from +|Timeout After | Number | Time in milliseconds before SAMMI resumes the button execution, leave empty to wait indefinitely +|Save Variable As | String | Variable name to save the result +{:class='table table-primary'} diff --git a/doc_posts/_commands-file-csv/csv-exists.md b/doc_posts/_commands-file-csv/csv-exists.md index b165a048..f6075f23 100644 --- a/doc_posts/_commands-file-csv/csv-exists.md +++ b/doc_posts/_commands-file-csv/csv-exists.md @@ -5,7 +5,7 @@ redirect_from: - commands/235 --- -Checks to see if a CSV file exists, and returns `true` or `false`. +Checks to see if a CSV file has been loaded into SAMMI, and returns `true` or `false`. | Box Name | Type | Description | |-------|--------|--------| diff --git a/doc_posts/_commands-file-csv/csv-get-box.md b/doc_posts/_commands-file-csv/csv-get-box.md index 3458b71e..6c139572 100644 --- a/doc_posts/_commands-file-csv/csv-get-box.md +++ b/doc_posts/_commands-file-csv/csv-get-box.md @@ -2,14 +2,14 @@ title: "CSV: Get Box" num: 17 redirect_from: - - commands/209 + - commands/206 --- -Retrives a value from a box in an existing CSV file. When retrieving values using 'Column/Row Name', the name in the yellow boxes have to be wrapped in `""` as the names are strings. If you use Column/Row Number instead, the number you input into the yellow boxes does not have to be wrapped in `""`. +Retrieves a value from a box in an existing CSV file. When retrieving values using 'Column/Row Name', the name in the yellow boxes has to be wrapped in `""` as the names are strings. If you use Column/Row Number instead, the number you input into the yellow boxes does not have to be wrapped in `""`. When you use column/row numbers, keep in mind the numbers begin with 0,0. The left-most column in a CSV file is column 0. The first row below the row of column names is row 0. -{% include image.html w="75" src="https://i.imgur.com/K9mJRb7.png" alt="CSV columns and rows" external="true" %} +{% include image.html w="75" src="csvGetBox.png" alt="CSV columns and rows" %} | Box Name | Type | Description | |-------|--------|-------- diff --git a/doc_posts/_commands-file-csv/csv-math.md b/doc_posts/_commands-file-csv/csv-math.md index d53a97cb..a0b81994 100644 --- a/doc_posts/_commands-file-csv/csv-math.md +++ b/doc_posts/_commands-file-csv/csv-math.md @@ -18,7 +18,7 @@ Execute math on columns/rows in your CSV. |Variable Name|String|Variable name to save the result. {:class='table table-primary'} -{% include image.html w="100" src="cvs_math.png" alt="CSV example with 5 columns and 3 rows" %} +{% include image.html w="100" src="csvMath.png" alt="CSV example with 5 columns and 3 rows" %} |Orientation|Column/Row Name/Number|Operator|Result| |-------|--------|--------|-------- diff --git a/doc_posts/_commands-file-csv/csv-save.md b/doc_posts/_commands-file-csv/csv-save.md index b75b91d3..66bc17f0 100644 --- a/doc_posts/_commands-file-csv/csv-save.md +++ b/doc_posts/_commands-file-csv/csv-save.md @@ -18,7 +18,7 @@ Note that the file path uses a forward slash instead of the Windows default back |File Path|String|File path to save to. Accepts both relative and absolute path. {:class='table table-primary'} -{% include example_public.html src="https://i.imgur.com/pqisayY.png" size="100" title="Save CSV file to default category" pastebin="mCDFXQJG" %} +{% include example_public.html src="/docs/assets/images/commands-file-csv/csvSave_Ex.png" size="100" title="Save CSV file to default category" pastebin="mCDFXQJG" %} diff --git a/doc_posts/_commands-file-general/file-create-folder.md b/doc_posts/_commands-file-general/file-create-folder.md new file mode 100644 index 00000000..d987d518 --- /dev/null +++ b/doc_posts/_commands-file-general/file-create-folder.md @@ -0,0 +1,25 @@ +--- +title: "File: Create Folder" +num: 2.2 +version: 202640 +redirect_from: + - commands/359 +--- + +Creates a folder at the specified path. + +| Box Name | Type | Description | +|-------|--------|-------- +|Folder Path|String|Folder path to create. Accepts both relative and absolute paths. +{:class='table table-primary'} + +Examples: + +| Folder Path | Result | +|-------|-------- +|exports|Creates an `exports` folder inside SAMMI's working directory. +|exports/screenshots|Creates a nested `screenshots` folder inside `exports`. +|C:/SAMMI/Backups|Creates or reuses the absolute folder path `C:/SAMMI/Backups`. +{:class='table table-secondary w-auto table-hover text-break'} + +{% include alert.html text="If the folder already exists, the command will not create a duplicate folder." type="info" %} diff --git a/doc_posts/_commands-file-general/file-folder-exists.md b/doc_posts/_commands-file-general/file-folder-exists.md new file mode 100644 index 00000000..ffcebbd6 --- /dev/null +++ b/doc_posts/_commands-file-general/file-folder-exists.md @@ -0,0 +1,16 @@ +--- +title: "File: Folder Exists" +num: 2.1 +version: 202610 +redirect_from: + - commands/299 +--- + +Checks if a folder already exists in a specified path. SAMMI will return `true` if the folder exists, and `false` if it doesn't. + +| Box Name | Type | Description | +|-------|--------|-------- +|File Path|String|The folder to check. Accepts both relative and absolute paths. +|Save Variable As|String|The variable name to save the return value as +{:class='table table-primary' } + diff --git a/doc_posts/_commands-file-general/file-folder-get-files.md b/doc_posts/_commands-file-general/file-folder-get-files.md new file mode 100644 index 00000000..029929b9 --- /dev/null +++ b/doc_posts/_commands-file-general/file-folder-get-files.md @@ -0,0 +1,39 @@ +--- +title: "File: Folder Get Files" +num: 2.3 +version: 202640 +redirect_from: + - commands/360 +--- + +Gets file paths from a folder and saves them as an array. + +{% include alert.html text="Available in SAMMI Pro." type="info" %} + +| Box Name | Type | Description | +|-------|--------|-------- +|Folder Path|Folder Select|Folder to get files from. +|File Extensions|String|Optional comma-separated list of file extensions to include, for example `txt,png,jpg`. Leave empty to include all files. +|Save Variable As|String|Variable name to save the resulting array. +|Include Subfolders|Checkbox|If checked, SAMMI also get files from subfolders. +{:class='table table-primary'} + +Examples: + +| Folder Path | File Extensions | Include Subfolders | Save Variable As | Saved Value Example | +|-------|--------|--------|--------|-------- +|C:/SAMMI/quotes|txt|false|files|[`C:/SAMMI/quotes/one.txt`, `C:/SAMMI/quotes/two.txt`] +|C:/SAMMI/media|png,jpg|true|images|[`C:/SAMMI/media/a.png`, `C:/SAMMI/media/sub/b.jpg`] +|exports||false|allFiles|All files directly inside the `exports` folder. +{:class='table table-secondary w-auto table-hover text-break'} + +File extension examples: + +| File Extensions | Description | +|-------|-------- +|txt|Only `.txt` files. +|.txt, .png, .jpg|Only `.txt`, `.png`, and `.jpg` files. +| |All files. +{:class='table table-secondary w-auto table-hover text-break'} + +The returned array contains full file paths. You can use `Array Get Value`, `Array Random`, or `Repeat` to work with the files afterwards. diff --git a/doc_posts/_commands-file-general/file-get-information.md b/doc_posts/_commands-file-general/file-get-information.md new file mode 100644 index 00000000..028e0c70 --- /dev/null +++ b/doc_posts/_commands-file-general/file-get-information.md @@ -0,0 +1,33 @@ +--- +title: "File: Get Information" +num: 2.4 +version: 202640 +redirect_from: + - commands/361 +--- + +Gets information about a file and saves the selected value to a variable. + +{% include alert.html text="Available in SAMMI Pro." type="info" %} + +| Box Name | Type | Description | +|-------|--------|-------- +|File Path|File Select|File to get information from. +|Type|Dropdown|Information to retrieve from the file. +|Save Variable As|String|Variable name to save the result. +{:class='table table-primary'} + +Example using `C:/SAMMI/files/example.txt`: + +| Type | Save Variable As | Saved Value Example | +|-------|--------|-------- +|File Name|fileName|example +|File Extension|fileExt|.txt +|Folder Path|folderPath|C:/SAMMI/files/ +|File Size|fileSize|1428 +|Created Date|createdDate|2026-05-08 13:42:10 +|Modified Date|modifiedDate|2026-05-08 14:05:31 +|Duration|fileDuration|Duration returned by the SAMMI_V2.dll helper, if the file type supports it. +{:class='table table-secondary w-auto table-hover text-break'} + +Returned date and duration formats may depend on the system and the SAMMI_V2.dll helper used by the command. diff --git a/doc_posts/_commands-file-general/file-read-all.md b/doc_posts/_commands-file-general/file-read-all.md index 83d6253d..55c6dc0b 100644 --- a/doc_posts/_commands-file-general/file-read-all.md +++ b/doc_posts/_commands-file-general/file-read-all.md @@ -6,7 +6,7 @@ redirect_from: - commands/256 --- -Reads a single line from a file of your choice and saves it into a variable. +Reads every line from a file and saves them into a variable either as a string, or an array. | Box Name | Type | Description | |-------|--------|-------- diff --git a/doc_posts/_commands-file-general/open-folder.md b/doc_posts/_commands-file-general/open-folder.md new file mode 100644 index 00000000..f2f68575 --- /dev/null +++ b/doc_posts/_commands-file-general/open-folder.md @@ -0,0 +1,25 @@ +--- +title: "Open Folder" +num: 2.41 +version: 202640 +redirect_from: + - commands/372 +--- + +Opens a folder in the operating system's file explorer. + +| Box Name | Type | Description | +|-------|--------|--------| +|Folder Path|Folder Select|Folder to open. Can be an absolute path or a relative path inside the SAMMI folder.| +{:class='table table-primary'} + +Examples: + +| Folder Path | Result | +|---|---| +| C:/SAMMI/exports | Opens the `exports` folder in Windows Explorer | +| exports | Opens the `exports` folder relative to the SAMMI folder | +{:class='table table-secondary w-auto table-hover text-break'} + +Notes: +- On Windows, SAMMI will open the folder using Explorer. On other platforms behavior may vary or be unsupported. \ No newline at end of file diff --git a/doc_posts/_commands-file-ini/ini-create-leaderboard.md b/doc_posts/_commands-file-ini/ini-create-leaderboard.md new file mode 100644 index 00000000..f09549c1 --- /dev/null +++ b/doc_posts/_commands-file-ini/ini-create-leaderboard.md @@ -0,0 +1,58 @@ +--- +title: "INI: Create Leaderboard" +num: 2.42 +version: 202640 +redirect_from: + - commands/371 +--- + +Generates a leaderboard from a section inside an INI file and saves the result as a string or an array. + +{% include alert.html text="Available in SAMMI Pro." type="info" %} + +| Box Name | Type | Description | +|-------|--------|--------| +|File Name|File Select|Path to the INI file. If the extension is omitted, `.ini` will be appended.| +|Section|String|The INI section to read (e.g., `leaderboard`).| +|Format|Dropdown / Writable|Output line format. Use placeholders `{Rank}`, `{Key}`, and `{Value}`. Several presets are available and the field is writable.| +|Save Variable As|String|Variable name to save the result into. +|Output As Array|Checkbox|If checked, the leaderboard is saved as an array (list) instead of a single string. +|Sort Ascending|Checkbox|If checked, entries are sorted ascending; otherwise descending. +|Max|Number|Optional maximum amount of leaderboard entries to return. Leave empty to return all entries. +{:class='table table-primary'} + +Behavior: +- SAMMI reads the specified INI section and builds a list of key/value pairs. +- Values that parse as numbers are ranked numerically; non-numeric values are ranked lexicographically (case-insensitive). +- If multiple entries share the same value they share the higher rank. For example, if two entries tie for first place they both receive rank `1`; the next entry receives rank `3`. +- If `Max` is set, only the top amount of entries are returned after sorting and ranking. +- If `Output As Array` is enabled the command saves a list of formatted lines; otherwise it saves a single newline-separated string. + +Format placeholders: +- `{Rank}` - the rank number +- `{Key}` - the INI key name +- `{Value}` - the value string from the INI + +Examples: + +Given an INI section `[scores]` with: + +``` +alice=120 +bob=95 +charlie=120 +dave=80 +eve=95 +``` + +With format `{Rank}) {Key}: {Value}` and `Sort Ascending` unchecked, the saved string will be: + +``` +1) alice: 120 +1) charlie: 120 +3) bob: 95 +3) eve: 95 +5) dave: 80 +``` + +Use the array output mode to get a list you can iterate with `Repeat` or `Array` commands. diff --git a/doc_posts/_commands-integrations/aitum-send-request.md b/doc_posts/_commands-integrations/aitum-send-request.md new file mode 100644 index 00000000..a76682f9 --- /dev/null +++ b/doc_posts/_commands-integrations/aitum-send-request.md @@ -0,0 +1,24 @@ +--- +title: "Send Aitum Request" +num: 5 +version: 202610 +redirect_from: + - commands/352 +--- + +Sends a request to the Aitum plugin through OBS WebSocket. + +You can use one of the premade request templates from the dropdown, or provide a custom OBS WebSocket request JSON. + +{% include async.html %} + +| Box Name | Type | Description | +|-------|--------|-------- +|OBS|Dropdown|OBS to send this command to, if using multiple OBS connections. +|Request JSON|JSON String|Aitum request JSON to send. +|Fetch Value|String|Optional value to fetch from the response. +|Save Variable As|String|Optional variable name to save the fetched response value. +{:class='table table-primary'} + +{% include alert.html text="Requires OBS WebSocket 5 and the Aitum plugin." type="info" %} + diff --git a/doc_posts/_commands-integrations/discord-send-file.md b/doc_posts/_commands-integrations/discord-send-file.md new file mode 100644 index 00000000..c746dc78 --- /dev/null +++ b/doc_posts/_commands-integrations/discord-send-file.md @@ -0,0 +1,29 @@ +--- +title: "Discord: Send File" +num: 1.1 +version: 202640 +redirect_from: + - commands/366 +--- + +Uploads a single file to a Discord webhook. + +{% include alert.html text="Available in SAMMI Pro." type="info" %} + +| Box Name | Type | Description | +|-------|--------|-------- +|File Path|File Select|File to upload to Discord. +|Webhook URL|String|Discord webhook URL to send the file to. +{:class='table table-primary'} + +Example: + +| File Path | Webhook URL | Result | +|-------|--------|-------- +|exports/screenshot.png|Your Discord webhook URL|Uploads `screenshot.png` to the Discord channel connected to the webhook. +|logs/latest.txt|Your Discord webhook URL|Uploads the text file to Discord. +{:class='table table-secondary w-auto table-hover text-break'} + +This command is useful together with `Source Save Screenshot`, `File: Folder Read Files`, or log/export workflows. + +{% include alert.html text="Make sure the webhook URL is kept private. Anyone with access to it can send messages to that Discord channel." type="warning" %} diff --git a/doc_posts/_commands-integrations/discord-send_message.md b/doc_posts/_commands-integrations/discord-send_message.md new file mode 100644 index 00000000..a9c6ea9e --- /dev/null +++ b/doc_posts/_commands-integrations/discord-send_message.md @@ -0,0 +1,25 @@ +--- +title: "Discord: Send Message" +num: 1 +redirect_from: + - commands/298 +--- + +Sends a new plain text message to a Discord channel. + +{% include alert.html text="To create a Webhook URL, navigate to Discord > Server Settings (or Channel Settings) > Integrations > Webhooks" type="info" %} + +| Box Name | Type | Description | +|-------|--------|--------| +|Chat Message|String|The message to be sent to the Discord channel. +|Webhook URL|String|The webhook URL of the channel you want to post the message in. +{:class='table table-primary'} + + + + + + + + + diff --git a/doc_posts/_commands-integrations/misc-voice-toggle-status.md b/doc_posts/_commands-integrations/misc-voice-toggle-status.md new file mode 100644 index 00000000..45eb812f --- /dev/null +++ b/doc_posts/_commands-integrations/misc-voice-toggle-status.md @@ -0,0 +1,9 @@ +--- +title: "Voice: Toggle Status" +num: 2 +version: 202321 +redirect_from: + - commands/313 +--- + +Toggles the listening status of SAMMI Voice - starts listening if it wasn't, stops listening if it was. diff --git a/doc_posts/_commands-integrations/mix_it_up_get_commands.md b/doc_posts/_commands-integrations/mix_it_up_get_commands.md new file mode 100644 index 00000000..36e53f8a --- /dev/null +++ b/doc_posts/_commands-integrations/mix_it_up_get_commands.md @@ -0,0 +1,20 @@ +--- +title: "Mix It Up: Get All Commands" +num: 3 +redirect_from: + - commands/319 +--- + +Returns a specific or all available Mix It Up commands. +Fill out the Command Name box to return a specific command information (stored as an object), or leave it empty to return an array of all available Mix It Up commands. +Caution: If you have a large number of commands in Mix It Up, SAMMI might not be able to fetch them all. To work around this, navigate to `http://localhost:8911/api/v2/commands?pageSize=500` in your browser, locate the command name, obtain its ID, and input it manually into [Mix It Up: Run Command](#mixitupruncommand). + +{% include alert.html text="Developer API in Mix It Up-Services must be enabled" type="info" %} + +{% include alert.html text="This command needs some time to execute, either delay your next commands by 1-2 seconds or use Wait Until Variable Exists command." type="warning" %} + +| Box Name | Type | Description | +|-------|--------|--------| +|Save Variable As|String | Variable name to save the result +|Command Name|String (optional)|The specific Mix It Up command name (will return the first occurence), leave empty to return all +{:class='table table-primary'} diff --git a/doc_posts/_commands-integrations/mix_it_up_run_command.md b/doc_posts/_commands-integrations/mix_it_up_run_command.md new file mode 100644 index 00000000..4e40799e --- /dev/null +++ b/doc_posts/_commands-integrations/mix_it_up_run_command.md @@ -0,0 +1,21 @@ +--- +title: "Mix It Up: Run Command" +num: 4 +redirect_from: + - commands/320 +--- + +Runs a specific Mix It Up command. Requires you to supply its ID which you can retrieve by using [Mix It Up: Get All Commands](#mixitupgetallcommands) command. + +You can optionally pass arguments to the command, please refer to the [Mix It Up Special Identifiers](https://wiki.mixitupapp.com/en/special-identifiers#arguments) documentation. + +{% include alert.html text="Developer API in Mix It Up-Services must be enabled" type="info" %} + +| Box Name | Type | Description | +|-------|--------|--------| +|Command ID|String | Command ID of the Mix It Up command to run +|Platform|String|The specific platform to run this command on (default = Twitch) +|Arguments|String (optional)| Optional arguments to pass to the Mix It Up command +{:class='table table-primary'} + +{% include media_modal.html vid="mixitup_runcommand.mp4" img="mix_it_up_run_command.png" w="50" btn="1" alt="Running a Mix It Up command" pastebin="FJhMchSy" %} diff --git a/doc_posts/_commands-introduction/premade-variables.md b/doc_posts/_commands-introduction/premade-variables.md index a2aee9c7..f022bc2f 100644 --- a/doc_posts/_commands-introduction/premade-variables.md +++ b/doc_posts/_commands-introduction/premade-variables.md @@ -7,61 +7,75 @@ The following premade/permanent global variables are accessible from all the but These global variables can be viewed in the Variable Viewer in your SAMMI.\ You can access them by using the `Get Global Variable` command, or reference them with `global.variablename` in a command. -{% include image.html w="75" src="premade_variables.png" alt="SAMMI Global Premade Variables" %} +{% include image.html w="75" src="https://imgur.com/BtOl2MN" alt="SAMMI Global Premade Variables" %} **General Variables** -| Variable | Explanation| +| Variable | Type | Explanation| |-------|--------|-------- -{% include selectAll.html text="main_directory" %}| Main directory where SAMMI folder resides. Useful for extension makers to be able to easily copy files. -{% include selectAll.html text="Architecture" %}| Type of architecture you're on. x64 or x86. -{% include selectAll.html text="administrator_mode" %}| True if running in Administrator mode -{% include selectAll.html text="elapsed_time" %}| Elapsed time in seconds since you last started SAMMI -{% include selectAll.html text="since_2020" %}| Elapsed time in seconds since January 1st, 2020. -{% include selectAll.html text="mouse_x" %}| Current x position of your mouse -{% include selectAll.html text="mouse_y" %}| Current y position of your mouse +{% include selectAll.html text="administrator_mode" %}| Boolean | True if running in Administrator mode. +{% include selectAll.html text="elapsed_time" %}| Number | Time in seconds since you started SAMMI. +{% include selectAll.html text="main_directory" %}| String | Main directory where SAMMI folder resides, using forward slashes (/). Useful for extension makers to be able to easily copy files. +{% include selectAll.html text="main_directory_slash" %}| String | Main directory where SAMMI folder resides, using backslashes (\\). Useful for sending file paths to OBS. +{% include selectAll.html text="mouse_x" %}| Number | Current x position of your mouse. +{% include selectAll.html text="mouse_y" %}| Number | Current y position of your mouse. +{% include selectAll.html text="since_2020" %}| Number | Elapsed time in seconds since January 1st, 2020. {:class='table table-secondary w-auto table-hover text-break' } **SAMMI Variables** -| Variable | Explanation| +| Variable | Type | Explanation| |-------|--------|-------- -{% include selectAll.html text="SAMMI" %}| An object containing information about your current SAMMI versions. -{% include selectAll.html text="SAMMI.bridge_version" %}| Your current SAMMI Bridge version -{% include selectAll.html text="SAMMI.deck_version" %}| Your current SAMMI Deck version -{% include selectAll.html text="SAMMI.sammi_version" %}| Your current SAMMI Core version -{% include selectAll.html text="client_language" %}| Language SAMMI is currently using -{% include selectAll.html text="browser_name" %}| Browser name your Bridge connected to SAMMI is using -{% include selectAll.html text="bridge_connected" %}| True if connected, false if not connected -{% include selectAll.html text="deck_connected" %}| Returns true if SAMMI deck is connected, false if not. -{% include selectAll.html text="api_server_opened" %}| Returns true if SAMMI Local API server is running. -{% include selectAll.html text="trigger_type" %}| Array that lists all available trigger types +{% include selectAll.html text="api_port" %}| Number | The port number for the Local API server. +{% include selectAll.html text="api_pw_enabled" %}| Boolean | Returns true if SAMMI Local API server has a password. +{% include selectAll.html text="api_server_opened" %}| Boolean | Returns true if SAMMI Local API server is running. +{% include selectAll.html text="bridge_connected" %}| Boolean | True if connected, false if not connected. +{% include selectAll.html text="extensions" %}| Object | Contains all extensions and their versions installed in Bridge (only if Bridge is connected to SAMMI) +{% include selectAll.html text="browser_name" %}| String | Browser name your Bridge connected to SAMMI is using. +{% include selectAll.html text="client_language" %}| String | Language SAMMI is currently using. +{% include selectAll.html text="deck_app_connections" %}| Array | Contains string names of all connected Deck Apps. +{% include selectAll.html text="deck_app_port" %}| Number | The port number for SAMMI Panel. +{% include selectAll.html text="SAMMI" %}| Object | Contains information about your current SAMMI versions. +{% include selectAll.html text="SAMMI.bridge_version" %}| String | Your current SAMMI Bridge version. +{% include selectAll.html text="SAMMI.sammi_version" %}| String | Your current SAMMI Core version. +{% include selectAll.html text="bridge_port" %}| Number | The port number for SAMMI Bridge connections. +{% include selectAll.html text="trigger_type" %}| Array | All available trigger types. +{% include selectAll.html text="Extensions" %}| Object | Shows all currently installed extensions in Bridge connected to SAMMI. {:class='table table-secondary w-auto table-hover text-break' } **Twitch Variables** -| Variable | Explanation| +| Variable | Type | Explanation| |-------|--------|-------- -{% include selectAll.html text="twitch_client_id" %}| SAMMI Twitch Client ID, used in Twitch API calls -{% include selectAll.html text="twitch_accounts" %}| Array of all linked Twitch account login names -{% include selectAll.html text="twitch_chat_connected" %}| Twitch chat connection status. True if connected, false if not connected -{% include selectAll.html text="twitch_pubsub_connected" %}| Twitch Pubsub (for Twitch alerts) connection status. True if connected, false if not connected +{% include selectAll.html text="twitch_accounts" %}| Array | All linked Twitch account login names. +{% include selectAll.html text="twitch_chat_connected" %}| Boolean | Twitch chat connection status. True if connected, false if not connected. +{% include selectAll.html text="twitch_client_id" %}| String | SAMMI Twitch Client ID, used in Twitch API calls. +{% include selectAll.html text="twitch_default_channel" %}| String | The Twitch account SAMMI recieves events from. +{% include selectAll.html text="twitch_default_chat_account" %}| String | The Twitch account SAMMI sends messages from. +{% include selectAll.html text="twitch_eventsub_connected" %}| Boolean | Returns true if SAMMI is connected to Twitch's eventsub. +{:class='table table-secondary w-auto table-hover text-break' } + +**YouTube Variables** + +| Variable | Type | Explanation| +|-------|--------|-------- +{% include selectAll.html text="youtube_accounts" %}| Array | All linked YouTube account login names. {:class='table table-secondary w-auto table-hover text-break' } **OBS Variables** -| Variable | Explanation| +| Variable | Type | Explanation| |-------|--------|-------- -{% include selectAll.html text="obs_connections" %}| An array of all your OBS connection names -{% include selectAll.html text="[obsName]" %}| An object containing information about your main/alternate OBS connection. -{% include selectAll.html text="[obsName].connected" %} | Whether you're connected to your selected OBS Name, 1 = connected, 0 = not connected -{% include selectAll.html text="[obsName].current_scene" %} | Your selected OBS current scene -{% include selectAll.html text="[obsName].previous_scene" %} | Your selected OBS previous scene -{% include selectAll.html text="[obsName].type" %} | OBSws selected type in OBS Connections, either `OBSws4`, `OBSws5` or `Auto` -{% include selectAll.html text="[obsName].ip" %} | The IP address of the OBS connection -{% include selectAll.html text="[obsName].port" %} | The port of the OBS connection -{% include selectAll.html text="[obsName].obs_studio_version" %} | Current OBS studio version the OBSws is connected to -{% include selectAll.html text="[obsName].obs_websocket_version" %} | Current OBS Websocket version the OBSws is connected to +{% include selectAll.html text="obs_connections" %}| Array | Names of all your OBS connections. +{% include selectAll.html text="[obsName]" %}| Object | Contains information about your main/alternate OBS connection. +{% include selectAll.html text="[obsName].connected" %} | Boolean | Returns true if SAMMI is connected to that OBS. +{% include selectAll.html text="[obsName].current_scene" %} | String | Your selected OBS current scene. +{% include selectAll.html text="[obsName].ip" %} | String | The IP address of the OBS connection. +{% include selectAll.html text="[obsName].obs_studio_version" %} | String | Current OBS studio version the OBSws is connected to. +{% include selectAll.html text="[obsName].obs_websocket_version" %} | String | Current OBS Websocket version the OBSws is connected to. +{% include selectAll.html text="[obsName].port" %} | Number | The port of the OBS connection. +{% include selectAll.html text="[obsName].previous_scene" %} | String | Your selected OBS previous scene. +{% include selectAll.html text="[obsName].type" %} | String | OBSws selected type in OBS Connections, either `OBSws4`, `OBSws5` or `Auto`. {:class='table table-secondary w-auto table-hover text-break' } diff --git a/doc_posts/_commands-introduction/purple-commands.md b/doc_posts/_commands-introduction/purple-commands.md index 0b0107b2..e7b492b6 100644 --- a/doc_posts/_commands-introduction/purple-commands.md +++ b/doc_posts/_commands-introduction/purple-commands.md @@ -1,9 +1,16 @@ --- -title: Purple Commands +title: Async (Purple) Commands num: 1.5 --- -You might notice that some commands are coloured purple - these commands are ones that are not instantaneous. -As such, you must [Wait](wait) for the response before continuing. +You might notice that some commands are coloured purple - these commands are ones that are not instantaneous. otherwise known as asynchronous. + +The variable name listed in the Save Variable box of these commands (if present) will not be returned immediately, meaning commands ahead run before it's returned. As such, you must [Wait until the variable exists](wait#waituntilvariableexists) to halt your button until the response is recieved. Please note that this variable must not be a variable that already exists, otherwise the `Wait Until Variable Exists` command will not run. + +{% include alert.html text='It is common to add a Delete Variable command to delete the variable you are waiting for before the async command to ensure fresh data is waited for.' type="warning" %} {% include image.html w="75" src="purple-commands.png" alt="SAMMI Purple Commands" %} + +If the async command does not contain a Save Variable box, you may choose an arbitrary amount of time using the [Wait](wait) command. + +You may also choose to let it continue without waiting if you don't need to know when it resolves. diff --git a/doc_posts/_commands-misc/misc-command-line.md b/doc_posts/_commands-misc/misc-command-line.md index e1d4c1bb..d6533c00 100644 --- a/doc_posts/_commands-misc/misc-command-line.md +++ b/doc_posts/_commands-misc/misc-command-line.md @@ -3,18 +3,21 @@ title: Command Line num: 5 redirect_from: - commands/135 + - commands/306 --- -Execute a command line command just like you do in Command Prompt. Only one line of code.\ -If SAMMI is running as admin, commands you perform will also run as admin.\ -If you want to execute more than one line of code or the command is not executed properly, convert it to a batch file and use Execute program command instead. +Allows you to execute a single line of command, similar to how you would in a Command Prompt. The command will run with the same level of permissions as SAMMI, which means if SAMMI has administrative privileges, so will your command. -{% include alert.html text="You can use |clip at the end of your command to copy the result to your clipboard and then use Load Clipboard command to load it into SAMMI." type="info" %} +If you need to execute more than one line of command or if your command does not execute properly, it is recommended to convert it into a batch file and use the [Execute program](#executeprogram) command instead. If you wish to run multiple commands within a single line, you can do so by using the '&&' symbol between each command. +The command also provides an option to capture the output of the executed command. To do this, specify a variable name in the 'Save Variable As' field. + +{% include async.html %} | Box Name | Type | Description | |-------|--------|-------- -|Command| String |Command you wish to execute. +|Command| String |The command you wish to execute. Multiple commands can be executed in one line by using '&&' between each command. +|Save Variable As|String|Enter a variable name to save the output of the executed command. {:class='table table-primary'} @@ -24,4 +27,3 @@ If you want to execute more than one line of code or the command is not executed - diff --git a/doc_posts/_commands-misc/misc-comment.md b/doc_posts/_commands-misc/misc-comment.md index 9214b8aa..250b8cd0 100644 --- a/doc_posts/_commands-misc/misc-comment.md +++ b/doc_posts/_commands-misc/misc-comment.md @@ -7,9 +7,10 @@ redirect_from: - commands/6 --- -Allows you to insert a comment and mark it as warning, information or instruction to follow.\ +Allows you to insert a comment and mark it as warning, information or instruction to follow. Supports custom color aswell.
Great for keeping your commands organized as you can nest them inside your comments. +2023.2.2 and up supports **Comment Templates**, which allow you to save a preset with a custom comment name and color. Even more organization! | Box Name | Type | Description | |-------|--------|-------- diff --git a/doc_posts/_commands-misc/deck-change-status.md b/doc_posts/_commands-misc/misc-deck-change-status.md similarity index 100% rename from doc_posts/_commands-misc/deck-change-status.md rename to doc_posts/_commands-misc/misc-deck-change-status.md diff --git a/doc_posts/_commands-misc/deck-get-status.md b/doc_posts/_commands-misc/misc-deck-get-status.md similarity index 100% rename from doc_posts/_commands-misc/deck-get-status.md rename to doc_posts/_commands-misc/misc-deck-get-status.md diff --git a/doc_posts/_commands-misc/misc-execute-program.md b/doc_posts/_commands-misc/misc-execute-program.md index 56e01ecf..5338a8a0 100644 --- a/doc_posts/_commands-misc/misc-execute-program.md +++ b/doc_posts/_commands-misc/misc-execute-program.md @@ -11,6 +11,8 @@ If SAMMI is running as admin, any program you launch through this command will a | Box Name | Type | Description | |-------|--------|-------- |File Path| String| Select or manually input a path to the .exe file you wish to run. +|Parameters|String|Optional command line parameters to pass to the program. +|Display As|Dropdown|How the launched program window should be displayed, such as hidden, shown, minimized, maximized, or default. {:class='table table-primary'} diff --git a/doc_posts/_commands-misc/misc-get-random-color.md b/doc_posts/_commands-misc/misc-get-random-color.md new file mode 100644 index 00000000..4eab0f8b --- /dev/null +++ b/doc_posts/_commands-misc/misc-get-random-color.md @@ -0,0 +1,27 @@ +--- +title: "Get Random Color" +num: 14 +version: 202640 +redirect_from: + - commands/368 +--- + +Generates a random color value and saves it to a variable. + +{% include alert.html text="Available in SAMMI Pro." type="info" %} + +| Box Name | Type | Description | +|-------|--------|-------- +|Save Variable As|String|Variable name to save the random color value. +{:class='table table-primary'} + +Example: + +| Save Variable As | Saved Value Example | Usage Example | +|-------|--------|-------- +|randomColor|16711935|Use with button color commands, OBS color values, or other commands that expect a SAMMI color value. +{:class='table table-secondary w-auto table-hover text-break'} + +The value is randomized each time the command runs. + +{% include alert.html text="The returned value can be used with SAMMI commands that expect a color value." type="info" %} diff --git a/doc_posts/_commands-misc/misc-http-download-file.md b/doc_posts/_commands-misc/misc-http-download-file.md new file mode 100644 index 00000000..3c167ba1 --- /dev/null +++ b/doc_posts/_commands-misc/misc-http-download-file.md @@ -0,0 +1,26 @@ +--- +title: HTTP Download File +num: 9.1 +version: 202510 +redirect_from: + - commands/337 + - commands/342 +--- + +Allows you to download a remote file from a URL. + +{% include async.html %} + +| Box Name | Type | Description | +|-------|--------|-------- +|URL|String|The web request URL, must start with `http` or `https` +|File Path|String|Path for the file to save into +|Save Variable As (optional)|String|Variable name to save the result into when the file finishes downloading, success or fail. +{:class='table table-primary'} + + + + + + + diff --git a/doc_posts/_commands-misc/misc-http-request.md b/doc_posts/_commands-misc/misc-http-request.md index 5f2dec92..945b3fef 100644 --- a/doc_posts/_commands-misc/misc-http-request.md +++ b/doc_posts/_commands-misc/misc-http-request.md @@ -5,9 +5,9 @@ redirect_from: - commands/169 --- -This command lets you send a web request, i.e. call an API and receive its response.\ -Use it together with [Wait For/Until]({{ "commands/wait" | relative_url }}) commands, as you can pause button execution until you get a response back. +This command lets you send a web request, i.e. call an API and receive its response. +{% include async.html %} | Box Name | Type | Description | |-------|--------|-------- @@ -18,7 +18,7 @@ Use it together with [Wait For/Until]({{ "commands/wait" | relative_url }}) comm |Save Variable As (optional)|String|Variable name to save the result into {:class='table table-primary'} -{% include example_public.html src="https://i.imgur.com/SfekTtI.png" size="100" title="Using HTTP Request to get dad jokes" pastebin="Sk1qXeV8" %} +{% include example_public.html src="/docs/assets/images/commands-misc/httpReq_Ex.png" size="100" title="Using HTTP Request to get dad jokes" pastebin="Sk1qXeV8" %} diff --git a/doc_posts/_commands-misc/misc-http-upload-file.md b/doc_posts/_commands-misc/misc-http-upload-file.md new file mode 100644 index 00000000..00514674 --- /dev/null +++ b/doc_posts/_commands-misc/misc-http-upload-file.md @@ -0,0 +1,31 @@ +--- +title: HTTP Upload File +num: 9.2 +redirect_from: + - commands/901 + - commands/309 +--- + +Allows you to transfer a file to a server by utilizing FormData. + +{% include async.html %} + +{% include alert.html text="Requires additional knowledge on data formatting and is only visible in Developer Mode." type="info" %} + + +| Box Name | Type | Description | +|-------|--------|-------- +|URL|String|The web request URL, must start with `http` or `https` +|Name|String|Name of the form field containing the file +|Form Fields Object (optional)|Object |Name of the object containing any additional form fields in a `key:value` format. +|Header Object Name (optional)|Object |Name of the object containing any required headers +|File Path|String|Path to the file to upload +|Save Variable As (optional)|String|Variable name to save the result into +{:class='table table-primary'} + + + + + + + diff --git a/doc_posts/_commands-misc/misc-overtime.md b/doc_posts/_commands-misc/misc-overtime.md index 8b7babf6..de2d4c26 100644 --- a/doc_posts/_commands-misc/misc-overtime.md +++ b/doc_posts/_commands-misc/misc-overtime.md @@ -1,6 +1,6 @@ --- title: Overtime -num: 9 +num: 999 redirect_from: - commands/137 --- diff --git a/doc_posts/_commands-misc/misc-send-json-to-extension.md b/doc_posts/_commands-misc/misc-send-json-to-extension.md new file mode 100644 index 00000000..228baf13 --- /dev/null +++ b/doc_posts/_commands-misc/misc-send-json-to-extension.md @@ -0,0 +1,35 @@ +--- +title: Send JSON to Extension +num: 10.1 +version: 202322 +redirect_from: + - commands/317 +--- + +Allows you to send payload to Bridge without needing to use an Extension Command. + +{% include alert.html text="Requires Developer Mode" type="info" %} + +You can listen to these with event listeners in extensions, such as this: + +``` +sammiclient.on('My Event Name', (payload) => { + // DO SOMETHING WITH THE EXTENSION PAYLOAD + // FromButton - button ID the extension command was triggered in + // instanceId - instance ID of a button the extension command was triggered in + const { FromButton, instanceId } = payload.Data +}); +``` + +| Box Name | Type | Description | +|-------|--------|-------- +|Event Name|String|The name of the event, or the 'hook' name to use in `sammiclient.on` +|JSON Payload|String|JSON string containing object data to be sent to the extension in bridge. Can be accessed with `payload.Data.json` +{:class='table table-primary'} + + + + + + + diff --git a/doc_posts/_commands-mouse-kb/kb-simulate-press.md b/doc_posts/_commands-mouse-kb/kb-simulate-press.md index 9c7c8629..8d62a327 100644 --- a/doc_posts/_commands-mouse-kb/kb-simulate-press.md +++ b/doc_posts/_commands-mouse-kb/kb-simulate-press.md @@ -5,12 +5,15 @@ redirect_from: - commands/3 --- -Simulates a keyboard button press. Might not work in games that have anti-cheat protection. Ensure that both SAMMI and the program you want to simulate the keyboard press in are run in Administrator mode. +Simulates a keyboard button press. +{% include alert.html text="Simulated Keypresses might not work in games that have anti-cheat protection. Ensure that both SAMMI and the program you want to simulate the keyboard press in are run in Administrator mode." type="warning" %} | Box Name | Type | Description | |-------|--------|-------- |Button | Dropdown | Keyboard button to press -|Ctrl/Alt/Shift | Checkbox | Whether you want to add any modifiers, i.e. press `Ctrl + K` +|Ctrl | Checkbox | Whether to hold `Ctrl` while pressing the selected button, i.e. press `Ctrl + K` +|Alt | Checkbox | Whether to hold `Alt` while pressing the selected button +|Shift | Checkbox | Whether to hold `Shift` while pressing the selected button |Hold Duration (ms) | Number {% include asterisk.html%} | For how long to hold the button in milliseconds {:class='table table-primary'} diff --git a/doc_posts/_commands-number/number-lerp.md b/doc_posts/_commands-number/number-lerp.md new file mode 100644 index 00000000..9b765bdc --- /dev/null +++ b/doc_posts/_commands-number/number-lerp.md @@ -0,0 +1,20 @@ +--- +title: "Lerp" +num: 9 +version: 202610 +redirect_from: + - commands/344 +--- + +Linearly interpolates between a start value and an end value. + +`Amount` is usually between `0` and `1`. `0` returns the start value, `1` returns the end value, and `0.5` returns the value halfway between them. + +| Box Name | Type | Description | +|-------|--------|-------- +|Start Value|Number {% include asterisk.html%}|Value to start from. +|End Value|Number {% include asterisk.html%}|Value to interpolate to. +|Amount|Number {% include asterisk.html%}|Interpolation amount. +|Save Variable As|String|Variable name to save the result. +{:class='table table-primary'} + diff --git a/doc_posts/_commands-number/number-random.md b/doc_posts/_commands-number/number-random.md index d89998d0..37530405 100644 --- a/doc_posts/_commands-number/number-random.md +++ b/doc_posts/_commands-number/number-random.md @@ -19,7 +19,7 @@ If you wish to have more power over randomizing values (like adding weights), it |Allow Float| checkbox| checked = random value returned can never be the maximum or minimum value itself
unchecked = random value returned can be anything including maximum and minimum possible value
*Any float value in minimum or maximum value is omitted if Float is set to False.*| {:class='table table-primary' } -{% include example_public.html src="https://i.imgur.com/lksgrO9.png" size="100" title="Change your OBS source to a random video" pastebin="YYWNYUEs" %} +{% include example_public.html src="/docs/assets/images/commands-number/numRand_Ex.png" size="100" title="Change your OBS source to a random video" pastebin="YYWNYUEs" %} diff --git a/doc_posts/_commands-number/number-remap.md b/doc_posts/_commands-number/number-remap.md new file mode 100644 index 00000000..30b396fe --- /dev/null +++ b/doc_posts/_commands-number/number-remap.md @@ -0,0 +1,22 @@ +--- +title: "Remap" +num: 8 +version: 202610 +redirect_from: + - commands/343 +--- + +Remaps a number from one range into another range. + +For example, remapping `50` from the input range `0` to `100` into the output range `0` to `1` returns `0.5`. + +| Box Name | Type | Description | +|-------|--------|-------- +|Number|Number {% include asterisk.html%}|Value to remap. +|Input Minimum|Number {% include asterisk.html%}|Minimum value of the original range. +|Input Maximum|Number {% include asterisk.html%}|Maximum value of the original range. +|Output Minimum|Number {% include asterisk.html%}|Minimum value of the target range. +|Output Maximum|Number {% include asterisk.html%}|Maximum value of the target range. +|Save Variable As|String|Variable name to save the result. +{:class='table table-primary'} + diff --git a/doc_posts/_commands-number/string-to-number.md b/doc_posts/_commands-number/string-to-number.md index 40ba2d29..7237e950 100644 --- a/doc_posts/_commands-number/string-to-number.md +++ b/doc_posts/_commands-number/string-to-number.md @@ -8,7 +8,7 @@ redirect_from: Turns a string value into a real value (number). - returns `0` if the string does not start with a number or `.` - stops the conversion if it encounters any non number in the string and returns the current converted value -- converting a value that's already real returns `0` +- converting a value that's already real returns the same value - removes any leading zeroes and rounds the number to 2 decimal points - string X beginning with a `.` will be converted to `0.X` - accepts strings with scientific notation @@ -30,7 +30,7 @@ Turns a string value into a real value (number). |"000010"|10| |"10e-2"|0,10| |"10e+2"|1000| -|10|0| +|10|10| {:class='table table-secondary w-auto table-responsive table-hover' } diff --git a/doc_posts/_commands-number/swap-red-blue.md b/doc_posts/_commands-number/swap-red-blue.md index bc3f23d8..6ef283f0 100644 --- a/doc_posts/_commands-number/swap-red-blue.md +++ b/doc_posts/_commands-number/swap-red-blue.md @@ -5,19 +5,17 @@ redirect_from: - commands/170 --- -Swaps red and blue value for a color in HEX/DEC format and returns its DEC value. +Swaps red and blue value for a color in DEC format and returns its DEC value. Useful for converting HTML colors to SAMMI or OBS colors.\ -Both SAMMI and OBS uses BGR colors instead of RGB colors. +SAMMI uses BGR colors while OBS uses ABGR colors, instead of RGB colors. + +{% include alert.html text="If you have a Hex string (like #1f9250) use Hex String To Number to get a decimal number which you can use to swap red and blue values" type="warning" %} + +{% include alert.html text="As mentioned above, OBS uses ABGR. If you're converting for use in OBS, add the number 4278190080 after conversion to make it work. Check the example below." type="warning" %} | Box Name | Type | Description | |-------|--------|-------- | Variable Name | String | Name of the variable containing the color value to swap red and blue. | {:class='table table-primary' } - - - - - - - +{% include example_public.html src="https://i.imgur.com/lV14JhI.png" size="100" title="Converting a hex string to an OBS Color" pastebin="8BfSVAC4" %} diff --git a/doc_posts/_commands-object/get-object-variable.md b/doc_posts/_commands-object/get-object-variable.md index 6ccbad6a..bf0595cc 100644 --- a/doc_posts/_commands-object/get-object-variable.md +++ b/doc_posts/_commands-object/get-object-variable.md @@ -5,7 +5,7 @@ redirect_from: - commands/164 --- -Retrievs a value associated with the specified object key. +Retrieves a value associated with the specified object key. | Box Name | Type | Description | |-------|--------|--------| diff --git a/doc_posts/_commands-object/json-get-value.md b/doc_posts/_commands-object/json-get-value.md new file mode 100644 index 00000000..cbcbc4d7 --- /dev/null +++ b/doc_posts/_commands-object/json-get-value.md @@ -0,0 +1,59 @@ +--- +title: "JSON: Get Value" +num: 10 +version: 202640 +redirect_from: + - commands/367 +--- + +Extracts a value from a JSON string by using a path and saves the result to a variable. + +| Box Name | Type | Description | +|-------|--------|-------- +|JSON|JSON String|JSON string to read from. +|Path|String|Path to the value, such as `user.name` or `items[0].name`. +|Save Variable As|String|Variable name to save the result. +{:class='table table-primary'} + +Example JSON: + +```json +{ + "user": { + "name": "Chrizzz", + "badges": ["mod", "vip", "subscriber"], + "stats": { + "level": 42, + "active": true + } + }, + "items": [ + { + "name": "Sword", + "damage": 12 + }, + { + "name": "Shield", + "defense": 8 + } + ] +} +``` + +Example paths: + +| Path | Save Variable As | Saved Value | +|-------|--------|-------- +|user.name|result|Chrizzz +|user.badges[0]|result|mod +|user.badges[2]|result|subscriber +|user.stats.level|result|42 +|user.stats.active|result|true +|items[0].name|result|Sword +|items[1].defense|result|8 +|items[0]|result|The first item object: `{ "name": "Sword", "damage": 12 }` +{:class='table table-secondary w-auto table-hover text-break'} + +You can use this command after an HTTP request, OBS request, Twitch API call, or any command that returns JSON text. + +{% include alert.html text="Keys containing dots are not supported in the path. Use simple object keys and array indexes." type="info" %} diff --git a/doc_posts/_commands-object/set-object-variable.md b/doc_posts/_commands-object/set-object-variable.md index 163140cd..7bf901ab 100644 --- a/doc_posts/_commands-object/set-object-variable.md +++ b/doc_posts/_commands-object/set-object-variable.md @@ -6,8 +6,9 @@ redirect_from: --- Create a new object key or change a value inside an existing key.\ -You cannot set other objects or arrays as object keys. - +Supports setting the values to objects/arrays without having to parse and stringify them. + +{% include alert.html text="You cannot set other objects or arrays as object keys, unless you use Set Button Variable command instead." type="warning" %} | Box Name | Type | Description | |-------|--------|--------| diff --git a/doc_posts/_commands-obs-filters/obs-filter-get-settings.md b/doc_posts/_commands-obs-filters/obs-filter-get-settings.md new file mode 100644 index 00000000..007a7c85 --- /dev/null +++ b/doc_posts/_commands-obs-filters/obs-filter-get-settings.md @@ -0,0 +1,31 @@ +--- +title: "Filter Get Settings" +num: 4 +version: 202640 +redirect_from: + - commands/363 +--- + +Gets the current settings of an OBS filter and saves them as an object. + +{% include alert.html text="Available in SAMMI Pro." type="info" %} + +| Box Name | Type | Description | +|-------|--------|-------- +|OBS|Dropdown|OBS to send this command to, if using multiple OBS connections. +|Source Name|String|Source the filter belongs to. Select from dropdown or input manually. +|Filter Name|String|Filter to get settings from. Select from dropdown or input manually. +|Save Variable As|String|Variable name to save the filter settings object. +{:class='table table-primary'} + +Example: + +| Source Name | Filter Name | Save Variable As | Saved Object Example | +|-------|--------|--------|-------- +|Webcam|Color Correction|filterSettings|Object containing filter settings such as brightness, contrast, opacity, or other values returned by OBS. +|Microphone|Noise Suppression|filterSettings|Object containing the settings returned by OBS for that audio filter. +{:class='table table-secondary w-auto table-hover text-break'} + +This is useful for reading current filter values before changing them, creating backups, or debugging filter settings. + +{% include alert.html text="The returned object depends on the filter type and only contains settings returned by OBS." type="info" %} diff --git a/doc_posts/_commands-obs-filters/obs-filter-settings.md b/doc_posts/_commands-obs-filters/obs-filter-settings.md index 4cf33802..e1a3b665 100644 --- a/doc_posts/_commands-obs-filters/obs-filter-settings.md +++ b/doc_posts/_commands-obs-filters/obs-filter-settings.md @@ -6,7 +6,7 @@ redirect_from: --- Changes or adds settings to a filter in a specified source.\ Requires the same formatting that is used in the OBS JSON file.\ -Easy way to see your current filter's settings is to use the **Check Settings button** - after filling out the Source and Filter Name boxe, you will get a pop-up showing the filter's settings, excluding any still at default values. +An easy way to see your current filter's settings is to use the **Check Settings button** - after filling out the Source and Filter Name boxes, you will get a pop-up showing the filter's settings, excluding any still at default values. {% include image_collapse.html w="100" name="filter_settings" src="filter_settings.png" alt="Find a Filter Setting's name" %} diff --git a/doc_posts/_commands-obs-general/obs_request.md b/doc_posts/_commands-obs-general/obs_request.md index 2a6995b8..2d7193a2 100644 --- a/doc_posts/_commands-obs-general/obs_request.md +++ b/doc_posts/_commands-obs-general/obs_request.md @@ -6,13 +6,11 @@ redirect_from: --- Allows you to request data from OBS websocket and save it in a variable. -This command should be followed by a `Wait until Variable Exists` command with an adequate timeout to allow for the OBS Websocket to respond. - - + -The requested value will always be inside an object called `responseData` (for OBSws 5), but may be inside a second object. You can access it with [object dot notation](https://grasshopper.app/glossary/data-types/object-dot-notation/).\ +The requested value will always be inside an object called `responseData` (for OBSws 5), but may be inside a second object. You can access it with [object dot notation](https://docs.oracle.com/en/database/oracle/oracle-database/19/adjsn/simple-dot-notation-access-to-json-data.html).\ For example, if you want to retrieve the Brightness value from a Colour Correction filter, you will notice that it is inside an object called filterSettings. `{ "filterEnabled": true, "filterKind": "color_filter_v2", "filterSettings": { "brightness": 0.078 }, "filterIndex": 0.0 }`. In this case, the Fetch Value will be `responseData.filterSettings.brightness`. Use [JSON string validator](https://jsonlint.com/) if you want to make sure your formatting is correct. @@ -26,13 +24,17 @@ Be mindful of any trailing commas in your request that will cause OBS to disconn } ``` +Use the dropdown arrow next to the OBS Command (JSON) box to make use of the premade templates to assist you (OBSws 5 only). + +{% include async.html %} + {% include alert.html text="If the name of the fetched value contains dots, it needs to be wrapped in parentheses like this: (Filter.Transform.Rotation.X)." type="warning" %} | Box Name | Type | Description | |-------|--------|-------- |OBS|Dropdown|OBS to send this command to (if using multiple OBS connections).| |OBS Command (JSON)| JSON String| JSON String to send to OBS Websocket. You can use the dropdown to select a JSON template for each request (OBSws 5 only). -|Fetch Value| String or object| Name of a value you wish to get. Leave blank to fetch the whole object.
For values inside another object use [object dot notation](https://grasshopper.app/glossary/data-types/object-dot-notation/). For values inside an array use [index position](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array). +|Fetch Value| String or object| Name of a value you wish to get. Leave blank to fetch the whole object.
For values inside another object use [object dot notation](https://docs.oracle.com/en/database/oracle/oracle-database/19/adjsn/simple-dot-notation-access-to-json-data.html). For values inside an array use [index position](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array). Save Variable As (optional)| String |Name of a variable to save the data under. {:class='table table-primary'} @@ -42,16 +44,16 @@ Save Variable As (optional)| String |Name of a variable to save the data under. |What to retrieve|OBS Command|Fetch Value| |--------|--------|--------| -|current CPU usage|{"op":6,"d":{
"requestType":"GetStats",
"requestData":{}
}}
|responseData.cpuUsage| -|Time elapsed since streaming started |{"op":6,"d":{
"requestType":"GetStreamStatus",
"requestData":{}
}}
|responseData.outputTimecode| -|Scene Item ID of a source|{"op":6,"d":{
"requestType":"GetSceneItemId",
"requestData":{"sceneName":"YOUR SCENE NAME","sourceName":"YOUR SOURCE NAME"}
}}
|responseData.sceneItemId| -|Current width of a source|{"op":6,"d":{
"requestType":"GetSceneItemTransform",
"requestData":{"sceneName":"YOUR SCENE NAME","sceneItemId":"YOUR SCENE ITEM ID"}
}}
|responseData.sceneItemTransform.width| -|Current text in a GDI source|{"op":6,"d":{
"requestType":"GetInputSettings",
"requestData":{"inputName":"YOUR SOURCE NAME"}
}}
|responseData.inputSettings.text| -|Brightness value of a Colour Correction filter|{"op":6,"d":{
"requestType":"GetSourceFilter",
"requestData":{"sourceName":"YOUR SOURCE NAME","filterName":"YOUR FILTER NAME"}
}}
|responseData.filterSettings.brightness| -|First source name in a specified scene|{"op":6,"d":{
"requestType":"GetSceneItemList",
"requestData":{"sceneName":"YOUR SCENE NAME"}
}}
|responseData.sceneItems[0].sourceName| +|current CPU usage|{"op":6,"d":{
"requestType":"GetStats",
"requestData":{}
}}
|responseData.cpuUsage| +|Time elapsed since streaming started |{"op":6,"d":{
"requestType":"GetStreamStatus",
"requestData":{}
}}
|responseData.outputTimecode| +|Scene Item ID of a source|{"op":6,"d":{
"requestType":"GetSceneItemId",
"requestData":{"sceneName":"YOUR SCENE NAME","sourceName":"YOUR SOURCE NAME"}
}}
|responseData.sceneItemId| +|Current width of a source|{"op":6,"d":{
"requestType":"GetSceneItemTransform",
"requestData":{"sceneName":"YOUR SCENE NAME","sceneItemId":"YOUR SCENE ITEM ID"}
}}
|responseData.sceneItemTransform.width| +|Current text in a GDI source|{"op":6,"d":{
"requestType":"GetInputSettings",
"requestData":{"inputName":"YOUR SOURCE NAME"}
}}
|responseData.inputSettings.text| +|Brightness value of a Colour Correction filter|{"op":6,"d":{
"requestType":"GetSourceFilter",
"requestData":{"sourceName":"YOUR SOURCE NAME","filterName":"YOUR FILTER NAME"}
}}
|responseData.filterSettings.brightness| +|First source name in a specified scene|{"op":6,"d":{
"requestType":"GetSceneItemList",
"requestData":{"sceneName":"YOUR SCENE NAME"}
}}
|responseData.sceneItems[0].sourceName| {:class='table table-secondary w-auto table-responsive table-hover text-break' } -{% include example_public.html src="https://i.imgur.com/IH9L1VE.png" size="100" title="Add 1 to Text GDI+ Source (OBSws 4)" pastebin="ccUwx1GE" %} +{% include example_public.html src="/docs/assets/images/commands-obs-general/obsReq_Ex.png" size="100" title="Add 1 to Text GDI+ Source (OBSws 4)" pastebin="ccUwx1GE" %} diff --git a/doc_posts/_commands-obs-motion/obs-motion-cropping.md b/doc_posts/_commands-obs-motion/obs-motion-cropping.md index 7bc9321e..0b47df17 100644 --- a/doc_posts/_commands-obs-motion/obs-motion-cropping.md +++ b/doc_posts/_commands-obs-motion/obs-motion-cropping.md @@ -24,7 +24,7 @@ Gradually changes the crop settings of a source over a set duration. |Smooth| Dropdown | Type of transition.
**None** = Normal, **Out** = Starts out fast and ends slow, **In** = Starts out slow and ends fast,
**In/Out**= Starts out slow, gets faster and then slows down at the end again. {:class='table table-primary'} -{% include example_public.html src="https://i.imgur.com/gnoypKZ.png" size="100" title="Change source cropping on a bits trigger" pastebin="Adg3hZpj" %} +{% include example_public.html src="/docs/assets/images/commands-obs-motion/obsMotionCrop_Ex.png" size="100" title="Change source cropping on a bits trigger" pastebin="Adg3hZpj" %} diff --git a/doc_posts/_commands-obs-motion/obs-motion-settings.md b/doc_posts/_commands-obs-motion/obs-motion-settings.md index a3ac8fde..1153c1cc 100644 --- a/doc_posts/_commands-obs-motion/obs-motion-settings.md +++ b/doc_posts/_commands-obs-motion/obs-motion-settings.md @@ -1,28 +1,19 @@ --- title: "Motion: Filter Settings" -num: 7 +num: 11 redirect_from: - commands/42 --- -Gradually transitions specified filter settings over a set duration. +Transitions specified filter settings over a set duration. | Box Name | Type | Description | |-------|--------|-------- |OBS|Dropdown|OBS to send this command to (if using multiple OBS)| -|Source Name | String Source name containing the filter. Select from dropdown or input manually. +|Source Name | String | Source name containing the filter. Select from dropdown or input manually. |Filter Name |String | Filter name to transition the settings. Select from dropdown or input manually. -|Filter Settings|JSON|The settings to be included. Formatted as a [JSON String](https://www.w3schools.com/js/js_json_syntax.asp). Must be enclosed in `{}`. +|Filter Setting| String |The string name of the setting you want to have transition. (use Check Settings to find out what string names can be used) |Value Start |Int {% include asterisk.html%}|Starting value of the filter| |Value End |Int {% include asterisk.html%}|Final value of the filter| -|Duration (ms) | Int {% include asterisk.html%}| Transition duration in milliseconds -|Smooth| dropdown | Type of transition.
**None** = Normal, **Out** = Starts out fast and ends slow, **In** = Starts out slow and ends fast,
**In/Out**= Starts out slow, gets faster and then slows down at the end again. -{:class='table table-primary'} - - - - - - - - - +|Duration (ms) {% include asterisk.html%}| Int| Transition duration in milliseconds +|Smooth| Dropdown | Type of transition.
**None** = Normal, **Out** = Starts out fast and ends slow, **In** = Starts out slow and ends fast,
**In/Out**= Starts out slow, gets faster and then slows down at the end again. +{:class='table table-primary'} \ No newline at end of file diff --git a/doc_posts/_commands-obs-recording/obs-recording-pause.md b/doc_posts/_commands-obs-recording/obs-recording-pause.md index 5b5078c8..dd02a316 100644 --- a/doc_posts/_commands-obs-recording/obs-recording-pause.md +++ b/doc_posts/_commands-obs-recording/obs-recording-pause.md @@ -5,13 +5,16 @@ redirect_from: - commands/64 --- -Pauses current recording. +Pauses the active recording in the selected OBS instance. + +Use this when OBS is currently recording and you want to pause the recording without ending the recording file. | Box Name | Type | Description | |-------|--------|-------- |OBS|Dropdown|OBS to send this command to (if using multiple OBS)| {:class='table table-primary'} +{% include alert.html text="OBS must be connected to SAMMI before this command can run. This only works when OBS supports recording pause and a recording is currently active." type="info" %} diff --git a/doc_posts/_commands-obs-recording/obs-recording-resume.md b/doc_posts/_commands-obs-recording/obs-recording-resume.md index f6efd5ef..9b287a84 100644 --- a/doc_posts/_commands-obs-recording/obs-recording-resume.md +++ b/doc_posts/_commands-obs-recording/obs-recording-resume.md @@ -5,13 +5,16 @@ redirect_from: - commands/63 --- -Resumes current recording (if paused]. +Resumes the active recording in the selected OBS instance if it is paused. + +Use this after Pause Recording to continue recording into the same recording session. | Box Name | Type | Description | |-------|--------|-------- |OBS|Dropdown|OBS to send this command to (if using multiple OBS)| {:class='table table-primary'} +{% include alert.html text="OBS must be connected to SAMMI before this command can run. This only has an effect when a recording is currently paused." type="info" %} diff --git a/doc_posts/_commands-obs-recording/obs-recording-start.md b/doc_posts/_commands-obs-recording/obs-recording-start.md index 1233f063..b273cc36 100644 --- a/doc_posts/_commands-obs-recording/obs-recording-start.md +++ b/doc_posts/_commands-obs-recording/obs-recording-start.md @@ -5,13 +5,16 @@ redirect_from: - commands/61 --- -Starts recording. +Starts recording in the selected OBS instance. + +Use this when you explicitly want OBS to begin a recording. If OBS is already recording, OBS may ignore the request or return an error depending on the OBS WebSocket version. | Box Name | Type | Description | |-------|--------|-------- |OBS|Dropdown|OBS to send this command to (if using multiple OBS)| {:class='table table-primary'} +{% include alert.html text="OBS must be connected to SAMMI before this command can run. Recording output settings are handled by OBS, not by SAMMI." type="info" %} diff --git a/doc_posts/_commands-obs-recording/obs-recording-stop.md b/doc_posts/_commands-obs-recording/obs-recording-stop.md index 5e2d082a..61aa9857 100644 --- a/doc_posts/_commands-obs-recording/obs-recording-stop.md +++ b/doc_posts/_commands-obs-recording/obs-recording-stop.md @@ -5,13 +5,16 @@ redirect_from: - commands/62 --- -Stops current recording. +Stops the active recording in the selected OBS instance. + +Use this when you explicitly want OBS to finish the current recording. The final file location and format are controlled by your OBS recording settings. | Box Name | Type | Description | |-------|--------|-------- |OBS|Dropdown|OBS to send this command to (if using multiple OBS)| {:class='table table-primary'} +{% include alert.html text="OBS must be connected to SAMMI before this command can run. If OBS is not recording, OBS may ignore the request or return an error depending on the OBS WebSocket version." type="info" %} diff --git a/doc_posts/_commands-obs-recording/obs-recording-toggle.md b/doc_posts/_commands-obs-recording/obs-recording-toggle.md index b5a5e1ee..325849f9 100644 --- a/doc_posts/_commands-obs-recording/obs-recording-toggle.md +++ b/doc_posts/_commands-obs-recording/obs-recording-toggle.md @@ -5,13 +5,16 @@ redirect_from: - commands/60 --- -Toggles recording on and off. +Toggles recording on or off in the selected OBS instance. + +Use this when the same button should start recording if OBS is idle, or stop recording if OBS is already recording. | Box Name | Type | Description | |-------|--------|-------- |OBS|Dropdown|OBS to send this command to (if using multiple OBS)| {:class='table table-primary'} +{% include alert.html text="OBS must be connected to SAMMI before this command can run. If you need predictable one-way behavior, use Start Recording or Stop Recording instead." type="info" %} diff --git a/doc_posts/_commands-obs-scenes/obs-get-scene-list.md b/doc_posts/_commands-obs-scenes/obs-get-scene-list.md new file mode 100644 index 00000000..7624420d --- /dev/null +++ b/doc_posts/_commands-obs-scenes/obs-get-scene-list.md @@ -0,0 +1,26 @@ +--- +title: "OBS Get Scene List" +num: 8 +version: 202640 +redirect_from: + - commands/364 +--- + +Gets the current OBS scene list and saves the scene names as an array. + +{% include alert.html text="Available in SAMMI Pro." type="info" %} + +| Box Name | Type | Description | +|-------|--------|-------- +|OBS|Dropdown|OBS to get the scene list from, if using multiple OBS connections. +|Save Variable As|String|Variable name to save the scene name array. +{:class='table table-primary'} + +Example: + +| OBS Scenes | Save Variable As | Saved Array | +|-------|--------|-------- +|Starting, Gameplay, BRB, Ending|sceneList|[`Starting`, `Gameplay`, `BRB`, `Ending`] +{:class='table table-secondary w-auto table-hover text-break'} + +You can combine this command with `Array Get Size`, `Array Get Value`, or `Repeat` to loop through all OBS scenes. diff --git a/doc_posts/_commands-obs-sources/obs-center-point.md b/doc_posts/_commands-obs-sources/obs-center-point.md index 61e83c9e..748ddd5d 100644 --- a/doc_posts/_commands-obs-sources/obs-center-point.md +++ b/doc_posts/_commands-obs-sources/obs-center-point.md @@ -5,7 +5,7 @@ redirect_from: - commands/75 --- -Changes the positional alignment of a source.\ +Changes the positional alignment of a source. | Box Name | Type | Description | |-------|--------|-------- @@ -14,12 +14,3 @@ Changes the positional alignment of a source.\ |Source Name| String| Source name. Select from the menu or type manually. |Type| Dropdown |Type of the alignment. Select from the dropdown. {:class='table table-primary'} - - - - - - - - - diff --git a/doc_posts/_commands-obs-sources/obs-get-source-list.md b/doc_posts/_commands-obs-sources/obs-get-source-list.md new file mode 100644 index 00000000..458dc418 --- /dev/null +++ b/doc_posts/_commands-obs-sources/obs-get-source-list.md @@ -0,0 +1,28 @@ +--- +title: "OBS Get Source List" +num: 20 +version: 202640 +redirect_from: + - commands/365 +--- + +Gets OBS source names and saves them as an array. If a scene is selected, only sources in that scene are returned. If the scene field is empty, all known sources are returned. + +{% include alert.html text="Available in SAMMI Pro." type="info" %} + +| Box Name | Type | Description | +|-------|--------|-------- +|OBS|Dropdown|OBS to get the source list from, if using multiple OBS connections. +|Scene Name|String|Optional scene to get sources from. Leave empty to get all known sources. +|Save Variable As|String|Variable name to save the source name array. +{:class='table table-primary'} + +Examples: + +| Scene Name | Save Variable As | Saved Array Example | +|-------|--------|-------- +|Gameplay|sourceList|[`Game Capture`, `Webcam`, `Chat`, `Alerts`] +| |sourceList|All known OBS sources from the current OBS connection. +{:class='table table-secondary w-auto table-hover text-break'} + +Use an empty scene name when you want every known source, or select a scene when you only want the sources currently listed in that scene. diff --git a/doc_posts/_commands-obs-sources/obs-source-get-settings.md b/doc_posts/_commands-obs-sources/obs-source-get-settings.md new file mode 100644 index 00000000..282590b3 --- /dev/null +++ b/doc_posts/_commands-obs-sources/obs-source-get-settings.md @@ -0,0 +1,30 @@ +--- +title: "Source Get Settings" +num: 19 +version: 202640 +redirect_from: + - commands/362 +--- + +Gets the current settings of an OBS source and saves them as an object. + +{% include alert.html text="Available in SAMMI Pro." type="info" %} + +| Box Name | Type | Description | +|-------|--------|-------- +|OBS|Dropdown|OBS to send this command to, if using multiple OBS connections. +|Source Name|String|OBS source to get settings from. Select from dropdown or input manually. +|Save Variable As|String|Variable name to save the settings object. +{:class='table table-primary'} + +Example: + +| Source Name | Save Variable As | Saved Object Example | +|-------|--------|-------- +|Browser Source|sourceSettings|Object containing keys such as `url`, `width`, `height`, and other settings returned by OBS. +|Image Source|sourceSettings|Object containing keys such as `file` and source-specific image settings returned by OBS. +{:class='table table-secondary w-auto table-hover text-break'} + +After saving the object, use `Object Get Variable` or `JSON: Get Value` after stringifying the object to read a specific setting. + +{% include alert.html text="The returned object depends on the OBS source type. Browser sources, image sources, media sources, and text sources all return different setting keys." type="info" %} diff --git a/doc_posts/_commands-obs-sources/obs-source-get-transform.md b/doc_posts/_commands-obs-sources/obs-source-get-transform.md new file mode 100644 index 00000000..5850bc8a --- /dev/null +++ b/doc_posts/_commands-obs-sources/obs-source-get-transform.md @@ -0,0 +1,39 @@ +--- +title: "Source Get Transform" +num: 21 +version: 202640 +redirect_from: + - commands/370 +--- + +Gets transform data for an OBS source in a scene and saves it as an object. + +{% include alert.html text="Available in SAMMI Pro." type="info" %} + +| Box Name | Type | Description | +|-------|--------|-------- +|OBS|Dropdown|OBS to send this command to, if using multiple OBS connections. +|Scene Name|String|Scene the source is located in. Select from dropdown or input manually. +|Source Name|String|Source to get transform data from. Select from dropdown or input manually. +|Save Variable As|String|Variable name to save the transform object. +{:class='table table-primary'} + +Example: + +| Scene Name | Source Name | Save Variable As | Saved Object Example | +|-------|--------|--------|-------- +|Gameplay|Webcam|webcamTransform|Object containing transform values returned by OBS. +{:class='table table-secondary w-auto table-hover text-break'} + +Typical values can include: + +| Key | Description | +|-------|-------- +|positionX / positionY|Source position inside the scene. +|width / height|Current source size after transform. +|rotation|Source rotation. +|cropLeft / cropTop / cropRight / cropBottom|Crop values. +|sourceWidth / sourceHeight|Original source size. +{:class='table table-secondary w-auto table-hover text-break'} + +The exact keys depend on what OBS returns for the selected source and OBS WebSocket version. diff --git a/doc_posts/_commands-obs-sources/obs-source-save-screenshot.md b/doc_posts/_commands-obs-sources/obs-source-save-screenshot.md new file mode 100644 index 00000000..843bb105 --- /dev/null +++ b/doc_posts/_commands-obs-sources/obs-source-save-screenshot.md @@ -0,0 +1,20 @@ +--- +title: "Source Save Screenshot" +num: 18 +version: 202610 +redirect_from: + - commands/353 +--- + +Saves a screenshot of an OBS source or scene to a local PNG file. + +{% include alert.html text="Available in SAMMI Pro." type="info" %} +{% include alert.html text="This command requires OBS WebSocket 5." type="info" %} + +| Box Name | Type | Description | +|-------|--------|-------- +|OBS|Dropdown|OBS to send this command to, if using multiple OBS connections. +|Source Name|String|Name of the OBS source or scene to capture. +|File Path|File Select|Local path to save the screenshot to. +{:class='table table-primary'} + diff --git a/doc_posts/_commands-obs-sources/obs-toggle-visibility.md b/doc_posts/_commands-obs-sources/obs-toggle-visibility.md index e34f5b20..5a654dae 100644 --- a/doc_posts/_commands-obs-sources/obs-toggle-visibility.md +++ b/doc_posts/_commands-obs-sources/obs-toggle-visibility.md @@ -16,4 +16,4 @@ Toggles the visibility of a source. If the source is visible it's turn off and v |Source Name| String| Source name. Select from the menu or type manually. {:class='table table-primary'} -{% include example_public.html src="https://i.imgur.com/FV2rq3Z.png" size="100" title="Toggle source visibility" pastebin="bhbqhRuy" %} +{% include example_public.html src="/docs/assets/images/commands-obs-sources/obsTogVis_Ex.png" size="100" title="Toggle source visibility" pastebin="bhbqhRuy" %} diff --git a/doc_posts/_commands-obs-streaming/obs-streaming-start.md b/doc_posts/_commands-obs-streaming/obs-streaming-start.md index 27b7cf01..7def8887 100644 --- a/doc_posts/_commands-obs-streaming/obs-streaming-start.md +++ b/doc_posts/_commands-obs-streaming/obs-streaming-start.md @@ -5,13 +5,16 @@ redirect_from: - commands/58 --- -Start a new stream. +Starts streaming in the selected OBS instance. + +Use this when you explicitly want the stream to go live. If OBS is already streaming, OBS may ignore the request or return an error depending on the OBS WebSocket version. | Box Name | Type | Description | |-------|--------|-------- |OBS|Dropdown|OBS to send this command to (if using multiple OBS)| {:class='table table-primary'} +{% include alert.html text="OBS must be connected to SAMMI before this command can run. If you use multiple OBS connections, choose the target OBS instance in the OBS dropdown." type="info" %} diff --git a/doc_posts/_commands-obs-streaming/obs-streaming-stop.md b/doc_posts/_commands-obs-streaming/obs-streaming-stop.md index 5289e64b..e4fd8f34 100644 --- a/doc_posts/_commands-obs-streaming/obs-streaming-stop.md +++ b/doc_posts/_commands-obs-streaming/obs-streaming-stop.md @@ -5,13 +5,16 @@ redirect_from: - commands/59 --- -Stop a stream. +Stops the active stream in the selected OBS instance. + +Use this when you explicitly want OBS to stop streaming. If OBS is not currently streaming, OBS may ignore the request or return an error depending on the OBS WebSocket version. | Box Name | Type | Description | |-------|--------|-------- |OBS|Dropdown|OBS to send this command to (if using multiple OBS)| {:class='table table-primary'} +{% include alert.html text="OBS must be connected to SAMMI before this command can run. If you use multiple OBS connections, choose the target OBS instance in the OBS dropdown." type="info" %} diff --git a/doc_posts/_commands-obs-streaming/obs-streaming-toggle.md b/doc_posts/_commands-obs-streaming/obs-streaming-toggle.md index 9fd17b36..c6fb7c5f 100644 --- a/doc_posts/_commands-obs-streaming/obs-streaming-toggle.md +++ b/doc_posts/_commands-obs-streaming/obs-streaming-toggle.md @@ -5,13 +5,16 @@ redirect_from: - commands/57 --- -Toggle Streaming on and off. +Toggles streaming on or off in the selected OBS instance. + +Use this when the same button should start the stream if OBS is offline, or stop the stream if OBS is already live. | Box Name | Type | Description | |-------|--------|-------- |OBS|Dropdown|OBS to send this command to (if using multiple OBS)| {:class='table table-primary'} +{% include alert.html text="OBS must be connected to SAMMI before this command can run. If you need predictable one-way behavior, use Start Streaming or Stop Streaming instead." type="info" %} diff --git a/doc_posts/_commands-sounds/obs-sound-play.md b/doc_posts/_commands-sounds/obs-sound-play.md index 71a58dab..694f7dca 100644 --- a/doc_posts/_commands-sounds/obs-sound-play.md +++ b/doc_posts/_commands-sounds/obs-sound-play.md @@ -2,18 +2,44 @@ title: "Play Sound Effect" num: 1 redirect_from: - - commands/22 + - commands/2 --- -Plays a selected sound file. Only .ogg files are supported. +Plays a selected sound file. Files must be in Vorbis codec in an .ogg container. + +Plays a selected audio file using SAMMI's sound effect system. + +{% include alert.html text="Note: In SAMMI versions older than 2026.4.0 only .ogg (Vorbis) files are supported. Other formats (mp3, wav, m4a, mp4) are supported starting with 2026.4.0 and later." type="warning" %} + +Supported file types: +- .mp3 +- .wav +- .m4a +- .ogg +- .mp4 (audio-only playback) + +{% include alert.html text="You no longer need to convert files to a specific container — SAMMI supports common audio formats directly." type="info" %} + +{% include alert.html text="SAMMI will now always play on your active default audio device. Changes to the system default device are picked up automatically — no SAMMI restart required." type="info" %} | Box Name | Type | Description | |-------|--------|--------| -|Sound File Path| String| Select the file to play. -|Volume Level|number|Set the volume level in % -|Save Sound ID|String|Sound Effect ID (you can select any name, it's used for other sound effect commands) +|Sound File Path|String|Select the file to play. Relative paths are allowed (e.g., `sounds/airhorn.mp3`).| +|Volume Level|number|Set the volume level in %| +|Save Sound ID|String|Sound Effect ID (you can select any name; it's used for other sound effect commands like stop/volume/speed)| {:class='table table-primary ' } +Examples: + +| Sound File Path | Result | +|---|---| +| sounds/airhorn.mp3 | Plays `airhorn.mp3` at the selected volume. | +| sounds/cheer.ogg | Plays `cheer.ogg` using the same sound system. | + +Notes: +- If the selected file contains video (e.g., a full .mp4), only the audio track will be played. +- Use a unique `Save Sound ID` to reference this sound for volume/stop/speed commands. + diff --git a/doc_posts/_commands-statements/statements-break-if.md b/doc_posts/_commands-statements/statements-break-if.md index 791ac22d..27b91413 100644 --- a/doc_posts/_commands-statements/statements-break-if.md +++ b/doc_posts/_commands-statements/statements-break-if.md @@ -16,6 +16,7 @@ If the condition is true, this command will break out of a Repeat, Re-enable or | If Value | {% include asterisk.html%} | Left side of the comparison you want to evaluate. | |Compare | Dropdown menu | Operator you wish to use to compare left and right side. | Value | {% include asterisk.html%}| Whatever you want to compare the left side with. +|Case Insensitive|Checkbox|If checked, string comparisons ignore uppercase/lowercase differences. Numbers and booleans are not affected. {:class='table table-primary' } diff --git a/doc_posts/_commands-statements/statements-exit-if.md b/doc_posts/_commands-statements/statements-exit-if.md index dd35f8b1..3f3deb27 100644 --- a/doc_posts/_commands-statements/statements-exit-if.md +++ b/doc_posts/_commands-statements/statements-exit-if.md @@ -14,6 +14,7 @@ If the condition is true, it terminates all the next button commands and prevent | If Value | {% include asterisk.html%} | Left side of the comparison you want to evaluate. | |Compare Type | Dropdown menu | Operator you wish to use to compare left and right side. | Value | {% include asterisk.html%}| Whatever you want to compare the left side with. +|Case Insensitive|Checkbox|If checked, string comparisons ignore uppercase/lowercase differences. Numbers and booleans are not affected. {:class='table table-primary' } diff --git a/doc_posts/_commands-statements/statements-if.md b/doc_posts/_commands-statements/statements-if.md index 77426fa4..91d05ecd 100644 --- a/doc_posts/_commands-statements/statements-if.md +++ b/doc_posts/_commands-statements/statements-if.md @@ -20,6 +20,7 @@ By pressing the **+** button, you can add: | Value| {% include asterisk.html%} | Left side of the comparison you want to evaluate. |Compare | Dropdown menu | Operator you wish to use to compare left and right side. |Value | {% include asterisk.html%}| Whatever value you want to compare the left side with. +|Case Insensitive|Checkbox|If checked, string comparisons ignore uppercase/lowercase differences. Numbers and booleans are not affected. {:class='table table-primary' } diff --git a/doc_posts/_commands-statements/statements-switch.md b/doc_posts/_commands-statements/statements-switch.md index e70b673a..04f76836 100644 --- a/doc_posts/_commands-statements/statements-switch.md +++ b/doc_posts/_commands-statements/statements-switch.md @@ -11,13 +11,14 @@ Add one Switch statement and then nest Case Statement commands inside for each c Use the **+** button in the Case Statement command to add more than one condition to the same Switch Statement. -Use 'default' as a Case Statement text if you want to execute an action when no other cases meet the conditions. +Use `default` as the value in a Case Statement if you want to execute an action when no other cases meet the conditions. {% include alert.html text="If you have a lot of different conditions to check for, it is faster and more readable to use Switch Statement instead of multiple nested If Statements." type="info" %} | Box Name | Type | Description | |-------|--------|--------| | Value| {% include asterisk.html%} | Expression to evaluate. Its result will be matched against each case you add. +|Case Insensitive|Checkbox|If checked, string case values ignore uppercase/lowercase differences. Numbers and booleans are not affected. {:class='table table-primary' } 1. Add a new Switch Statement command @@ -27,7 +28,7 @@ Use 'default' as a Case Statement text if you want to execute an action when no *For example, add a Case Statement for wolbee, Melonax, Sebas and Cyanidesugar.* 3. Under each Case Statement, decide what commands you want to execute.\ *For example, under Case Statement for wolbee, you want to play a specific sound effect. And under the Case Statement for Melonax, you want to play a different sound effect.* -4. (Optional) Add a default case to execute a block of commands if no Case Statement matches the expression.\ +4. (Optional) Add a `default` case to execute a block of commands if no Case Statement matches the expression.\ *For example, if the viewer's name isn't wolbee, Melonax, Sebas or Cyanidesugar, play a default sound effect.* 5. Now every time the button is pressed, it will check the name of the viewer and execute one Case Statement command block matching their name (or execute the default block). diff --git a/doc_posts/_commands-statements/statements-try-block.md b/doc_posts/_commands-statements/statements-try-block.md new file mode 100644 index 00000000..aeaa9ee5 --- /dev/null +++ b/doc_posts/_commands-statements/statements-try-block.md @@ -0,0 +1,47 @@ +--- +title: "Try Block" +num: 8 +version: 202640 +redirect_from: + - commands/356 +--- + +Runs the commands inside the block in a protected area. If one of the commands inside the block causes a command execution error, SAMMI stops the block and continues without crashing the whole button execution. + +| Box Name | Type | Description | +|-------|--------|-------- +|Block|Statement Block|Commands inside this block are protected by the Try Block. +{:class='table table-primary'} + +Example: + +| Command Order | Command | What happens | +|-------|--------|-------- +|1|Comment|Optional comment to explain what the example does.| +|2|Try Block|Starts the protected block.| +|3|Alert Message|Shows `Test Started`.| +|4|Set Local Variable|Fails because the variable `b` does not exist.| +|5|Alert Message|This command is still inside the Try Block and will not run because the previous command failed.| +|6|Comment|Optional comment after the Try Block.| +|7|Alert Message|Shows `Continuing`, because the button continues after the Try Block.| +{:class='table table-secondary w-auto table-hover text-break'} + +In this example, `Set Local Variable: a = (b*0)` fails because `b` does not exist. Without a Try Block, this error would stop the button execution or crash SAMMI. With a Try Block, SAMMI catches the error, skips the remaining commands inside the block, and continues with the next command after the block. + +Try Block example showing a failed command inside the block and execution continuing afterwards + +Expected output: + +```text +Test Started +Continuing +``` + +## Important Notes + +- `Try Block` only catches errors from commands inside the block. +- When a command inside the block fails, the remaining commands inside the Try Block are skipped. +- Button execution continues with the next command after the Try Block. +- `Try Block` is useful for optional actions, fallback logic, file checks, API requests, and commands that may fail depending on external data. + +{% include alert.html text="Try Block catches command execution errors inside the block. If a command fails, the remaining commands inside the Try Block are skipped and execution continues after the block." type="info" %} diff --git a/doc_posts/_commands-string/regex-get-captures.md b/doc_posts/_commands-string/regex-get-captures.md new file mode 100644 index 00000000..ba756572 --- /dev/null +++ b/doc_posts/_commands-string/regex-get-captures.md @@ -0,0 +1,37 @@ +--- +title: "Regex: Get Captures" +num: 15 +version: 202640 +redirect_from: + - commands/369 +--- + +Gets capture groups from the first regex match and saves them as an array. + +{% include alert.html text="Available in SAMMI Pro." type="info" %} + +| Box Name | Type | Description | +|-------|--------|-------- +|String|String|Text to search in. +|Regex|String|Regular expression with capture groups. +|Save Variable As|String|Variable name to save the capture array. +{:class='table table-primary'} + +Examples: + +| String | Regex | Save Variable As | Saved Array | +|-------|--------|--------|-------- +|User: Chrizzz, ID: 1234|User: (.*), ID: (\d+)|captures|[`Chrizzz`, `1234`] +|2026-05-08|(\d{4})-(\d{2})-(\d{2})|captures|[`2026`, `05`, `08`] +|Name: Sam, Score: 9001|Name: (.*), Score: (\d+)|captures|[`Sam`, `9001`] +{:class='table table-secondary w-auto table-hover text-break'} + +After running the command, use `Array Get Value` to read individual captures: + +| Array | Position | Result | +|-------|--------|-------- +|captures|0|First capture group. +|captures|1|Second capture group. +{:class='table table-secondary w-auto table-hover text-break'} + +{% include alert.html text="Only capture groups are returned. The full match is not included in the array." type="info" %} diff --git a/doc_posts/_commands-string/regex-is-match.md b/doc_posts/_commands-string/regex-is-match.md new file mode 100644 index 00000000..e037d11f --- /dev/null +++ b/doc_posts/_commands-string/regex-is-match.md @@ -0,0 +1,28 @@ +--- +title: "Regex: Is Match" +num: 13 +version: 202640 +redirect_from: + - commands/357 +--- + +Checks whether a string matches a regular expression. Returns `true` if the regex matches, otherwise `false`. + +{% include alert.html text="Available in SAMMI Pro." type="info" %} + +| Box Name | Type | Description | +|-------|--------|-------- +|String|String|Text to check. +|Regex|String|Regular expression to test against the string. +|Save Variable As|String|Variable name to save `true` or `false`. +{:class='table table-primary'} + +Examples: + +| String | Regex | Save Variable As | Saved Value | Notes | +|-------|--------|--------|--------|-------- +|Hello World|World|isMatch|true|Matches because `World` appears anywhere in the string. +|Hello World|^World|isMatch|false|`^` means the string must start with `World`. +|Order #1234|\d+|isMatch|true|Matches one or more digits. +|Chrizzz#1234|^[A-Za-z0-9_]+#\d{4}$|isMatch|true|Checks for a username followed by a 4-digit tag. +{:class='table table-secondary w-auto table-hover text-break'} diff --git a/doc_posts/_commands-string/regex-replace-string.md b/doc_posts/_commands-string/regex-replace-string.md new file mode 100644 index 00000000..b40e6afe --- /dev/null +++ b/doc_posts/_commands-string/regex-replace-string.md @@ -0,0 +1,31 @@ +--- +title: "Regex: Replace String" +num: 14 +version: 202640 +redirect_from: + - commands/358 +--- + +Replaces text in a string using a regular expression and saves the resulting string. + +{% include alert.html text="Available in SAMMI Pro." type="info" %} + +| Box Name | Type | Description | +|-------|--------|-------- +|String|String|Text to search in. +|Regex|String|Regular expression to find matching text. +|Replacement|String|Text to replace each match with. Can be empty to remove matches. +|Save Variable As|String|Variable name to save the new string. +{:class='table table-primary'} + +Examples: + +| String | Regex | Replacement | Save Variable As | Saved Value | +|-------|--------|--------|--------|-------- +|Order #1234|\d+|9999|newText|Order #9999 +|Hello World|\s+| |newText|Hello World +|abc123def|\d+||newText|abcdef +|User: Chrizzz, ID: 1234|ID: \d+|ID: hidden|newText|User: Chrizzz, ID: hidden +{:class='table table-secondary w-auto table-hover text-break'} + +The replacement is applied to all matches found by the regular expression. diff --git a/doc_posts/_commands-string/string-capitalize.md b/doc_posts/_commands-string/string-capitalize.md new file mode 100644 index 00000000..220ea764 --- /dev/null +++ b/doc_posts/_commands-string/string-capitalize.md @@ -0,0 +1,27 @@ +--- +title: String Capitalize +num: 7 +version: 202322 +redirect_from: + - commands/311 +--- + +Converts the first character in a string to uppercase. + +| Box Name | Type | Description | +|-------|--------|--------| +|Save Variable As| String |Variable name to save the converted string. +|String (text)| String | String to convert first character to uppercase. +{:class='table table-primary' } + +| Original String | Returned String| +|-------|-------- +|hello world|Hello world| +{:class='table table-secondary w-auto table-hover data-toggle='table' text-break } + + + + + + + diff --git a/doc_posts/_commands-string/string-clamp.md b/doc_posts/_commands-string/string-clamp.md index 61cb2986..36ec45ee 100644 --- a/doc_posts/_commands-string/string-clamp.md +++ b/doc_posts/_commands-string/string-clamp.md @@ -15,13 +15,13 @@ You need to specify the index of the first character and the amount of character |-------|--------|--------| |Save Variable As| String| Variable name to save the clamped string. |String (text)| String| String (text) to clamp -|Start Position| Int {% include asterisk.html%}| Where to start the clamp +|Start Position| Int {% include asterisk.html%}| Where to start the clamp (first character = 1) |Amount of Characters| Int {% include asterisk.html%}| Amount of characters to include in the clamp {:class='table table-primary ' } | Original string | Start| Amount| Result| |-------|--------|--------|-------- -|Hello World!|0|5|Hello +|Hello World!|1|5|Hello |This is cool!|9|4|cool {:class='table table-secondary w-auto table-hover data-toggle='table' text-break } diff --git a/doc_posts/_commands-string/string-split-array.md b/doc_posts/_commands-string/string-split-array.md index 5bbc5926..1e855fb2 100644 --- a/doc_posts/_commands-string/string-split-array.md +++ b/doc_posts/_commands-string/string-split-array.md @@ -5,7 +5,7 @@ redirect_from: - commands/217 --- -Splits a string value into an array. +Splits a string value into an array. If an array does not already exist, a new array will be created. | Box Name | Type | Description | |-------|--------|--------| diff --git a/doc_posts/_commands-string/string-substitute-variables.md b/doc_posts/_commands-string/string-substitute-variables.md new file mode 100644 index 00000000..2b4217d0 --- /dev/null +++ b/doc_posts/_commands-string/string-substitute-variables.md @@ -0,0 +1,29 @@ +--- +title: String Substitute Variables +num: 10.1 +version: 202322 +redirect_from: + - commands/318 +--- + +Replaces substituted variable placeholders (ex: `/$username$/`) in a template string with variables from the current button, or a provided object. + +| Box Name | Type | Description | +|-------|--------|--------| +|Template String Variable| String |Variable name containing a template string with substituted variable placeholders +|Replacement Object Name| Object | If provided, choose to reference variables within an object instead of the button's current variables. +{:class='table table-primary' } + +|Variables in button| Template String | Returned String | +|-----------|-------|--------| +|username: "chrizzz"
months: 12|Thanks `/$username$/` for the `/$months$/` months!|Thanks chrizzz for the 12 months!| +{:class='table table-secondary w-auto table-hover data-toggle='table' text-break } + +{% include media_modal.html img="string_sub_vars2.png" w="100" btn="1" alt="Parsing a template string grabbed from template.txt file" %} + +{% include media_modal.html img="string_sub_vars.png" w="100" btn="1" alt="Parsing a template string grabbed from template.txt file 2" %} + + + + + diff --git a/doc_posts/_commands-string/string-trim.md b/doc_posts/_commands-string/string-trim.md index 433992d0..ac55aa31 100644 --- a/doc_posts/_commands-string/string-trim.md +++ b/doc_posts/_commands-string/string-trim.md @@ -8,7 +8,7 @@ redirect_from: Trims blank spaces or specific characters from your string. -{% include alert.html text='Trimming a backwards slash \\ must be escaped by another slash: \\\\' type="warning" %} +{% include alert.html text='Trimming a backwards slash \ must be escaped by another slash: \\' type="warning" %} | Box Name | Type | Description | diff --git a/doc_posts/_commands-trigger/trigger-pull.md b/doc_posts/_commands-trigger/trigger-pull.md index b257fc36..8d7299d2 100644 --- a/doc_posts/_commands-trigger/trigger-pull.md +++ b/doc_posts/_commands-trigger/trigger-pull.md @@ -36,7 +36,7 @@ There is an array that lists all Trigger Types in the Global Variables section o |11|Twitch Moderation| |12|Extension Trigger| |13|Twitch Whispers| -|14|Twitch Host| +|14|Twitch Host `DEPRECATED`| |15|Twitch Prediction| |16|Twitch Poll| |17|Twitch Hype Train| @@ -51,4 +51,25 @@ There is an array that lists all Trigger Types in the Global Variables section o |26|Webhook Trigger| |27|Twitch Low Trust Users| |28|Twitch Shoutout| +|29|SAMMI Voice| +|30|Crowd Control| +|31|Voicemod| +|32|Pulsoid| +|33|Ad Break| +|34|Twitch Charity| +|35|Twitch Announcement| +|36|Twitch Guest Star| +|37|Twitch Shoutout Received| +|38|Twitch Stream| +|39|Elgato Stream Deck| +|40|Twitch Automatic Reward Redemption| +|41|Twitch Channel Update| +|42|Gamepad| +|43|Twitch Watch Streak| +|44|Twitch Default PowerUp| +|45|Twitch Custom EventSub Subscription| +|46|Twitch EventSub Status| +|47|Twitch Combo| +|48|Twitch Extension| +|49|Twitch Custom PowerUp| {:class='table table-secondary w-auto table-hover text-break' } diff --git a/doc_posts/_commands-twitch-chat/twitch-get-pinned-chat-message.md b/doc_posts/_commands-twitch-chat/twitch-get-pinned-chat-message.md new file mode 100644 index 00000000..d2f57443 --- /dev/null +++ b/doc_posts/_commands-twitch-chat/twitch-get-pinned-chat-message.md @@ -0,0 +1,20 @@ +--- +title: "Get Pinned Chat Message" +num: 20.1 +version: 202640 +redirect_from: + - commands/373 +--- + +Gets the currently pinned Twitch chat message for the selected channel and saves the response to a variable. +For more information on the response object, see the [Twitch API Reference Guide for Get Pinned Chat Message](https://dev.twitch.tv/docs/api/reference/#get-pinned-chat-message). + +{% include async.html %} + +| Box Name | Type | Description | +|-------|--------|--------| +|Channel|Dropdown|Twitch channel to read the pinned message from. Leave empty to use the default account. +|Save Variable As|String|Variable name to save the pinned message object. Saves `undefined` if no pinned message exists. +{:class='table table-primary'} + +{% include alert.html text="Requires the moderator:read:chat_messages or moderator:manage:chat_messages Twitch scope." type="info" %} diff --git a/doc_posts/_commands-twitch-chat/twitch-open-whispers.md b/doc_posts/_commands-twitch-chat/twitch-open-whispers.md deleted file mode 100644 index b158dc28..00000000 --- a/doc_posts/_commands-twitch-chat/twitch-open-whispers.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -title: "Open Whispers" -num: 1 -redirect_from: - - commands/149 ---- - -This command will turn on Twitch whisper alerts (they are disabled by default).\ -All whispers will be received as Twitch Whisper triggers. - -| Box Name | Type | Description | -|-------|--------|-------- -Allow | Checkbox |Checked = enable, unchecked = disable -{:class='table table-primary'} - - - - - - - - - diff --git a/doc_posts/_commands-twitch-chat/twitch-pin-chat-message.md b/doc_posts/_commands-twitch-chat/twitch-pin-chat-message.md new file mode 100644 index 00000000..73d2099f --- /dev/null +++ b/doc_posts/_commands-twitch-chat/twitch-pin-chat-message.md @@ -0,0 +1,19 @@ +--- +title: "Pin Chat Message" +num: 20.2 +version: 202640 +redirect_from: + - commands/374 +--- + +Pins an existing Twitch chat message in the selected channel. +For more information, see the [Twitch API Reference Guide for Pin Chat Message](https://dev.twitch.tv/docs/api/reference/#pin-chat-message). + +| Box Name | Type | Description | +|-------|--------|--------| +|Channel|Dropdown|Twitch channel where the message should be pinned. Leave empty to use the default account. +|Message ID|String|Message ID to pin. Leave empty to use `message_id` from the trigger pull data. +|Duration (s)|Number|Optional pin duration in seconds. Twitch allows 30 to 1800 seconds. Leave empty to pin until the stream ends. +{:class='table table-primary'} + +{% include alert.html text="Requires the moderator:manage:chat_messages Twitch scope." type="info" %} diff --git a/doc_posts/_commands-twitch-chat/twitch-reply-message.md b/doc_posts/_commands-twitch-chat/twitch-reply-message.md new file mode 100644 index 00000000..9c61c6ed --- /dev/null +++ b/doc_posts/_commands-twitch-chat/twitch-reply-message.md @@ -0,0 +1,18 @@ +--- +title: "Reply to Message" +num: 0.1 +version: 202330 +redirect_from: + - commands/324 +--- + +Replies to a sent Twitch chat message. + +{% include alert.html text='Accidentally providing an undefined variable for the "Message ID" box will run the default behavior!' type="warning" %} + +| Box Name | Type | Description | +|-------|--------|--------| +|Chat Message| String | The message to be sent as a reply over chat. +|Message ID| String | The ID of the chat message you wish to reply to (typically fetched from a trigger pull). Leave blank to reply to the user that triggered the button! +|Channel Name | String | Channel Name (all lowercase) to send the message to. Leave blank unless you have multiple accounts connected to SAMMI. +{:class='table table-primary'} \ No newline at end of file diff --git a/doc_posts/_commands-twitch-chat/twitch-send-api-chat-message.md b/doc_posts/_commands-twitch-chat/twitch-send-api-chat-message.md new file mode 100644 index 00000000..2b1ee4e2 --- /dev/null +++ b/doc_posts/_commands-twitch-chat/twitch-send-api-chat-message.md @@ -0,0 +1,31 @@ +--- +title: "Send API Chat Message" +num: 20 +version: 202410 +redirect_from: + - commands/333 +--- + +Sends a message to your Twitch chat from your default account that is connected to SAMMI.\ + +{% include alert.html text="If you have linked more than one Twitch account to SAMMI, you must specify the channel name, otherwise the message is sent to your Twitch account's channel that has Join Channel checked in your Twitch Connections menu" type="warning" %} + +{% include alert.html text="Sending a Chat Message via the API WILL cause SAMMI to trigger off these messages, be sure to not create a recursive loop of your bot auto-responding to itself." type="warning" %} + +| Box Name | Type | Description | +|-------|--------|-------- +|Chat Message|String | The message to be sent over the chat.| +|From|String|The channel you want to send messages from. +|Channel Name |String| Channel Name (all lowercase) to send the message to. Leave blank unless you have multiple accounts connected to SAMMI. +|Pin Message|Checkbox|If checked, the message is sent and pinned for 20 minutes. +{:class='table table-primary'} + +{% include alert.html text="Pin Message requires the moderator:manage:chat_messages Twitch scope. If Twitch cannot pin the message, the message will not be sent." type="info" %} + +For more information, see the [Twitch API Reference Guide for Send Chat Message](https://dev.twitch.tv/docs/api/reference/#send-chat-message). + + + + + + diff --git a/doc_posts/_commands-twitch-chat/twitch-send-whispers.md b/doc_posts/_commands-twitch-chat/twitch-send-whispers.md index 71dcc0f0..1e5203b2 100644 --- a/doc_posts/_commands-twitch-chat/twitch-send-whispers.md +++ b/doc_posts/_commands-twitch-chat/twitch-send-whispers.md @@ -7,7 +7,7 @@ redirect_from: --- This command will send a whisper over the Twitch API. The whisper will be sent via the account that is connected to chat. -This feature also has some limitations as imposed by Twitch, detailed [here](https://dev.twitch.tv/docs/api/refrence#send-whisper) +This feature also has some limitations as imposed by Twitch, detailed [here](https://dev.twitch.tv/docs/api/reference#send-whisper) | Box Name | Type | Description | |-------|--------|-------- diff --git a/doc_posts/_commands-twitch-chat/twitch-unpin-chat-message.md b/doc_posts/_commands-twitch-chat/twitch-unpin-chat-message.md new file mode 100644 index 00000000..ec3435a9 --- /dev/null +++ b/doc_posts/_commands-twitch-chat/twitch-unpin-chat-message.md @@ -0,0 +1,18 @@ +--- +title: "Unpin Chat Message" +num: 20.4 +version: 202640 +redirect_from: + - commands/376 +--- + +Unpins a Twitch chat message from the selected channel. +For more information, see the [Twitch API Reference Guide for Unpin Chat Message](https://dev.twitch.tv/docs/api/reference/#unpin-chat-message). + +| Box Name | Type | Description | +|-------|--------|--------| +|Channel|Dropdown|Twitch channel where the message should be unpinned. Leave empty to use the default account. +|Message ID|String|Message ID to unpin. Leave empty to use `message_id` from the trigger pull data. +{:class='table table-primary'} + +{% include alert.html text="Requires the moderator:manage:chat_messages Twitch scope." type="info" %} diff --git a/doc_posts/_commands-twitch-chat/twitch-update-pinned-chat-message.md b/doc_posts/_commands-twitch-chat/twitch-update-pinned-chat-message.md new file mode 100644 index 00000000..602f3c28 --- /dev/null +++ b/doc_posts/_commands-twitch-chat/twitch-update-pinned-chat-message.md @@ -0,0 +1,19 @@ +--- +title: "Update Pinned Chat Message" +num: 20.3 +version: 202640 +redirect_from: + - commands/375 +--- + +Updates the duration of an existing pinned Twitch chat message. +For more information, see the [Twitch API Reference Guide for Update Pinned Chat Message](https://dev.twitch.tv/docs/api/reference/#update-pinned-chat-message). + +| Box Name | Type | Description | +|-------|--------|--------| +|Channel|Dropdown|Twitch channel where the pinned message exists. Leave empty to use the default account. +|Message ID|String|Pinned message ID to update. Leave empty to use `message_id` from the trigger pull data. +|Duration (s)|Number|Optional new pin duration in seconds, starting from now. Twitch allows 30 to 1800 seconds. Leave empty to pin until the stream ends. +{:class='table table-primary'} + +{% include alert.html text="Requires the moderator:manage:chat_messages Twitch scope." type="info" %} diff --git a/doc_posts/_commands-twitch-chpr/twitch-change-redemption.md b/doc_posts/_commands-twitch-chpr/twitch-change-redemption.md index a96ff502..3512bc5a 100644 --- a/doc_posts/_commands-twitch-chpr/twitch-change-redemption.md +++ b/doc_posts/_commands-twitch-chpr/twitch-change-redemption.md @@ -1,6 +1,8 @@ --- -title: "Change Redemption Status " +title: "Update Redemption Status" num: 14 +redirect_from: + - commands/187 --- Updates the status of custom reward redemption that has UNFULFILLED status. diff --git a/doc_posts/_commands-twitch-chpr/twitch-create-reward.md b/doc_posts/_commands-twitch-chpr/twitch-create-reward.md index ac5faf67..7c1d1359 100644 --- a/doc_posts/_commands-twitch-chpr/twitch-create-reward.md +++ b/doc_posts/_commands-twitch-chpr/twitch-create-reward.md @@ -1,10 +1,14 @@ --- title: "Create Reward" num: 13.1 +redirect_from: + - commands/229 --- Creates a Channel Point Reward on Twitch that will be owned by SAMMI. Only rewards owned by SAMMI can be further modified from within SAMMI. +{% include async.html %} + | Box Name | Type | Description | |-------|--------|-------- |Login Name | Dropdown |Your Twitch login name (all lowercase characters) diff --git a/doc_posts/_commands-twitch-chpr/twitch-delete-reward.md b/doc_posts/_commands-twitch-chpr/twitch-delete-reward.md index f8129e1c..9a1dfef4 100644 --- a/doc_posts/_commands-twitch-chpr/twitch-delete-reward.md +++ b/doc_posts/_commands-twitch-chpr/twitch-delete-reward.md @@ -1,6 +1,8 @@ --- title: "Delete Reward" num: 13.8 +redirect_from: + - commands/230 --- Deletes your previously created reward. diff --git a/doc_posts/_commands-twitch-chpr/twitch-edit-all-rewards.md b/doc_posts/_commands-twitch-chpr/twitch-edit-all-rewards.md index d22c5b63..9e8889e8 100644 --- a/doc_posts/_commands-twitch-chpr/twitch-edit-all-rewards.md +++ b/doc_posts/_commands-twitch-chpr/twitch-edit-all-rewards.md @@ -1,6 +1,8 @@ --- title: "Edit All Rewards" num: 13.7 +redirect_from: + - commands/265 --- Updates *all* custom channel point rewards on your channel. diff --git a/doc_posts/_commands-twitch-chpr/twitch-edit-reward-extra.md b/doc_posts/_commands-twitch-chpr/twitch-edit-reward-extra.md index 324558f4..1b4c1053 100644 --- a/doc_posts/_commands-twitch-chpr/twitch-edit-reward-extra.md +++ b/doc_posts/_commands-twitch-chpr/twitch-edit-reward-extra.md @@ -1,15 +1,17 @@ --- title: "Extra Edit Reward" num: 13.6 +redirect_from: + - commands/231 --- -Updates a Custom Channel Points Reward created on your channel, allowing you to change additional settings that are not accessible from the regular [Edit Reward](twitch#editreward) command. +Updates a Custom Channel Points Reward created on your channel, allowing you to change additional settings that are not accessible from the regular Edit Reward command (see above). {% include alert.html text="You can only edit rewards that were previously created with SAMMI (you can verify it says 'Owned' in Twitch Connections - Edit Rewards window, and dupe it if needed)" type="warning" %} | Box Name | Type | Description | |-------|--------|-------- -|Login Name|Dropdown|Your Twitch login name (all lowercase characters) +|Login Name|Dropdown|Your Twitch login name (all lowercase characters). Leave empty for your default streamer account. |Reward (ID required)|Dropdown|ID of the custom reward to update. |Description|String|Description of the reward. |Color|Color Picker|Display colour of the reward on Twitch. diff --git a/doc_posts/_commands-twitch-chpr/twitch-edit-reward.md b/doc_posts/_commands-twitch-chpr/twitch-edit-reward.md index 01f5413e..f1569ac1 100644 --- a/doc_posts/_commands-twitch-chpr/twitch-edit-reward.md +++ b/doc_posts/_commands-twitch-chpr/twitch-edit-reward.md @@ -1,6 +1,8 @@ --- title: "Edit Reward" num: 13.5 +redirect_from: + - commands/186 --- Updates a Custom Channel Points Reward created on your channel. diff --git a/doc_posts/_commands-twitch-info/twitch-get-all-subscribers.md b/doc_posts/_commands-twitch-info/twitch-get-all-subscribers.md new file mode 100644 index 00000000..f0f5f528 --- /dev/null +++ b/doc_posts/_commands-twitch-info/twitch-get-all-subscribers.md @@ -0,0 +1,44 @@ +--- +title: "Get All Subscribers Info" +num: 3.2 +version: 202610 +redirect_from: + - commands/310 +--- + +Gets subscriber information for the specified channel and saves the response object returned by Twitch. +For more information on what the response contains, check out the Response Body table in the [Twitch API Reference Guide for Get Broadcaster Subscriptions](https://dev.twitch.tv/docs/api/reference/#get-broadcaster-subscriptions). + +If **Channel** is empty, SAMMI uses the default Twitch account. The command requests up to 100 subscriptions from Twitch and saves the returned `data`, `pagination`, `total`, and `points` fields where available. + +{% include async.html %} + +| Box Name | Type | Description | +|-------|--------|-------- +|Channel|Dropdown|Twitch channel to get subscribers from. This can be left empty to use the default account. +|Save Variable As|String|Variable name to save the response as. +{:class='table table-primary'} + +**Response Data:** + +| Variable Name | Type | Description | +|---------------|------|-------------| +data|Array|Array of subscriber objects returned by Twitch. +data[`0-?`].broadcaster_id|String|User ID of the broadcaster. +data[`0-?`].broadcaster_login|String|Login name of the broadcaster. +data[`0-?`].broadcaster_name|String|Display name of the broadcaster. +data[`0-?`].gifter_id|String|User ID of the gifter, if the subscription was gifted. +data[`0-?`].gifter_login|String|Login name of the gifter, if available. +data[`0-?`].gifter_name|String|Display name of the gifter, if available. +data[`0-?`].is_gift|Boolean|Whether the subscription was gifted. +data[`0-?`].tier|String|Subscription tier. +data[`0-?`].plan_name|String|Subscription plan name. +data[`0-?`].user_id|String|Subscriber User ID. +data[`0-?`].user_name|String|Subscriber display name. +data[`0-?`].user_login|String|Subscriber login name. +pagination|Object|Pagination information returned by Twitch, if available. +total|Number|Total subscriber count returned by Twitch. +points|Number|Subscriber points returned by Twitch. +{:class='table table-secondary w-auto table-hover text-break'} + +{% include alert.html text="Requires the channel:read:subscriptions Twitch scope." type="info" %} diff --git a/doc_posts/_commands-twitch-info/twitch-get-banned-users.md b/doc_posts/_commands-twitch-info/twitch-get-banned-users.md index 22279696..485c17e0 100644 --- a/doc_posts/_commands-twitch-info/twitch-get-banned-users.md +++ b/doc_posts/_commands-twitch-info/twitch-get-banned-users.md @@ -8,7 +8,7 @@ redirect_from: Gets a list of all users that are banned/timed out in the specified channel. -{% include alert.html text="This command needs some time to execute, either delay your next commands by 1-2 seconds or use Wait Until Variable Exists command." type="warning" %} +{% include async.html %} | Box Name | Type | Description | |-------|--------|-------- @@ -32,4 +32,4 @@ data[`0-?`].moderator_login|String|The moderator's login name data[`0-?`].moderator_name|String|The moderator's display name pagination|Object|Contains the information used to page through the list of results. The object is empty if there are no more pages left to page through. pagination.cursor|String|The cursor used to get the next page of results. Use the cursor to set the request’s after query parameter using Twitch API Call. -{:class='table table-secondary w-auto table-hover data-toggle='table' text-break } \ No newline at end of file +{:class='table table-secondary w-auto table-hover text-break'} diff --git a/doc_posts/_commands-twitch-info/twitch-get-blocked-terms.md b/doc_posts/_commands-twitch-info/twitch-get-blocked-terms.md new file mode 100644 index 00000000..0f148dd1 --- /dev/null +++ b/doc_posts/_commands-twitch-info/twitch-get-blocked-terms.md @@ -0,0 +1,31 @@ +--- +title: "Get Blocked Terms" +num: 2.4 +version: 202322 +redirect_from: + - commands/314 +--- + +Gets an array of blocked terms from a Twitch channel. + +{% include async.html %} + +| Box Name | Type | Description | +|-------|--------|-------- +Channel|String|Channel name to get blocked terms of +Save Variable As|String|Variable to save the result +{:class='table table-primary'} + + +| Variable Name | Type | Description | +|---------------|------|-------------| +default|Array|Array of objects representing each blocked term +default[`0-?`]|Object|contains info for a blocked term +default[`0-?`].broadcaster_id|String|The broadcaster's ID +default[`0-?`].created_at|String|The UTC date and time, in RFC3339 format, of when the blocked term was created. Will be an empty string if the user is banned. +default[`0-?`].expires_at|String|The UTC date and time, in RFC3339 format, of when the blocked term expires. Will be `null` if there is no set expiration. +default[`0-?`].id|String|The blocked term's unique identifier +default[`0-?`].moderator_id|String|The ID of the moderator who added the blocked term +default[`0-?`].text|String|The blocked term itself! +default[`0-?`].updated_at|String|The UTC date and time, in RFC3339 format, of when the blocked term was updated. +{:class='table table-secondary w-auto table-hover text-break'} diff --git a/doc_posts/_commands-twitch-info/twitch-get-channel-info.md b/doc_posts/_commands-twitch-info/twitch-get-channel-info-312.md similarity index 66% rename from doc_posts/_commands-twitch-info/twitch-get-channel-info.md rename to doc_posts/_commands-twitch-info/twitch-get-channel-info-312.md index 1bba768b..332ab5b4 100644 --- a/doc_posts/_commands-twitch-info/twitch-get-channel-info.md +++ b/doc_posts/_commands-twitch-info/twitch-get-channel-info-312.md @@ -1,17 +1,20 @@ --- title: "Get Channel Info" num: 1.3 +version: 202322 redirect_from: - - commands/174 + - commands/312 --- Gets specified channel information. -{% include alert.html text="This command needs some time to execute, either delay your next commands by 1-2 seconds or use Wait Until Variable Exists command." type="warning" %} +{% include async.html %} + + | Box Name | Type | Description | |-------|--------|-------- -|User ID|number|ID of the channel +|Channel|string|Name of the channel |Save Variable As|String|Variable to save the response {:class='table table-primary'} diff --git a/doc_posts/_commands-twitch-info/twitch-get-channel-teams.md b/doc_posts/_commands-twitch-info/twitch-get-channel-teams.md new file mode 100644 index 00000000..d144dac8 --- /dev/null +++ b/doc_posts/_commands-twitch-info/twitch-get-channel-teams.md @@ -0,0 +1,41 @@ +--- +title: "Get Channel Teams" +num: 1.31 +version: 202440 +redirect_from: + - commands/340 +--- + +Gets the list of Twitch teams for a channel. + +If **Channel** is empty, SAMMI uses the default Twitch account. The command saves an array of team objects. If the channel is invalid or Twitch returns an error, the saved variable is set to `undefined`. + +{% include async.html %} + +| Box Name | Type | Description | +|-------|--------|-------- +Channel|Twitch Account|Channel name to get teams for. Leave empty to use the default Twitch account. +Save Variable As|String|Variable name to save the teams array. +{:class='table table-primary'} + +**Response Data:** + +| Variable Name | Type | Description | +|---------------|------|-------------| +savedVariable|Array|Array of objects representing each team. +savedVariable[`0-?`]|Object|Contains info about the team. +savedVariable[`0-?`].background_image_url|String|The background image the team page uses. +savedVariable[`0-?`].banner|String|The banner image the team page uses. +savedVariable[`0-?`].thumbnail_url|String|The thumbnail image the team page uses. +savedVariable[`0-?`].broadcaster_login|String|The login of the requested user. +savedVariable[`0-?`].broadcaster_name|String|The display name of the requested user. +savedVariable[`0-?`].broadcaster_id|String|The User ID of the requested user. +savedVariable[`0-?`].id|String|The ID of the team. +savedVariable[`0-?`].name|String|The internal name of the team. +savedVariable[`0-?`].team_display_name|String|The display name of the team. +savedVariable[`0-?`].info|String|The description on the team. +savedVariable[`0-?`].updated_at|String|The time in Twitch format that the team was last updated. +savedVariable[`0-?`].created_at|String|The time in Twitch format that the team was created. +{:class='table table-secondary w-auto table-hover text-break'} + +{% include alert.html text="Requires the user:read:email Twitch scope for the selected channel/account." type="info" %} diff --git a/doc_posts/_commands-twitch-info/twitch-get-chat-settings.md b/doc_posts/_commands-twitch-info/twitch-get-chat-settings.md index 830ac841..f5981758 100644 --- a/doc_posts/_commands-twitch-info/twitch-get-chat-settings.md +++ b/doc_posts/_commands-twitch-info/twitch-get-chat-settings.md @@ -9,7 +9,7 @@ redirect_from: Gets the chat settings for the specified channel. For more information on what the response contains, check out the Response Body table in the [Twitch API Reference Guide for Get Chat Settings](https://dev.twitch.tv/docs/api/reference/#get-chat-settings) -{% include alert.html text="This command needs some time to execute, either delay your next commands by 1-2 seconds or use Wait Until Variable Exists command." type="warning" %} +{% include async.html %} | Box Name | Type | Description | |-------|--------|-------- @@ -20,4 +20,4 @@ Save Variable As|String|Variable to save the result | Chat Message Example | Description | |-------|--------|-------- data|Object array|Array of objects containing A LOT of info -{:class='table table-secondary w-auto table-hover data-toggle='table' text-break } \ No newline at end of file +{:class='table table-secondary w-auto table-hover text-break'} diff --git a/doc_posts/_commands-twitch-info/twitch-get-chatters.md b/doc_posts/_commands-twitch-info/twitch-get-chatters.md index a290bed7..63c56c8c 100644 --- a/doc_posts/_commands-twitch-info/twitch-get-chatters.md +++ b/doc_posts/_commands-twitch-info/twitch-get-chatters.md @@ -8,7 +8,7 @@ redirect_from: Gets a list of users that are connected to the broadcaster's chat session. -{% include alert.html text="This command needs some time to execute, either delay your next commands by 1-2 seconds or use Wait Until Variable Exists command." type="warning" %} +{% include async.html %} | Box Name | Type | Description | |-------|--------|-------- @@ -24,4 +24,4 @@ data[`0-?`]|Object|contains info for a chatter data[`0-?`].user_id|String|The user's ID data[`0-?`].user_login|String|The user's login name data[`0-?`].user_name|String|The user's display name -{:class='table table-secondary w-auto table-hover data-toggle='table' text-break } +{:class='table table-secondary w-auto table-hover text-break'} diff --git a/doc_posts/_commands-twitch-info/twitch-get-custom-power-ups.md b/doc_posts/_commands-twitch-info/twitch-get-custom-power-ups.md new file mode 100644 index 00000000..04ac2adf --- /dev/null +++ b/doc_posts/_commands-twitch-info/twitch-get-custom-power-ups.md @@ -0,0 +1,39 @@ +--- +title: "Twitch: Get Custom Power-ups" +num: 6.1 +version: 202640 +redirect_from: + - commands/355 +--- + +Gets the custom Power-ups available for a Twitch channel and saves the full response object returned by Twitch. + +If **Channel Name** is empty, SAMMI uses the default Twitch account. If Twitch is not connected, the channel cannot be resolved, or the request fails, the saved variable is set to `undefined`. + +{% include async.html %} + +| Box Name | Type | Description | +|-------|--------|-------- +|Channel Name|Twitch Account|Twitch channel to fetch custom Power-ups from. Leave empty to use the default Twitch account. +|Save Variable As|String|Variable name to save the response object. +{:class='table table-primary'} + +**Response Data:** + +| Variable Name | Type | Description | +|---------------|------|-------------| +data|Array|Array of custom Power-up objects returned by Twitch. +data[`0-?`]|Object|A single custom Power-up object. +pagination|Object|Pagination information returned by Twitch, if available. +{:class='table table-secondary w-auto table-hover text-break'} + +Example: + +| Channel Name | Save Variable As | Result | +|-------|--------|-------- +|Main Twitch account|customPowerups|Saves the custom Power-ups response to `customPowerups`. +{:class='table table-secondary w-auto table-hover text-break'} + +After running the command, you can use other object/array commands to inspect the returned data, such as reading the first Power-up name or ID from the saved result. + +{% include alert.html text="Requires the bits:read and user:read:email Twitch scopes for the selected channel/account." type="info" %} diff --git a/doc_posts/_commands-twitch-info/twitch-get-emotes.md b/doc_posts/_commands-twitch-info/twitch-get-emotes.md index a3d4eb99..3e0f2e54 100644 --- a/doc_posts/_commands-twitch-info/twitch-get-emotes.md +++ b/doc_posts/_commands-twitch-info/twitch-get-emotes.md @@ -9,7 +9,7 @@ redirect_from: Gets a list of the custom emotes for the specified channel. For more information on what the response contains, check out the Response Body table in the [Twitch API Reference Guide for Get Channel Emotes](https://dev.twitch.tv/docs/api/reference/#get-channel-emotes) -{% include alert.html text="This command needs some time to execute, either delay your next commands by 1-2 seconds or use Wait Until Variable Exists command." type="warning" %} +{% include async.html %} | Box Name | Type | Description | |-------|--------|-------- @@ -20,4 +20,4 @@ Save Variable As|String|Variable to save the result | Chat Message Example | Description | |-------|--------|-------- data|Object array|Array of objects containing A LOT of info -{:class='table table-secondary w-auto table-hover data-toggle='table' text-break } \ No newline at end of file +{:class='table table-secondary w-auto table-hover text-break'} diff --git a/doc_posts/_commands-twitch-info/twitch-get-follower-count.md b/doc_posts/_commands-twitch-info/twitch-get-follower-count.md index fe3737b1..b5d339b7 100644 --- a/doc_posts/_commands-twitch-info/twitch-get-follower-count.md +++ b/doc_posts/_commands-twitch-info/twitch-get-follower-count.md @@ -7,7 +7,7 @@ redirect_from: Returns the amount of followers your channel currently has. -{% include alert.html text="This command needs some time to execute, either delay your next commands by 1-2 seconds or use Wait Until Variable Exists command." type="warning" %} +{% include async.html %} | Box Name | Type | Description | |-------|--------|-------- diff --git a/doc_posts/_commands-twitch-info/twitch-get-game-info.md b/doc_posts/_commands-twitch-info/twitch-get-game-info.md index e1423abb..b0123029 100644 --- a/doc_posts/_commands-twitch-info/twitch-get-game-info.md +++ b/doc_posts/_commands-twitch-info/twitch-get-game-info.md @@ -7,7 +7,7 @@ redirect_from: Gets game information by game name. -{% include alert.html text="This command needs some time to execute, either delay your next commands by 1-2 seconds or use Wait Until Variable Exists command." type="warning" %} +{% include async.html %} | Box Name | Type | Description | |-------|--------|-------- diff --git a/doc_posts/_commands-twitch-info/twitch-get-hype-train-status.md b/doc_posts/_commands-twitch-info/twitch-get-hype-train-status.md new file mode 100644 index 00000000..71787c32 --- /dev/null +++ b/doc_posts/_commands-twitch-info/twitch-get-hype-train-status.md @@ -0,0 +1,40 @@ +--- +title: "Get Hype Train Status" +num: 1.33 +version: 202610 +redirect_from: + - commands/349 +--- + +Gets the active Hype Train status for the specified Twitch channel and saves the active Hype Train object. +For more information on what the response contains, check out the Response Body table in the [Twitch API Reference Guide for Get Hype Train Status](https://dev.twitch.tv/docs/api/reference/#get-hype-train-status). + +{% include async.html %} +{% include alert.html text="This command returns nothing if there isn't an active Hype Train, leaving your variable with the result of undefined." type="info" %} + +| Box Name | Type | Description | +|-------|--------|-------- +|Channel|Dropdown|Twitch channel to get the Hype Train status from. This can be left empty to use the default account. +|Save Variable As|String|Variable name to save the response as. +{:class='table table-primary'} + +**Response Data:** + +| Variable Name | Type | Description | +|---------------|------|-------------| +id|String|Hype Train event ID. +event_type|String|Type of Hype Train event. +event_timestamp|String|Time in Twitch format when the event happened. +version|String|Hype Train event version. +total|Number|Current total progress. +progress|Number|Current progress toward the next level. +goal|Number|Progress required for the next level. +level|Number|Current Hype Train level. +top_contributions|Array|Top contribution objects returned by Twitch. +last_contribution|Object|Most recent contribution object returned by Twitch. +expires_at|String|Time in Twitch format when the current Hype Train expires. +started_at|String|Time in Twitch format when the current Hype Train started. +cooldown_ends_at|String|Time in Twitch format when the cooldown ends. +{:class='table table-secondary w-auto table-hover text-break'} + +{% include alert.html text="Requires the channel:read:hype_train Twitch scope." type="info" %} diff --git a/doc_posts/_commands-twitch-info/twitch-get-latest-followers.md b/doc_posts/_commands-twitch-info/twitch-get-latest-followers.md index fddeb1c6..9f4e9ded 100644 --- a/doc_posts/_commands-twitch-info/twitch-get-latest-followers.md +++ b/doc_posts/_commands-twitch-info/twitch-get-latest-followers.md @@ -8,7 +8,7 @@ redirect_from: Gets a list of the 100 most recent users that have followed the specified broadcaster. -{% include alert.html text="This command needs some time to execute, either delay your next commands by 1-2 seconds or use Wait Until Variable Exists command." type="warning" %} +{% include async.html %} | Box Name | Type | Description | |-------|--------|-------- @@ -27,4 +27,4 @@ data[`0-?`].user_id|String|The user's ID data[`0-?`].user_login|String|The user's login name data[`0-?`].user_name|String|The user's display name data[`0-?`].followed_at|String|The UTC date and time, in RFC3339 format, of when the user followed -{:class='table table-secondary table-hover data-toggle='table' text-break } \ No newline at end of file +{:class='table table-secondary table-hover text-break'} diff --git a/doc_posts/_commands-twitch-info/twitch-get-mods.md b/doc_posts/_commands-twitch-info/twitch-get-mods.md index dc40f769..3358b564 100644 --- a/doc_posts/_commands-twitch-info/twitch-get-mods.md +++ b/doc_posts/_commands-twitch-info/twitch-get-mods.md @@ -8,7 +8,7 @@ redirect_from: Gets a list of users that are moderators for the specified broadcaster. -{% include alert.html text="This command needs some time to execute, either delay your next commands by 1-2 seconds or use Wait Until Variable Exists command." type="warning" %} +{% include async.html %} | Box Name | Type | Description | |-------|--------|-------- @@ -24,4 +24,4 @@ data[`0-?`]|Object|contains info for a moderator data[`0-?`].user_id|String|The user's ID data[`0-?`].user_login|String|The user's login name data[`0-?`].user_name|String|The user's display name -{:class='table table-secondary w-auto table-hover data-toggle='table' text-break } \ No newline at end of file +{:class='table table-secondary w-auto table-hover text-break'} diff --git a/doc_posts/_commands-twitch-info/twitch-get-random-viewer.md b/doc_posts/_commands-twitch-info/twitch-get-random-viewer.md new file mode 100644 index 00000000..98c0db79 --- /dev/null +++ b/doc_posts/_commands-twitch-info/twitch-get-random-viewer.md @@ -0,0 +1,21 @@ +--- +title: "Get Random Viewer" +num: 6 +version: 202430 +redirect_from: + - commands/338 +--- + +Gets the display name of a random viewer currently connected to the broadcaster's chat session. + +If **Channel** is empty, SAMMI uses the default Twitch account. The command reads up to the first 1000 chatters returned by Twitch and chooses one of them at random. If the channel is invalid, Twitch is not connected, or no chatters are returned, the saved variable is set to `undefined`. + +{% include async.html %} + +| Box Name | Type | Description | +|-------|--------|-------- +Channel|Twitch Account|Channel name to get a random chatter from. Leave empty to use the default Twitch account. +Save Variable As|String|Variable name to save the viewer display name. +{:class='table table-primary'} + +{% include alert.html text="Requires the moderator:read:chatters and user:read:email Twitch scopes for the selected channel/account." type="info" %} diff --git a/doc_posts/_commands-twitch-info/twitch-get-rewards.md b/doc_posts/_commands-twitch-info/twitch-get-rewards.md index b6ceb861..1867951f 100644 --- a/doc_posts/_commands-twitch-info/twitch-get-rewards.md +++ b/doc_posts/_commands-twitch-info/twitch-get-rewards.md @@ -9,7 +9,7 @@ redirect_from: Gets a list of the custom Channel Point Rewards for the specified channel. Will not return info on standard Rewards, like "Highlight This Message". For more information on what the response contains, check out the Response Body table in the [Twitch API Reference Guide for Get Custom Reward](https://dev.twitch.tv/docs/api/reference/#get-custom-reward) -{% include alert.html text="This command needs some time to execute, either delay your next commands by 1-2 seconds or use Wait Until Variable Exists command." type="warning" %} +{% include async.html %} | Box Name | Type | Description | |-------|--------|-------- @@ -20,4 +20,4 @@ Save Variable As|String|Variable to save the result | Chat Message Example | Description | |-------|--------|-------- data|Object array|Array of objects containing A LOT of info -{:class='table table-secondary w-auto table-hover data-toggle='table' text-break } \ No newline at end of file +{:class='table table-secondary w-auto table-hover text-break'} diff --git a/doc_posts/_commands-twitch-info/twitch-get-shared-chat-session.md b/doc_posts/_commands-twitch-info/twitch-get-shared-chat-session.md new file mode 100644 index 00000000..02a43ae7 --- /dev/null +++ b/doc_posts/_commands-twitch-info/twitch-get-shared-chat-session.md @@ -0,0 +1,34 @@ +--- +title: "Get Shared Chat Session" +num: 1.21 +version: 202440 +redirect_from: + - commands/339 +--- + +Retrieves the active shared chat session for a Twitch channel. + +If **Channel** is empty, SAMMI uses the default Twitch account. The command saves the active shared chat session object returned by Twitch. If there is no active shared chat session, the saved variable is set to `undefined`. + +{% include async.html %} +{% include alert.html text="This command returns nothing if there isn't an active shared chat, leaving your variable with the result of undefined!" type="info" %} + +| Box Name | Type | Description | +|-------|--------|--------| +Channel|Twitch Account|Channel name to get shared chat info from. Leave empty to use the default Twitch account. +Save Variable As|String|Variable name to save the shared chat session object. +{:class='table table-primary'} + +**Response Data:** + +| Variable Name | Type | Description | +|---------------|------|-------------| +session_id|String|The ID for the shared chat session. +host_broadcaster_id|String|The User ID of the host channel. +participants|Array|Array of objects for each participant of the shared chat session. +participants[`0-?`].broadcaster_id|String|The User ID of the participant. +updated_at|String|The time in Twitch format that the shared chat session was last updated. +created_at|String|The time in Twitch format that the shared chat session was created. +{:class='table table-secondary w-auto table-hover text-break'} + +{% include alert.html text="Requires the user:read:email Twitch scope for the selected channel/account." type="info" %} diff --git a/doc_posts/_commands-twitch-info/twitch-get-stream-info.md b/doc_posts/_commands-twitch-info/twitch-get-stream-info.md index 6b459a38..e0960652 100644 --- a/doc_posts/_commands-twitch-info/twitch-get-stream-info.md +++ b/doc_posts/_commands-twitch-info/twitch-get-stream-info.md @@ -7,7 +7,9 @@ redirect_from: Gets information about an active stream. -{% include alert.html text="This command needs some time to execute, either delay your next commands by 1-2 seconds or use Wait Until Variable Exists command." type="warning" %} +{% include async.html %} +{% include alert.html text="This command returns nothing if the channel isn't live, leaving your variable with the result of undefined!" type="info" %} +{% include alert.html text="This command returns nothing if your content display preferences hide certain labels!" type="warning" %} | Box Name | Type | Description | |-------|--------|-------- diff --git a/doc_posts/_commands-twitch-info/twitch-get-sub-count.md b/doc_posts/_commands-twitch-info/twitch-get-sub-count.md index d73c2bf5..41d42a6e 100644 --- a/doc_posts/_commands-twitch-info/twitch-get-sub-count.md +++ b/doc_posts/_commands-twitch-info/twitch-get-sub-count.md @@ -5,21 +5,16 @@ redirect_from: - commands/177 --- -Returns the amount of subscribers your channel currently has. +Returns the total subscriber count for a Twitch channel. -{% include alert.html text="This command needs some time to execute, either delay your next commands by 1-2 seconds or use Wait Until Variable Exists command." type="warning" %} +If **Login Name** is empty, SAMMI uses the default Twitch account. If Twitch is not connected, the channel cannot be resolved, or the request fails, the saved variable is set to `undefined`. + +{% include async.html %} | Box Name | Type | Description | |-------|--------|-------- -|Login Name | Dropdown |Your Twitch login name (all lowercase characters) -|Save Variable As|String|Variable name to save the subscriber count +|Login Name|Twitch Account|Twitch channel to get the subscriber count for. Leave empty to use the default Twitch account. +|Save Variable As|String|Variable name to save the subscriber count. {:class='table table-primary'} - - - - - - - - +{% include alert.html text="Requires the channel:read:subscriptions Twitch scope." type="info" %} diff --git a/doc_posts/_commands-twitch-info/twitch-get-sub-status.md b/doc_posts/_commands-twitch-info/twitch-get-sub-status.md index ef7536b8..5e7c5526 100644 --- a/doc_posts/_commands-twitch-info/twitch-get-sub-status.md +++ b/doc_posts/_commands-twitch-info/twitch-get-sub-status.md @@ -5,10 +5,12 @@ redirect_from: - commands/176 --- -Checks if a specific user is subscribed to your channel.\ +{% include alert.html text="Are you looking to only get if a user is subscribed or not? Get User Status is what you are looking for, not this!" type="warning" %} + +Returns an object containing context behind a specified user's subscription.\ Returns an empty object if the user is not subscribed. -{% include alert.html text="This command needs some time to execute, either delay your next commands by 1-2 seconds or use Wait Until Variable Exists command." type="warning" %} +{% include async.html %} | Box Name | Type | Description | |-------|--------|-------- @@ -19,7 +21,6 @@ Returns an empty object if the user is not subscribed. You can access the response object's data by using [Get Object Variable]({{ "commands/object#getobjectvariable" | relative_url }}) command. - **Response Data:** | Variable Name | Type | Description | diff --git a/doc_posts/_commands-twitch-info/twitch-get-team-information.md b/doc_posts/_commands-twitch-info/twitch-get-team-information.md new file mode 100644 index 00000000..50d1506e --- /dev/null +++ b/doc_posts/_commands-twitch-info/twitch-get-team-information.md @@ -0,0 +1,39 @@ +--- +title: "Get Team Info" +num: 1.32 +version: 202440 +redirect_from: + - commands/341 +--- + +Gets information about a Twitch team. + +{% include async.html %} +{% include alert.html text="The team name can be found in the URL of the team's page. You can also use Twitch: Get Channel Teams to get the team name." type="info" %} + +| Box Name | Type | Description | +|-------|--------|-------- +Team Name|String|The internal Twitch team name to get information for. +Save Variable As|String|Variable name to save the team info object. +{:class='table table-primary'} + +**Response Data:** + +| Variable Name | Type | Description | +|---------------|------|-------------| +team_display_name|String|The display name of the team. +name|String|The internal name of the team. +id|String|The ID of the team. +info|String|The description on the team. +users|Array|Array of objects for each user in the team. +users[`0-?`].user_id|String|User ID of that team member. +users[`0-?`].user_login|String|User login of that team member. +users[`0-?`].user_name|String|User display name of that team member. +background_image_url|String|The background image the team page uses. +banner|String|The banner image the team page uses. +thumbnail_url|String|The thumbnail image the team page uses. +updated_at|String|The time in Twitch format that the team was last updated. +created_at|String|The time in Twitch format that the team was created. +{:class='table table-secondary w-auto table-hover text-break'} + +{% include alert.html text="If the team name is empty or Twitch cannot find the team, the saved variable is set to undefined." type="info" %} diff --git a/doc_posts/_commands-twitch-info/twitch-get-user-color.md b/doc_posts/_commands-twitch-info/twitch-get-user-color.md index 3ff6c6c3..5aa4d73a 100644 --- a/doc_posts/_commands-twitch-info/twitch-get-user-color.md +++ b/doc_posts/_commands-twitch-info/twitch-get-user-color.md @@ -8,7 +8,7 @@ redirect_from: Gets the colour of the specified user's name in chat rooms. -{% include alert.html text="This command needs some time to execute, either delay your next commands by 1-2 seconds or use Wait Until Variable Exists command." type="warning" %} +{% include async.html %} | Box Name | Type | Description | |-------|--------|-------- @@ -22,4 +22,4 @@ color|string|Hex code for the colour of the specified user's name user_id|String|The user's ID user_login|String|The user's login name user_name|String|The user's display name -{:class='table table-secondary w-auto table-hover data-toggle='table' text-break } \ No newline at end of file +{:class='table table-secondary w-auto table-hover text-break'} diff --git a/doc_posts/_commands-twitch-info/twitch-get-user-info.md b/doc_posts/_commands-twitch-info/twitch-get-user-info.md index 2b21b137..569b4c1f 100644 --- a/doc_posts/_commands-twitch-info/twitch-get-user-info.md +++ b/doc_posts/_commands-twitch-info/twitch-get-user-info.md @@ -9,7 +9,7 @@ Retrieves information about a Twitch user. Provide either their username or user If your SAMMI crashes with an error log relating to this command, make sure you have enabled the `View email address` scope in your Twitch connection settings. The command will not work without this scope enabled. -{% include alert.html text="This command needs some time to execute, either delay your next commands by 1-2 seconds or use Wait Until Variable Exists command." type="warning" %} +{% include async.html %} | Box Name | Type | Description | |-------|--------|-------- @@ -38,7 +38,7 @@ You can access the response object's data by using [Get Object Variable]({{ "com |created_at| string| Date when the user was created. {:class='table table-secondary w-auto table-hover' } -{% include example_public.html src="https://i.imgur.com/1wykfcB.png" size="100" title="Get a follower's profile picture" pastebin="FcaArEdc" %} +{% include example_public.html src="/docs/assets/images/commands-twitch-info/twitchUserInfo_Ex.png" size="100" title="Get a follower's profile picture" pastebin="FcaArEdc" %} diff --git a/doc_posts/_commands-twitch-info/twitch-get-vips.md b/doc_posts/_commands-twitch-info/twitch-get-vips.md index 66c0b7b8..27cc3a1d 100644 --- a/doc_posts/_commands-twitch-info/twitch-get-vips.md +++ b/doc_posts/_commands-twitch-info/twitch-get-vips.md @@ -8,7 +8,7 @@ redirect_from: Gets a list of users that are VIPs in the specified broadcaster's chat room. -{% include alert.html text="This command needs some time to execute, either delay your next commands by 1-2 seconds or use Wait Until Variable Exists command." type="warning" %} +{% include async.html %} | Box Name | Type | Description | |-------|--------|-------- @@ -24,4 +24,4 @@ data[`0-?`]|Object|contains info for a VIP data[`0-?`].user_id|String|The user's ID data[`0-?`].user_login|String|The user's login name data[`0-?`].user_name|String|The user's display name -{:class='table table-secondary w-auto table-hover data-toggle='table' text-break } \ No newline at end of file +{:class='table table-secondary w-auto table-hover text-break'} diff --git a/doc_posts/_commands-twitch-misc/twitch-api-call.md b/doc_posts/_commands-twitch-misc/twitch-api-call.md index 597b2841..58310ca9 100644 --- a/doc_posts/_commands-twitch-misc/twitch-api-call.md +++ b/doc_posts/_commands-twitch-misc/twitch-api-call.md @@ -6,8 +6,12 @@ redirect_from: - commands/268 --- -Makes an API Call to the specified URL. Automatically creates a header for Twitch API Calls. -For making non-Twitch API Calls, use the [HTTP Request]({{ "commands/misc#httprequest" | relative_url }}) command. +Makes a Twitch API Call to the specified Twitch API URL.\ +Works like the HTTP Request command, but automatically creates a header for Twitch API Calls. Convenient! + +{% include async.html %} + +{% include alert.html text="For making non-Twitch API Calls, use the HTTP Request command instead!" type="info" %} | Box Name | Type | Description | |-------|--------|-------- diff --git a/doc_posts/_commands-twitch-misc/twitch-create-clip.md b/doc_posts/_commands-twitch-misc/twitch-create-clip.md index 3ec74d3d..2b2a519c 100644 --- a/doc_posts/_commands-twitch-misc/twitch-create-clip.md +++ b/doc_posts/_commands-twitch-misc/twitch-create-clip.md @@ -6,13 +6,20 @@ redirect_from: --- Creates a new clip. +For more information on creating clips, check out the [Twitch API Reference Guide for Create Clip](https://dev.twitch.tv/docs/api/reference/#create-clip). + +{% include async.html %} | Box Name | Type | Description | |-------|--------|-------- -|Login Name | Dropdown |Your Twitch login name (all lowercase characters) to change the stream status of -|Save Variable As (optional)|String|Variable to save your newly created clip ID +|Login Name | Dropdown |Your Twitch login name (all lowercase characters) to create the clip for. +|Clip Title|String|Optional title to apply to the created clip. +|Clip Duration|Number {% include asterisk.html%}|Optional clip duration in seconds. Must be between 5 and 60 seconds. +|Save Variable As (optional)|String|Variable to save your newly created clip ID. {:class='table table-primary'} +{% include alert.html text="Requires the clips:edit Twitch scope." type="info" %} + diff --git a/doc_posts/_commands-twitch-misc/twitch-create-eventsub-subscription.md b/doc_posts/_commands-twitch-misc/twitch-create-eventsub-subscription.md new file mode 100644 index 00000000..038a7790 --- /dev/null +++ b/doc_posts/_commands-twitch-misc/twitch-create-eventsub-subscription.md @@ -0,0 +1,22 @@ +--- +title: "Create EventSub Subscription" +num: 21 +version: 202520 +redirect_from: + - commands/345 +--- + +Create custom Twitch EventSub subscriptions. +This lets you subscribe to any Twitch EventSub event, that way you don't have to wait for a new SAMMI update to get access to new EventSub events. + +{% include alert.html text="You can find a list of all the EventSub Subscriptions here." type="info" %} + +{% include alert.html text="You need to use the Custom EventSub Subscription trigger in order to listen to these triggers." type="warning" %} + +{% include alert.html text="SAMMI does NOT save custom subscriptions, you will need to make a button to automatically subscribe to custom events on startup." type="warning" %} + +| Box Name | Type | Description | +|-------|--------|-------- +|Subscription Type|String|The Event to subscribe to. Must be dot notation, for example automod.message.hold| +|Version|Number|The version of the Event you wish to Subscribe, this is found next to the event name in the Twitch Documentation| +{:class='table table-primary'} diff --git a/doc_posts/_commands-twitch-misc/twitch-delete-eventsub-subscription.md b/doc_posts/_commands-twitch-misc/twitch-delete-eventsub-subscription.md new file mode 100644 index 00000000..f0e50c92 --- /dev/null +++ b/doc_posts/_commands-twitch-misc/twitch-delete-eventsub-subscription.md @@ -0,0 +1,17 @@ +--- +title: "Delete EventSub Subscription" +num: 22 +version: 202520 +redirect_from: + - commands/347 +--- + +Deletes a custom Twitch EventSub subscription. +This lets you unsubscribe from any Twitch EventSub event. + +{% include alert.html text="You will need to use Get Active EventSub Subscriptions in order to get the internal reference ID for the subscription." type="warning" %} + +| Box Name | Type | Description | +|-------|--------|-------- +|EventSub Subscription Id|String|The internal Id referencing this subscription.| +{:class='table table-primary'} diff --git a/doc_posts/_commands-twitch-misc/twitch-get-active-eventsub-subcriptions.md b/doc_posts/_commands-twitch-misc/twitch-get-active-eventsub-subcriptions.md new file mode 100644 index 00000000..393a408b --- /dev/null +++ b/doc_posts/_commands-twitch-misc/twitch-get-active-eventsub-subcriptions.md @@ -0,0 +1,14 @@ +--- +title: "Get Active EventSub Subscriptions" +num: 20 +version: 202520 +redirect_from: + - commands/346 +--- + +Retrieves a list of all your active EventSub subscriptions. + +| Box Name | Type | Description | +|-------|--------|-------- +|Save Variable As|String|Variable to save the result| +{:class='table table-primary'} diff --git a/doc_posts/_commands-twitch-misc/twitch-get-ad-schedule.md b/doc_posts/_commands-twitch-misc/twitch-get-ad-schedule.md new file mode 100644 index 00000000..1f3ddd1f --- /dev/null +++ b/doc_posts/_commands-twitch-misc/twitch-get-ad-schedule.md @@ -0,0 +1,21 @@ +--- +title: "Get Ad Schedule" +num: 23 +version: 202610 +redirect_from: + - commands/329 +--- + +Gets ad schedule information for the specified Twitch channel. +For more information on what the response contains, check out the Response Body table in the [Twitch API Reference Guide for Get Ad Schedule](https://dev.twitch.tv/docs/api/reference/#get-ad-schedule). + +{% include async.html %} + +| Box Name | Type | Description | +|-------|--------|-------- +|Channel|Dropdown|Twitch channel to get the ad schedule from. This can be left empty to use the default account. +|Save Variable As|String|Variable name to save the response as. +{:class='table table-primary'} + +{% include alert.html text="Requires the channel:read:ads Twitch scope." type="info" %} + diff --git a/doc_posts/_commands-twitch-misc/twitch-get-user-status.md b/doc_posts/_commands-twitch-misc/twitch-get-user-status.md new file mode 100644 index 00000000..b0021338 --- /dev/null +++ b/doc_posts/_commands-twitch-misc/twitch-get-user-status.md @@ -0,0 +1,23 @@ +--- +title: "Get User Status" +version: 202320 +num: 17 +redirect_from: + - commands/303 +--- +Returns the status of a user for one of your linked channels. The response will return either true or false.\ +Available status types: +- Check Subscriber +- Check Mod +- Check VIP +- Check Follower + +{% include async.html %} + +| Box Name | Type | Description | +|-------|--------|-------- +|Channel|Dropdown|Twitch channel to get a user's status for. This can be left empty. +|User Name|String|User Name of the user to get the status for. +|Type|Dropdown|Use the dropdown menu to choose the status type. +|Save Variable As|String|Name of the variable to save the response as. +{:class='table table-primary'} diff --git a/doc_posts/_commands-twitch-misc/twitch-get-videos.md b/doc_posts/_commands-twitch-misc/twitch-get-videos.md new file mode 100644 index 00000000..4b7c8d44 --- /dev/null +++ b/doc_posts/_commands-twitch-misc/twitch-get-videos.md @@ -0,0 +1,23 @@ +--- +title: "Get Videos" +version: 202320 +num: 16 +redirect_from: + - commands/302 +--- +Gets videos from a Twitch channel.\ +Available types of videos: +- All Videos +- Archives +- Highlights +- Uploads +- Clips + +If 'All Videos' is selected, the response will not contain 'Clips'. The response received, depending on the size of the request, will require some time to load, so please ensure you use a 'Wait Until Variable Exists' command with this one. + +| Box Name | Type | Description | +|-------|--------|-------- +|Channel|Dropdown|Twitch channel to get videos from. This can be left empty. +|Type|Dropdown|Dropdown of video types that can be received from Twitch. +|Save Variable As|String|Name of the variable to save the response as. +{:class='table table-primary'} diff --git a/doc_posts/_commands-twitch-misc/twitch-snooze-next-ad.md b/doc_posts/_commands-twitch-misc/twitch-snooze-next-ad.md new file mode 100644 index 00000000..33e8bc53 --- /dev/null +++ b/doc_posts/_commands-twitch-misc/twitch-snooze-next-ad.md @@ -0,0 +1,21 @@ +--- +title: "Snooze Next Ad" +num: 24 +version: 202610 +redirect_from: + - commands/330 +--- + +Snoozes the next automatic mid-roll ad for the specified Twitch channel. +For more information on what the response contains, check out the Response Body table in the [Twitch API Reference Guide for Snooze Next Ad](https://dev.twitch.tv/docs/api/reference/#snooze-next-ad). + +{% include async.html %} + +| Box Name | Type | Description | +|-------|--------|-------- +|Channel|Dropdown|Twitch channel to snooze the next ad for. This can be left empty to use the default account. +|Save Variable As|String|Variable name to save the response as. +{:class='table table-primary'} + +{% include alert.html text="Requires the channel:read:ads Twitch scope." type="info" %} + diff --git a/doc_posts/_commands-twitch-moderation/twitch-add-mod.md b/doc_posts/_commands-twitch-moderation/twitch-add-mod.md index feae4e0b..94e6a67a 100644 --- a/doc_posts/_commands-twitch-moderation/twitch-add-mod.md +++ b/doc_posts/_commands-twitch-moderation/twitch-add-mod.md @@ -6,10 +6,14 @@ redirect_from: - commands/282 --- -Promotes a user to a moderator. To demote a moderator, use the [Remove Moderator]({{ "commands/twitch-moderation#remove-mod" | relative_url }}) command. +Promotes a user to moderator in the specified Twitch channel. To demote a moderator, use [Remove Moderator]({{ "commands/twitch-remove-mod" | relative_url }}). + +If **Channel** is empty, SAMMI uses the default Twitch account. | Box Name | Type | Description | |-------|--------|-------- Channel|String|The channel to promote the specified user in User Name|String|The username of the person to be promoted -{:class='table table-primary'} \ No newline at end of file +{:class='table table-primary'} + +{% include alert.html text="Requires the channel:manage:moderators and user:read:email Twitch scopes." type="info" %} diff --git a/doc_posts/_commands-twitch-moderation/twitch-add-suspicious-user.md b/doc_posts/_commands-twitch-moderation/twitch-add-suspicious-user.md new file mode 100644 index 00000000..d6dd614a --- /dev/null +++ b/doc_posts/_commands-twitch-moderation/twitch-add-suspicious-user.md @@ -0,0 +1,20 @@ +--- +title: "Add Suspicious User" +num: 12 +version: 202610 +redirect_from: + - commands/350 +--- + +Flags a Twitch user as suspicious in the specified channel. +For more information, check out the [Twitch API Reference Guide for Add Suspicious Status to Chat User](https://dev.twitch.tv/docs/api/reference/#add-suspicious-status-to-chat-user). + +| Box Name | Type | Description | +|-------|--------|-------- +|Channel|Dropdown|Twitch channel to flag the user in. +|User Name|String|The username of the person to flag. +|Status|Dropdown|Suspicious user status to apply: `Active Monitoring` or `Restricted`. +{:class='table table-primary'} + +{% include alert.html text="Requires the moderator:manage:suspicious_users and user:read:email Twitch scopes." type="info" %} + diff --git a/doc_posts/_commands-twitch-moderation/twitch-add-vip.md b/doc_posts/_commands-twitch-moderation/twitch-add-vip.md index e451338d..ace1e6aa 100644 --- a/doc_posts/_commands-twitch-moderation/twitch-add-vip.md +++ b/doc_posts/_commands-twitch-moderation/twitch-add-vip.md @@ -6,10 +6,14 @@ redirect_from: - commands/284 --- -Promotes a user to VIP. To demote a VIP, use the [Remove VIP]({{ "commands/twitch-moderation#remove-vip" | relative_url }}) command. +Promotes a user to VIP in the specified Twitch channel. To remove VIP status, use [Remove VIP]({{ "commands/twitch-remove-vip" | relative_url }}). + +If **Channel** is empty, SAMMI uses the default Twitch account. | Box Name | Type | Description | |-------|--------|-------- Channel|String|The channel to promote the specified user in User Name|String|The username of the person to be promoted -{:class='table table-primary'} \ No newline at end of file +{:class='table table-primary'} + +{% include alert.html text="Requires the channel:manage:vips and user:read:email Twitch scopes." type="info" %} diff --git a/doc_posts/_commands-twitch-moderation/twitch-ban-user.md b/doc_posts/_commands-twitch-moderation/twitch-ban-user.md index 7c7802cc..cd419537 100644 --- a/doc_posts/_commands-twitch-moderation/twitch-ban-user.md +++ b/doc_posts/_commands-twitch-moderation/twitch-ban-user.md @@ -6,12 +6,15 @@ redirect_from: - commands/273 --- -Bans a user from participating in the specified broadcaster's chat room. -To remove the ban, use the [Unban User]({{ "commands/twitch-moderation#unban-user" | relative_url }}) command. +Bans a user from participating in the specified broadcaster's chat room. To remove the ban, use [Unban User]({{ "commands/unban-user" | relative_url }}). + +If **Channel** is empty, SAMMI uses the default Twitch account. | Box Name | Type | Description | |-------|--------|-------- Channel|String|The channel to ban the specified user in User Name|String|The username of the person to be banned Reason|String|(optional) The reason why you are banning them -{:class='table table-primary'} \ No newline at end of file +{:class='table table-primary'} + +{% include alert.html text="Requires the moderator:manage:banned_users and user:read:email Twitch scopes." type="info" %} diff --git a/doc_posts/_commands-twitch-moderation/twitch-block-user.md b/doc_posts/_commands-twitch-moderation/twitch-block-user.md new file mode 100644 index 00000000..e68869df --- /dev/null +++ b/doc_posts/_commands-twitch-moderation/twitch-block-user.md @@ -0,0 +1,19 @@ +--- +title: "Block User" +num: 11 +version: 202610 +redirect_from: + - commands/331 +--- + +Blocks a Twitch user for the specified account. +For more information, check out the [Twitch API Reference Guide for Block User](https://dev.twitch.tv/docs/api/reference/#block-user). + +| Box Name | Type | Description | +|-------|--------|-------- +|Channel|Dropdown|Twitch account to block the user from. +|User Name|String|The username of the person to block. +{:class='table table-primary'} + +{% include alert.html text="Requires the user:manage:blocked_users and user:read:email Twitch scopes." type="info" %} + diff --git a/doc_posts/_commands-twitch-moderation/twitch-cancel-raid.md b/doc_posts/_commands-twitch-moderation/twitch-cancel-raid.md index cc1d9d2d..c2cff008 100644 --- a/doc_posts/_commands-twitch-moderation/twitch-cancel-raid.md +++ b/doc_posts/_commands-twitch-moderation/twitch-cancel-raid.md @@ -6,9 +6,13 @@ redirect_from: - commands/272 --- -Cancels a ongoing Raid, as long as it is before the countdown timer has expired, or the broadcaster has clicked the Raid Now button. +Cancels an ongoing raid, as long as the countdown timer has not expired and the broadcaster has not clicked the Raid Now button. + +If **Channel** is empty, SAMMI uses the default Twitch account. | Box Name | Type | Description | |-------|--------|-------- Channel|String|The channel to cancel the ongoing raid in -{:class='table table-primary'} \ No newline at end of file +{:class='table table-primary'} + +{% include alert.html text="Requires the channel:manage:raids Twitch scope." type="info" %} diff --git a/doc_posts/_commands-twitch-moderation/twitch-change-stream-status.md b/doc_posts/_commands-twitch-moderation/twitch-change-stream-status.md index eb28ba75..f27e2884 100644 --- a/doc_posts/_commands-twitch-moderation/twitch-change-stream-status.md +++ b/doc_posts/_commands-twitch-moderation/twitch-change-stream-status.md @@ -1,20 +1,25 @@ --- title: "Change Stream Status" num: 8.1 +version: 20999999 redirect_from: - commands/172 --- Modifies your channel information. + + | Box Name | Type | Description | |-------|--------|-------- |Login Name | Dropdown |Your Twitch login name (all lowercase characters) to change the stream status of |Title|String|The title of the stream. Value must not be an empty string. |Game Name|String|The current game name being played on the channel, for example `Doom`. -|Language|String|The language of the channel. A language value must be either the ISO 639-1 two-letter code for a supported stream language or “other”. +|Language|String|The language of the channel. A language value must be either the ISO 639-1 two-letter code for a supported stream language or `other`. {:class='table table-primary'} +{% include alert.html text="Requires the channel:manage:broadcast Twitch scope." type="info" %} + diff --git a/doc_posts/_commands-twitch-moderation/twitch-get-automod.md b/doc_posts/_commands-twitch-moderation/twitch-get-automod.md new file mode 100644 index 00000000..d4bcf175 --- /dev/null +++ b/doc_posts/_commands-twitch-moderation/twitch-get-automod.md @@ -0,0 +1,19 @@ +--- +title: "Get Automod Settings" +num: 8.3 +version: 202320 +redirect_from: + - commands/304 +--- + +Gets AutoMod settings for a Twitch channel. This only works for channels linked and authorized to be used with SAMMI. + +If **Channel** is empty, SAMMI uses the default Twitch account. The response is saved as an object containing the AutoMod level fields returned by Twitch. + +| Box Name | Type | Description | +|-------|--------|-------- +Channel|String|Channel name to get AutoMod settings for. This can be left empty. +Save Variable As|String|Name of the variable to save the response as. If the response is 0, AutoMod settings for that function has not been turned on. If it is 1, it has been turned on. +{:class='table table-primary'} + +{% include alert.html text="Requires the moderator:read:automod_settings and user:read:email Twitch scopes." type="info" %} diff --git a/doc_posts/_commands-twitch-moderation/twitch-modify-channel-info.md b/doc_posts/_commands-twitch-moderation/twitch-modify-channel-info.md index 177f0ca1..3aec6f75 100644 --- a/doc_posts/_commands-twitch-moderation/twitch-modify-channel-info.md +++ b/doc_posts/_commands-twitch-moderation/twitch-modify-channel-info.md @@ -6,9 +6,11 @@ redirect_from: - commands/293 --- -Updates a channel's information, such as title, language, tags. +Updates a channel's information, such as category, title, language, and tags. Leave a box blank to not update that information. Requires at least 1 field to update. +If **Channel** is empty, SAMMI uses the default Twitch account. + | Box Name | Type | Description | |-------|--------|-------- Channel|String|Channel name to change the information for @@ -17,3 +19,5 @@ Language|Dropdown|The [ISO 639-1 2 letter language code](https://en.wikipedia.or Title|String|Title of the stream Tags|Stringified array|Tags to apply to the channel, as a stringified array (`["Tag1", "Tag2"]`) {:class='table table-primary'} + +{% include alert.html text="Requires the channel:manage:broadcast Twitch scope." type="info" %} diff --git a/doc_posts/_commands-twitch-moderation/twitch-remove-blocked-term.md b/doc_posts/_commands-twitch-moderation/twitch-remove-blocked-term.md new file mode 100644 index 00000000..545ae1dc --- /dev/null +++ b/doc_posts/_commands-twitch-moderation/twitch-remove-blocked-term.md @@ -0,0 +1,19 @@ +--- +title: "Remove Blocked Term" +num: 9.1 +version: 202322 +redirect_from: + - commands/316 +--- + +Removes a blocked term from the specified Twitch channel. + +If **Channel** is empty, SAMMI uses the default Twitch account. + +| Box Name | Type | Description | +|-------|--------|-------- +Channel|String|Channel name to add new blocked term +Term ID|String|ID of term to be removed. Can be retrieved from [Twitch: Get Blocked Terms](twitch-info#getblockedterms). +{:class='table table-primary'} + +{% include alert.html text="Requires the moderator:manage:blocked_terms Twitch scope." type="info" %} diff --git a/doc_posts/_commands-twitch-moderation/twitch-remove-mod.md b/doc_posts/_commands-twitch-moderation/twitch-remove-mod.md index 7377a196..dafe7859 100644 --- a/doc_posts/_commands-twitch-moderation/twitch-remove-mod.md +++ b/doc_posts/_commands-twitch-moderation/twitch-remove-mod.md @@ -6,10 +6,14 @@ redirect_from: - commands/283 --- -Demotes a user from being a moderator. +Removes moderator status from a user in the specified Twitch channel. + +If **Channel** is empty, SAMMI uses the default Twitch account. | Box Name | Type | Description | |-------|--------|-------- Channel|String|The channel to demote the specified user in User Name|String|The username of the person to be demoted -{:class='table table-primary'} \ No newline at end of file +{:class='table table-primary'} + +{% include alert.html text="Requires the channel:manage:moderators and user:read:email Twitch scopes." type="info" %} diff --git a/doc_posts/_commands-twitch-moderation/twitch-remove-suspicious-user.md b/doc_posts/_commands-twitch-moderation/twitch-remove-suspicious-user.md new file mode 100644 index 00000000..88e01112 --- /dev/null +++ b/doc_posts/_commands-twitch-moderation/twitch-remove-suspicious-user.md @@ -0,0 +1,19 @@ +--- +title: "Remove Suspicious Users" +num: 12.1 +version: 202610 +redirect_from: + - commands/351 +--- + +Removes the suspicious user status from a Twitch user in the specified channel. +For more information, check out the [Twitch API Reference Guide for Remove Suspicious Status From Chat User](https://dev.twitch.tv/docs/api/reference/#remove-suspicious-status-from-chat-user). + +| Box Name | Type | Description | +|-------|--------|-------- +|Channel|Dropdown|Twitch channel to remove the status in. +|User Name|String|The username of the person to update. +{:class='table table-primary'} + +{% include alert.html text="Requires the moderator:manage:suspicious_users and user:read:email Twitch scopes." type="info" %} + diff --git a/doc_posts/_commands-twitch-moderation/twitch-remove-vip.md b/doc_posts/_commands-twitch-moderation/twitch-remove-vip.md index a1fe96c1..baec252f 100644 --- a/doc_posts/_commands-twitch-moderation/twitch-remove-vip.md +++ b/doc_posts/_commands-twitch-moderation/twitch-remove-vip.md @@ -6,10 +6,14 @@ redirect_from: - commands/285 --- -Demotes a user from being a VIP. +Removes VIP status from a user in the specified Twitch channel. + +If **Channel** is empty, SAMMI uses the default Twitch account. | Box Name | Type | Description | |-------|--------|-------- Channel|String|The channel to demote the specified user in User Name|String|The username of the person to be demoted -{:class='table table-primary'} \ No newline at end of file +{:class='table table-primary'} + +{% include alert.html text="Requires the channel:manage:vips and user:read:email Twitch scopes." type="info" %} diff --git a/doc_posts/_commands-twitch-moderation/twitch-run-ad.md b/doc_posts/_commands-twitch-moderation/twitch-run-ad.md index 8ab7bbfb..6d3ff919 100644 --- a/doc_posts/_commands-twitch-moderation/twitch-run-ad.md +++ b/doc_posts/_commands-twitch-moderation/twitch-run-ad.md @@ -18,9 +18,12 @@ Save Variable As|String|Variable to save the result {:class='table table-primary'} Returns an object with the following variables: -| Variable name | Type | Description + +| Variable name | Type | Description | |-------|--------|-------- length|number|Duration of the commercial, in seconds message|string|A message that indicates whether Twitch was able to serve an ad retry_after|number|The number of seconds you must wait before running another ad. -{:class='table table-secondary w-auto table-hover data-toggle='table' text-break } \ No newline at end of file +{:class='table table-secondary w-auto table-hover text-break'} + +{% include alert.html text="If Channel Name is empty, SAMMI uses the default Twitch account. The saved result is set to undefined if Twitch rejects the ad request." type="info" %} diff --git a/doc_posts/_commands-twitch-moderation/twitch-set-automod.md b/doc_posts/_commands-twitch-moderation/twitch-set-automod.md new file mode 100644 index 00000000..1ff94ea2 --- /dev/null +++ b/doc_posts/_commands-twitch-moderation/twitch-set-automod.md @@ -0,0 +1,23 @@ +--- +title: "Set Automod Settings" +num: 8.4 +version: 202320 +redirect_from: + - commands/305 +--- + +Sets AutoMod settings for a Twitch channel. This only works for channels linked and authorized to be used with SAMMI.\ +Moderation levels available: as provided by Twitch: +- AutoMod Off +- A Little Moderation +- Some Moderation +- More Moderation +- A Lot of Moderation + +| Box Name | Type | Description | +|-------|--------|-------- +Channel|String|Channel name to get AutoMod settings for. This can be left empty. +Level|Dropdown|Dropdown selection of AutoMod levels available. +{:class='table table-primary'} + +{% include alert.html text="Requires the moderator:manage:automod_settings Twitch scope." type="info" %} diff --git a/doc_posts/_commands-twitch-moderation/twitch-set-blocked-term.md b/doc_posts/_commands-twitch-moderation/twitch-set-blocked-term.md new file mode 100644 index 00000000..80f399cc --- /dev/null +++ b/doc_posts/_commands-twitch-moderation/twitch-set-blocked-term.md @@ -0,0 +1,19 @@ +--- +title: "Set Blocked Term" +num: 9 +version: 202322 +redirect_from: + - commands/315 +--- + +Adds a new blocked term to the specified Twitch channel. + +If **Channel** is empty, SAMMI uses the default Twitch account. + +| Box Name | Type | Description | +|-------|--------|-------- +Channel|String|Channel name to add new blocked term +Term|String|New term to be blocked +{:class='table table-primary'} + +{% include alert.html text="Requires the moderator:manage:blocked_terms Twitch scope." type="info" %} diff --git a/doc_posts/_commands-twitch-moderation/twitch-set-emote-mode.md b/doc_posts/_commands-twitch-moderation/twitch-set-emote-mode.md index ffbe137e..d2f8412d 100644 --- a/doc_posts/_commands-twitch-moderation/twitch-set-emote-mode.md +++ b/doc_posts/_commands-twitch-moderation/twitch-set-emote-mode.md @@ -10,8 +10,12 @@ Enables or disables Emote-Only Mode in the specified channel. Emote-Only Mode restricts what can be said in chat to only emotes. VIPs and Moderators are not restricted. +If **Channel** is empty, SAMMI uses the default Twitch account. + | Box Name | Type | Description | |-------|--------|-------- Channel|String|Channel name to set Emote-Only Mode for Enabled|Dropdown|Enable/Disable -{:class='table table-primary'} \ No newline at end of file +{:class='table table-primary'} + +{% include alert.html text="Requires the moderator:manage:chat_settings Twitch scope." type="info" %} diff --git a/doc_posts/_commands-twitch-moderation/twitch-set-follower-mode.md b/doc_posts/_commands-twitch-moderation/twitch-set-follower-mode.md index cf7cc364..846dd36f 100644 --- a/doc_posts/_commands-twitch-moderation/twitch-set-follower-mode.md +++ b/doc_posts/_commands-twitch-moderation/twitch-set-follower-mode.md @@ -10,9 +10,13 @@ Enables or disables Follower-Only Mode in the specified channel. Follower-Only Mode restricts who can talk in a channel to only followers who have been following for the specified amount of time. VIPs and Moderators are not restricted. +If **Channel** is empty, SAMMI uses the default Twitch account. + | Box Name | Type | Description | |-------|--------|-------- Channel|String|Channel name to set Follower-Only Mode for Enabled|Dropdown|Enable/Disable Time|Dropdown|Specific amounts of time that users need to have followed for -{:class='table table-primary'} \ No newline at end of file +{:class='table table-primary'} + +{% include alert.html text="Requires the moderator:manage:chat_settings Twitch scope." type="info" %} diff --git a/doc_posts/_commands-twitch-moderation/twitch-set-shield-mode.md b/doc_posts/_commands-twitch-moderation/twitch-set-shield-mode.md index 7583ae9e..c57a24eb 100644 --- a/doc_posts/_commands-twitch-moderation/twitch-set-shield-mode.md +++ b/doc_posts/_commands-twitch-moderation/twitch-set-shield-mode.md @@ -9,8 +9,12 @@ redirect_from: Toggles Shield Mode on/off for the specified channel. Click [here](https://safety.twitch.tv/s/article/Protect-your-channel-with-Shield-Mode) for more information on Shield Mode. +If **Channel** is empty, SAMMI uses the default Twitch account. + | Box Name | Type | Description | |-------|--------|-------- Channel|String|Channel to toggle Shield Mode for Enabled|Dropdown|Enable/Disable -{:class='table table-primary'} \ No newline at end of file +{:class='table table-primary'} + +{% include alert.html text="Requires the moderator:manage:shield_mode Twitch scope." type="info" %} diff --git a/doc_posts/_commands-twitch-moderation/twitch-set-slow-mode.md b/doc_posts/_commands-twitch-moderation/twitch-set-slow-mode.md index d102cc99..8339efc6 100644 --- a/doc_posts/_commands-twitch-moderation/twitch-set-slow-mode.md +++ b/doc_posts/_commands-twitch-moderation/twitch-set-slow-mode.md @@ -10,9 +10,13 @@ Enables or disables Slow Mode in the specified channel. Slow Mode restricts how often users can talk in a channel to once per specified amount of time. VIPs and Moderators are not restricted. +If **Channel** is empty, SAMMI uses the default Twitch account. + | Box Name | Type | Description | |-------|--------|-------- Channel|String|Channel name to set Slow Mode for Enabled|Dropdown|Enable/Disable Time|Number {% include asterisk.html%}|Amount of time, in seconds, that users must wait before they can chat again -{:class='table table-primary'} \ No newline at end of file +{:class='table table-primary'} + +{% include alert.html text="Requires the moderator:manage:chat_settings Twitch scope." type="info" %} diff --git a/doc_posts/_commands-twitch-moderation/twitch-set-subscriber-mode.md b/doc_posts/_commands-twitch-moderation/twitch-set-subscriber-mode.md index 9b55f075..0410739c 100644 --- a/doc_posts/_commands-twitch-moderation/twitch-set-subscriber-mode.md +++ b/doc_posts/_commands-twitch-moderation/twitch-set-subscriber-mode.md @@ -10,8 +10,12 @@ Enables or disables Subscriber-Only Mode in the specified channel. Subscriber-Only Mode restricts who can talk in a channel to only subscribers. VIPs and Moderators are not restricted. +If **Channel** is empty, SAMMI uses the default Twitch account. + | Box Name | Type | Description | |-------|--------|-------- Channel|String|Channel name to set Subscriber-Only Mode for Enabled|Dropdown|Enable/Disable -{:class='table table-primary'} \ No newline at end of file +{:class='table table-primary'} + +{% include alert.html text="Requires the moderator:manage:chat_settings Twitch scope." type="info" %} diff --git a/doc_posts/_commands-twitch-moderation/twitch-set-unique-chat.md b/doc_posts/_commands-twitch-moderation/twitch-set-unique-chat.md new file mode 100644 index 00000000..30c11ccd --- /dev/null +++ b/doc_posts/_commands-twitch-moderation/twitch-set-unique-chat.md @@ -0,0 +1,20 @@ +--- +title: "Set Unique Chat" +num: 8.2 +version: 202320 +redirect_from: + - commands/301 +--- + +Enabling this setting prevents users from posting non-unique messages to the channel.\ +It can be used to combat spam so that users cannot send the same things in chat multiple times. + +If **Channel** is empty, SAMMI uses the default Twitch account. + +| Box Name | Type | Description | +|-------|--------|-------- +|Channel | Dropdown |The Twitch channel the command will be used for. +|Enabled|Choice|Enabled: Turns the setting on. Disabled: Turns the setting off. +{:class='table table-primary'} + +{% include alert.html text="Requires the moderator:manage:chat_settings Twitch scope." type="info" %} diff --git a/doc_posts/_commands-twitch-moderation/twitch-set-user-color.md b/doc_posts/_commands-twitch-moderation/twitch-set-user-color.md index 75297faf..b6522e65 100644 --- a/doc_posts/_commands-twitch-moderation/twitch-set-user-color.md +++ b/doc_posts/_commands-twitch-moderation/twitch-set-user-color.md @@ -6,9 +6,9 @@ redirect_from: - commands/292 --- -Sets the colour of your username in all chat rooms to one of the 15 default colours. -For Turbo/Prime members who can set any colour, use the button at the bottom of the section. -
To get a user's current color, use [Get User Color]({{ "commands/twitch-info#get-user-color" | relative_url }}) +Sets the color of your username in all chat rooms to one of the default Twitch colors. +For Turbo/Prime members who can set any color, use the button at the bottom of the section. +
To get a user's current color, use [Get User Color]({{ "commands/twitch-info#getusercolor" | relative_url }}) | Box Name | Type | Description | |-------|--------|-------- @@ -16,4 +16,6 @@ Login Name | Dropdown |The name of the channel to use for authentication in the Color|Dropdown|List of the standard colours that Twitch offers for all users. {:class='table table-primary'} -{% include example_public.html src="https://i.imgur.com/Jp03uUR.png" size="100" title="Button to change Twitch username colour to a specified hex code" pastebin="jcbE1Zz5" %} \ No newline at end of file +{% include alert.html text="Requires the user:manage:chat_color Twitch scope." type="info" %} + +{% include example_public.html src="/docs/assets/images/commands-twitch-moderation/twitchSetColor_Ex.png" size="100" title="Button to change Twitch username colour to a specified hex code" pastebin="jcbE1Zz5" %} diff --git a/doc_posts/_commands-twitch-moderation/twitch-start-raid.md b/doc_posts/_commands-twitch-moderation/twitch-start-raid.md index d991ec38..fc042173 100644 --- a/doc_posts/_commands-twitch-moderation/twitch-start-raid.md +++ b/doc_posts/_commands-twitch-moderation/twitch-start-raid.md @@ -6,10 +6,14 @@ redirect_from: - commands/271 --- -Starts a raid, which sends the current viewers to the specified channel after a 90 second countdown +Starts a raid, which sends the current viewers to the specified target channel after a 90 second countdown. + +If **Channel** is empty, SAMMI uses the default Twitch account. | Box Name | Type | Description | |-------|--------|-------- Channel|String|Channel to start the raid in Raid Target|String|Channel to raid -{:class='table table-primary'} \ No newline at end of file +{:class='table table-primary'} + +{% include alert.html text="Requires the channel:manage:raids Twitch scope. The broadcaster can still cancel the raid before the countdown finishes." type="info" %} diff --git a/doc_posts/_commands-twitch-moderation/twitch-timeout-user.md b/doc_posts/_commands-twitch-moderation/twitch-timeout-user.md index 801504c9..1d283403 100644 --- a/doc_posts/_commands-twitch-moderation/twitch-timeout-user.md +++ b/doc_posts/_commands-twitch-moderation/twitch-timeout-user.md @@ -1,13 +1,15 @@ --- title: "Timeout User" -num: 4.1 +num: 4.2 version: 202310 redirect_from: - commands/275 --- Times out a user from participating in the specified broadcaster's chat room for the specified amount of time. -To remove the timeout, use the [Unban User]({{ "commands/twitch-moderation#unban-user" | relative_url }}) command. +To remove the timeout, use [Unban User]({{ "commands/unban-user" | relative_url }}). + +If **Channel** is empty, SAMMI uses the default Twitch account. | Box Name | Type | Description | |-------|--------|-------- @@ -15,4 +17,6 @@ Channel|String|The channel to timeout the specified user in User Name|String|The username of the person to be timed out Duration|Number{% include asterisk.html%}|How long to timeout the user, in seconds. If left blank, defaults to 5 minutes (300 seconds). Reason|String|(optional) The reason why you are timing them out -{:class='table table-primary'} \ No newline at end of file +{:class='table table-primary'} + +{% include alert.html text="Requires the moderator:manage:banned_users and user:read:email Twitch scopes." type="info" %} diff --git a/doc_posts/_commands-twitch-moderation/twitch-unblock-user.md b/doc_posts/_commands-twitch-moderation/twitch-unblock-user.md new file mode 100644 index 00000000..f4aa524b --- /dev/null +++ b/doc_posts/_commands-twitch-moderation/twitch-unblock-user.md @@ -0,0 +1,19 @@ +--- +title: "Unblock User" +num: 11.1 +version: 202610 +redirect_from: + - commands/332 +--- + +Unblocks a Twitch user for the specified account. +For more information, check out the [Twitch API Reference Guide for Unblock User](https://dev.twitch.tv/docs/api/reference/#unblock-user). + +| Box Name | Type | Description | +|-------|--------|-------- +|Channel|Dropdown|Twitch account to unblock the user from. +|User Name|String|The username of the person to unblock. +{:class='table table-primary'} + +{% include alert.html text="Requires the user:manage:blocked_users and user:read:email Twitch scopes." type="info" %} + diff --git a/doc_posts/_commands-twitch-moderation/twitch-warn-user.md b/doc_posts/_commands-twitch-moderation/twitch-warn-user.md new file mode 100644 index 00000000..0898bb41 --- /dev/null +++ b/doc_posts/_commands-twitch-moderation/twitch-warn-user.md @@ -0,0 +1,21 @@ +--- +title: "Warn User" +num: 10 +version: 202430 +redirect_from: + - commands/336 +--- + +Warns a user with a specified message. +Warnings force users to acknowledge the message you warn them with. + +If **Channel** is empty, SAMMI uses the default Twitch account. + +| Box Name | Type | Description | +|-------|--------|-------- +Channel|String|The channel to warn the specified user in +User Name|String|The username of the person to be warned +Reason|String|(optional) The reason why you are warning them +{:class='table table-primary'} + +{% include alert.html text="Requires the moderator:manage:warnings and user:read:email Twitch scopes." type="info" %} diff --git a/doc_posts/_commands-twitch-moderation/unban-user.md b/doc_posts/_commands-twitch-moderation/unban-user.md index aca98242..dca51180 100644 --- a/doc_posts/_commands-twitch-moderation/unban-user.md +++ b/doc_posts/_commands-twitch-moderation/unban-user.md @@ -1,15 +1,19 @@ --- title: "Unban User" -num: 4.2 +num: 4.1 version: 202310 redirect_from: - commands/274 --- -Removes the ban or timeout for the specified user +Removes the ban or timeout for the specified user in the selected Twitch channel. + +If **Channel** is empty, SAMMI uses the default Twitch account. | Box Name | Type | Description | |-------|--------|--------| -Channel|String|The channel to unban/untimeout the specified user in -User Name|String|The username of the person to unban/untimeout -{:class='table table-primary'} \ No newline at end of file +Channel|String|The channel to unban/untimeout the specified user in +User Name|String|The username of the person to unban/untimeout +{:class='table table-primary'} + +{% include alert.html text="Requires the moderator:manage:banned_users and user:read:email Twitch scopes." type="info" %} diff --git a/doc_posts/_commands-twitch-polls/twitch-create-poll.md b/doc_posts/_commands-twitch-polls/twitch-create-poll.md index 1ea64741..08fa7967 100644 --- a/doc_posts/_commands-twitch-polls/twitch-create-poll.md +++ b/doc_posts/_commands-twitch-polls/twitch-create-poll.md @@ -6,17 +6,23 @@ redirect_from: --- Creates a new poll for your channel. Must be at least affiliate. Minimum amount of 2 choices. +For more information on creating polls, check out the [Twitch API Reference Guide for Create Poll](https://dev.twitch.tv/docs/api/reference/#create-poll). | Box Name | Type | Description | |-------|--------|-------- |Login Name | Dropdown |Your Twitch login name (all lowercase characters) |Poll Name|String|Question displayed for the poll. Maximum: 60 characters. -|Choice 1-5|String|Text displayed for the choice. Maximum: 25 characters. +|Choice 1|String|Text displayed for the first choice. Maximum: 25 characters. +|Choice 2|String|Text displayed for the second choice. Maximum: 25 characters. +|Choice 3|String|Optional third choice. Maximum: 25 characters. +|Choice 4|String|Optional fourth choice. Maximum: 25 characters. +|Choice 5|String|Optional fifth choice. Maximum: 25 characters. |Dur.(s)|Number {% include asterisk.html%}|Total duration for the poll in seconds. |Points|Number {% include asterisk.html%}|Number of Channel Points required to vote once with Channel Points. Minimum: 0. Maximum: 1000000. -|Bits|Number {% include asterisk.html%} | Number of Bits required to vote once with Bits. Minimum: 0. Maximum: 10000. {:class='table table-primary'} +{% include alert.html text="Requires the channel:manage:polls Twitch scope." type="info" %} + diff --git a/doc_posts/_commands-twitch-polls/twitch-create-prediction.md b/doc_posts/_commands-twitch-polls/twitch-create-prediction.md index 2b9a9307..6f7e4d6c 100644 --- a/doc_posts/_commands-twitch-polls/twitch-create-prediction.md +++ b/doc_posts/_commands-twitch-polls/twitch-create-prediction.md @@ -15,7 +15,7 @@ Creates a new prediction for your channel with 2-10 outcomes. Must be at least a |Dur.(s)|Number {% include asterisk.html%}|Total duration for the prediction in seconds. {:class='table table-primary'} -{% include media_modal.html img="prediction_array.png" w="100" btn="1" alt="Usage Example" %} +{% include example_public.html src="https://i.imgur.com/NVuUigP.png" size="50" title="Usage Example" %} diff --git a/doc_posts/_commands-variable/delete-variable.md b/doc_posts/_commands-variables/delete-variable.md similarity index 100% rename from doc_posts/_commands-variable/delete-variable.md rename to doc_posts/_commands-variables/delete-variable.md diff --git a/doc_posts/_commands-variable/get-button-variable.md b/doc_posts/_commands-variables/get-button-variable.md similarity index 100% rename from doc_posts/_commands-variable/get-button-variable.md rename to doc_posts/_commands-variables/get-button-variable.md diff --git a/doc_posts/_commands-variable/get-global-variable.md b/doc_posts/_commands-variables/get-global-variable.md similarity index 100% rename from doc_posts/_commands-variable/get-global-variable.md rename to doc_posts/_commands-variables/get-global-variable.md diff --git a/doc_posts/_commands-variable/set-boolean-variable.md b/doc_posts/_commands-variables/set-boolean-variable.md similarity index 100% rename from doc_posts/_commands-variable/set-boolean-variable.md rename to doc_posts/_commands-variables/set-boolean-variable.md diff --git a/doc_posts/_commands-variables/set-button-instance-variable.md b/doc_posts/_commands-variables/set-button-instance-variable.md new file mode 100644 index 00000000..ad9c136f --- /dev/null +++ b/doc_posts/_commands-variables/set-button-instance-variable.md @@ -0,0 +1,29 @@ +--- +layout: default +title: "Set Button Instance Variable" +num: 3.1 +redirect_from: + - commands/300 +--- + +Functions similarly to the "Set Button Variable" command, but with the added capability of setting a variable within a non-persistent button.\ +Supports setting button variables directly to objects/arrays without having to parse and stringify them. This includes setting array values to other objects, too.\ +To use this command, you must provide the instance ID, which is automatically included in an Extension Command as part of the payload (`Data.instanceId`).\ +Button instances are ephemeral and are destroyed once the button's execution is complete. To successfully set a variable within a non-persistent button, the button must still be active at the time the command is executed. If the button has already completed its execution, the instance will be destroyed, and setting the variable will no longer be possible. + +{% include alert.html text="Available in Developer Mode." type="info" %} + +| Box Name | Type | Description | +|-------|--------|-------- +|Button ID | String | The button you want to set the variable for. +|Button Instance ID | String | The button instance ID to set the variable in +| Variable Name | String | Name of the variable. | +| Operator | Dropdown | Operator you wish to use on the value.| +| Variable/Number/String | {% include asterisk.html%} | Whatever you want to set the variable value to. Can contain complex math. +{:class='table table-primary'} + + + + + + diff --git a/doc_posts/_commands-variable/set-button-variable.md b/doc_posts/_commands-variables/set-button-variable.md similarity index 56% rename from doc_posts/_commands-variable/set-button-variable.md rename to doc_posts/_commands-variables/set-button-variable.md index 7ce17f11..0260c68f 100644 --- a/doc_posts/_commands-variable/set-button-variable.md +++ b/doc_posts/_commands-variables/set-button-variable.md @@ -7,7 +7,9 @@ redirect_from: --- Creates a new button variable or modifies an existing one.\ -Button variables are other buttons local variables. You cannot set a button variable for a button that has persistent variables disabled, this will crash SAMMI. +Button variables are other buttons local variables.\ +Supports setting button variables directly to objects/arrays without having to parse and stringify them. This includes setting array values to other objects, too. +If you need to set a button variable in a non persistent button, please use the [Set Button Instance Variable](#setbuttoninstancevariable) command instead. {% include alert.html text="Variable names can contain numbers, letters and _, but cannot start with a number itself." type="warning" %} @@ -16,7 +18,7 @@ Button variables are other buttons local variables. You cannot set a button vari |Button ID | String | The button you want to set the variable for. | Variable Name | String | Name of the variable. | | Operator | Dropdown | Operator you wish to use on the value.| -| Variable/Number/String | {% include asterisk.html%} | Whatever you want to set the variable value to. Can contain complex math. +| Variable/Number/String | {% include asterisk.html%} | Whatever you want to set the variable value to, including arrays and objects (2023.2.2 and up). Can contain complex math. {:class='table table-primary'} diff --git a/doc_posts/_commands-variables/set-filepath-variable.md b/doc_posts/_commands-variables/set-filepath-variable.md new file mode 100644 index 00000000..5a6571c5 --- /dev/null +++ b/doc_posts/_commands-variables/set-filepath-variable.md @@ -0,0 +1,15 @@ +--- +title: "Set Filepath Variable" +num: 9 +version: 202420 +redirect_from: + - commands/335 +--- + +Sets a string variable with a file path.\ + +| Box Name | Type | Description | +|-------|--------|--------| +| Variable Name | String | Name of the variable you want to save. | +| File Path | String | The path of the file you want to select. Has a button to open windows file explorer to easily get the file path. +{:class='table table-primary' } \ No newline at end of file diff --git a/doc_posts/_commands-variables/set-hidden-variable.md b/doc_posts/_commands-variables/set-hidden-variable.md new file mode 100644 index 00000000..48d4a8ba --- /dev/null +++ b/doc_posts/_commands-variables/set-hidden-variable.md @@ -0,0 +1,18 @@ +--- +title: "Set Hidden Variable" +num: 10 +version: 202410 +redirect_from: + - commands/334 +--- + +Creates a string variable with obfuscated text.\ +You can use dot notation for saving button variables (`buttonID.myVariable`), global variables (`global.myVariable`), object keys (`myObject.key`). + +{% include alert.html text="This only hides the text in the SAMMI interface, it DOES NOT hide the contents in the variable viewer." type="warning" %} + +| Box Name | Type | Description | +|-------|--------|--------| +| Variable Name | String | Name of the variable you want to save. | +| String (text) | String | The obfuscated text you want to set. +{:class='table table-primary' } \ No newline at end of file diff --git a/doc_posts/_commands-variable/set-local-variable.md b/doc_posts/_commands-variables/set-local-variable.md similarity index 90% rename from doc_posts/_commands-variable/set-local-variable.md rename to doc_posts/_commands-variables/set-local-variable.md index e7c4964f..84745a59 100644 --- a/doc_posts/_commands-variable/set-local-variable.md +++ b/doc_posts/_commands-variables/set-local-variable.md @@ -7,6 +7,7 @@ redirect_from: --- Creates a new local variable or modifies an existing one.\ +Supports setting button variables directly to objects/arrays without having to parse and stringify them. This includes setting array values to other objects, too.\ Local variables are contained in the button that created them. They can be accessed from other buttons by using Set/Get Button Variable (as long as the button has persistent variables enabled). {% include alert.html text="Variable names can contain numbers, letters and _, but cannot start with a number itself." type="warning" %} diff --git a/doc_posts/_commands-variable/set-string-variable.md b/doc_posts/_commands-variables/set-string-variable.md similarity index 100% rename from doc_posts/_commands-variable/set-string-variable.md rename to doc_posts/_commands-variables/set-string-variable.md diff --git a/doc_posts/_commands-variable/variable-get-type.md b/doc_posts/_commands-variables/variable-get-type.md similarity index 100% rename from doc_posts/_commands-variable/variable-get-type.md rename to doc_posts/_commands-variables/variable-get-type.md diff --git a/doc_posts/_commands-variable/variable-introduction.md b/doc_posts/_commands-variables/variable-introduction.md similarity index 90% rename from doc_posts/_commands-variable/variable-introduction.md rename to doc_posts/_commands-variables/variable-introduction.md index 09d2655c..9b89a9c7 100644 --- a/doc_posts/_commands-variable/variable-introduction.md +++ b/doc_posts/_commands-variables/variable-introduction.md @@ -8,10 +8,6 @@ Variable names are case sensitive, meaning that "Variable" and "variable" are no {% include alert.html text="You can view all existing variables by pressing Variable Viewer at the bottom menu of SAMMI or using CTRL + Tab on your keyboard" type="info" %} -#### Watch a detailed video explaining how to use variables in SAMMI - - - #### Global Variables All global variables are stored inside `global` variables object and are accessible from any button at all times. Some of these variables are permanent.\ Use **Get Global Variable** command to get a global variable.\ @@ -30,10 +26,10 @@ If you check the box, it means the variables will be accessible even after the b If you uncheck the box, the variables will be accessible only when the button is running and only inside their own button. Other buttons cannot access them even if the button is currently running. If `Allow Button Overlap` is enabled, unique variables will be created for each button execution and will never be shared. -#### Init Variables -If you right click on a button, you can edit its initial variables.\ -These exist to prevent crashes if you have enabled persistent variables.\ -The window uses a simple JSON format to initialize your variables.\ +#### Default Variables +If you right click on a button, you can edit its default variables.\ +These exist to help prevent crashes if you have enabled persistent variables.\ +The window uses a simple JSON format to set your default variables.\ For example, if you want your variable `name` to have a value of `SAMMI` and your variable `age` to have a value of 18 on initilization, you can do: ``` { @@ -53,7 +49,6 @@ You can also initiliaze complex variables, such as arrays or objects: "Melonax": "purple", "Cyanidesugar": "red " } - } ``` @@ -63,10 +58,10 @@ You can also initiliaze complex variables, such as arrays or objects: | Variable Type | Example | Color in variable window | |-------|--------|--------| |Real value (number) | `50` | green| -|String (text) | `"My Cat"` or `'My Cat'` | blue| +|String (text) | `"My Cat"` or `'My Cat'` | beige| |Boolean | 1 = true, 0 = false | cyan| |Array | `["cat","rabbit","dog"]` | yellow| -|Object | `{"name": John, "age": 25, "country": Canada"}` | purple| +|Object | `{"name": "John", "age": 25, "country": "Canada"}` | purple| |Undefined | Variable does not exist/is set to empty value| red | |Null | Variable with empty or non existent reference | red| {:class='table table-secondary w-auto table-responsive table-hover'} diff --git a/doc_posts/_commands-variable/variable-transition.md b/doc_posts/_commands-variables/variable-transition.md similarity index 87% rename from doc_posts/_commands-variable/variable-transition.md rename to doc_posts/_commands-variables/variable-transition.md index a9363391..6f0f6209 100644 --- a/doc_posts/_commands-variable/variable-transition.md +++ b/doc_posts/_commands-variables/variable-transition.md @@ -21,4 +21,4 @@ For example, if you set the start value to 10, final value to 0 and duration to |Smooth|Dropdown|None = Normal, Out = Starts out fast and ends slow, In = Starts out slow and ends fast, In/Out= Starts out slow, gets faster and then slows down at the end again. {:class='table table-primary' } -{% include example_public.html src="https://i.imgur.com/U4goxFg.png" size="100" title="Simple countdown for GDI+ Text Source in OBS" pastebin="Msgnudug" %} \ No newline at end of file +{% include example_public.html src="/docs/assets/images/commands-variables/varTrans_Ex.png" size="100" title="Simple countdown for GDI+ Text Source in OBS" pastebin="Msgnudug" %} \ No newline at end of file diff --git a/doc_posts/_commands-wait/wait-for-dialog.md b/doc_posts/_commands-wait/wait-for-dialog.md new file mode 100644 index 00000000..c2fa8058 --- /dev/null +++ b/doc_posts/_commands-wait/wait-for-dialog.md @@ -0,0 +1,19 @@ +--- +title: "Wait for Dialog" +num: 14 +version: 202610 +redirect_from: + - commands/354 +--- + +Pauses a button execution and shows a dialog with custom options. Once the user selects one of the options, SAMMI saves the selected value and resumes the button execution. + +{% include alert.html text="Be mindful using this command. If the popup stays on for a long time before the user dismisses it, they might get disconnected from any active websockets (such as Bridge, Twitch or OBS)." type="warning" %} + +| Box Name | Type | Description | +|-------|--------|-------- +|Message|String|Popup message to show the user. +|Options|String|Options to show in the dialog. Put each option on a new line. +|Save Variable As|String|Variable name to save the selected option. +{:class='table table-primary'} + diff --git a/doc_posts/_commands-wait/wait-for-timeout.md b/doc_posts/_commands-wait/wait-for-timeout.md index 6c83e535..242d4f40 100644 --- a/doc_posts/_commands-wait/wait-for-timeout.md +++ b/doc_posts/_commands-wait/wait-for-timeout.md @@ -13,7 +13,7 @@ This way you can delay your commands by using variables (since it's not otherwis |Timeout After (ms)|Number {% include asterisk.html%}|How long to wait in milliseconds until resuming normal command flow (`0` will wait indefinitely) {:class='table table-primary' } -{% include example_public.html src="https://i.imgur.com/PEw7cQF.gif" size="100" title="Using a variable to delay commands" pastebin="VJwMqUXJ" %} +{% include example_public.html src="/docs/assets/images/commands-wait/waitTimeout_Ex.gif" size="100" title="Using a variable to delay commands" pastebin="VJwMqUXJ" %} diff --git a/doc_posts/_commands-wait/wait-until-is.md b/doc_posts/_commands-wait/wait-until-is.md index ea573bb1..d4129e47 100644 --- a/doc_posts/_commands-wait/wait-until-is.md +++ b/doc_posts/_commands-wait/wait-until-is.md @@ -16,7 +16,7 @@ Similar to async/await in JavaScript. Very useful command to use together with [ |Timeout After (ms)|Number {% include asterisk.html%}|How long to wait in milliseconds until resuming normal command flow (`0` will wait indefinitely) {:class='table table-primary' } -{% include example_public.html src="https://i.imgur.com/pS8Ahwf.gif" size="100" title="Modify button when a variable is 0" pastebin="M9xtJJha" %} +{% include example_public.html src="/docs/assets/images/commands-wait/waitIs_Ex.gif" size="100" title="Modify button when a variable is 0" pastebin="M9xtJJha" %} diff --git a/doc_posts/_components/bridge.md b/doc_posts/_components/bridge.md index 6f9f1f20..548d467d 100644 --- a/doc_posts/_components/bridge.md +++ b/doc_posts/_components/bridge.md @@ -7,19 +7,7 @@ type: fullpage permalink: /bridge --- SAMMI Bridge is the bridge.html file in your SAMMI/bridge folder. -Bridge connects to your SAMMI to receive and send messages from extensions. You can also test your Twitch and YouTube triggers from Bridge. - -{% include alert.html text="Transmitter no longer works with SAMMI. Please update to the Bridge file." type="warning" %} - -{% include image.html w="75" src="bridge.png" alt="Bridge with Twitch Test Triggers" %} - -#### How to update Bridge -You can update your Bridge to the latest version by going to **SAMMI Core-Settings-Check for Updates** (or by right clicking on SAMMI tray icon and selecting **Check for Updates**).\ -In the Update menu, you can see whether you're on the latest Bridge version and update it if you wish. All your extensions will be automatically transferred over if you update your Bridge this way. - -{% include image.html w="75" src="updater.png" alt="Updater showing Bridge" %} - -If you want to get another clean copy of a Bridge (for example if you want to experiment with creating extensions), you can find the latest version at our [itch.io page](https://sammisolutions.itch.io/sammi) or [SAMMI Brige Github repository](https://github.com/SAMMISolutions/SAMMI-Bridge/releases). +Bridge connects to your SAMMI to receive and send messages from extensions. You can also test your Twitch and YouTube triggers from Bridge. #### How to run Bridge - As a dock in OBS, this is the simplest and most effective way. @@ -39,12 +27,12 @@ This might be needed for some extensions or debugging purposes. {% include alert.html text="You can have only one Bridge open at the same time. If you see an error 'Second Bridge tried to connect', locate the other Bridge and close it." type="danger" %} #### Connection Settings -In your Bridge-status tab, you can modify your connection settings.\ +In your Bridge-Settings tab, you can modify your connection settings.\ Default IP address for SAMMI is `127.0.0.1` and default port is `9425`. Make sure this matches what's in SAMMI Core-Settings.\ You must fill out the password if you decided to use one in SAMMI Core-Settings menu.\ You only need to set this up once, as your Bridge will remember the previous settings and will attempt to auto connect next time. -{% include image.html w="75" src="bridge-settings.png" alt="Bridge Connection Settings" %} +{% include image.html w="75" src="bridge_settings.png" alt="Bridge Connection Settings" %} #### Connection Status You can see whether you're connected to SAMMI within your Bridge. Green text 'Connected' or a green dot means the connection is live. @@ -54,18 +42,33 @@ You can see whether you're connected to SAMMI within your Bridge. Green text 'Co #### Bridge Tabs Bridge has a few default tabs. A new tab is created every time you install a new extension. -- **Status** +- **Settings** - Bridge Connection - change connection settings to your SAMMI - Appearance - disable or enable tab appearance - Message Logging - intended for debugging purposes. Logs all received and sent messages to SAMMI. Will remember the state even after you close and reopen Bridge. Don't forget to turn it off once you're done debugging. -- **Twitch Triggers** - test all your Twitch button triggers by pressing the test buttons. They simulate how Twitch sends all its events. -- **YouTube Triggers** - test all your YouTube button triggers by pressing the test buttons. They simulate how YouTube sends all its events. +- **Extensions** + - Allows you to view all your currently installed extensions and whether you're on the latest version + {% include image.html w="75" src="bridge_extensions.png" alt="Extensions" %} +- **Twitch Triggers** + - Test all your Twitch button triggers by pressing the test buttons. They simulate how Twitch sends all its events. + {% include image.html w="75" src="bridge_twitch.png" alt="Twitch Test Triggers" %} +- **YouTube Triggers** + - Test all your YouTube button triggers by pressing the test buttons. They simulate how YouTube sends all its events. + {% include image.html w="75" src="bridge_youtube.png" alt="YouTube Test Triggers" %} + -#### How to select Bridge for extensions -Go to your SAMMI-Bridge-Select a Bridge if you wish to use a different Bridge file to install your extensions in. Otherwise SAMMI automatically installs them in your currently selected bridge. +#### How to select Bridge for installing extensions +Navigate to your SAMMI-Bridge-Select a Bridge if you wish to use a different Bridge file to install your extensions in. Otherwise SAMMI automatically installs them in your **currently selected bridge**. {% include image.html w="75" src="bridge menu.png" alt="Bridge Menu" %} #### Extensions -Extensions live in your Bridge. Learn more about them in our [Extensions](https://sammi.solutions/extensions) section. +SAMMI extensions live in your Bridge. Learn more about them in our [Extensions](https://sammi.solutions/extensions) section. + +#### How to update Bridge +You can update your Bridge to the latest version by going to **SAMMI Core-Open Updater** or by manually opening SAMMI/SAMMI Updater/SAMMI Updater.exe file. +Once SAMMI Updater opens, you will get the option to update to the latest Bridge version. All your extensions will be automatically transferred over. + +{% include image.html w="75" src="updater.png" alt="Updater showing Bridge" %} +If you want to get another clean copy of Bridge (for example, if you want to experiment with developing extensions), you can find the latest version at [SAMMI Brige Github repository](https://github.com/SAMMISolutions/SAMMI-Bridge/releases). We recommend using `bridge_unminified.html` file for developing extensions and `bridge_html` file for testing them in production. diff --git a/doc_posts/_components/core.md b/doc_posts/_components/core.md index 3865586b..a4a508b5 100644 --- a/doc_posts/_components/core.md +++ b/doc_posts/_components/core.md @@ -8,9 +8,37 @@ permalink: /core --- SAMMI Core is the main SAMMI component. You can change all the settings, add and modify your decks, program new buttons, add and edit triggers and much more. -{% include alert.html text="SAMMI Core was previously known as the LioranBoard Receiver" type="primary" %} -{% include image.html w="auto" src="SAMMI.png" alt="SAMMI Core" %} +**Click on the image below and hover over an area of interest:** +{% include image.html w="auto" src="core.png" alt="SAMMI Core" map="core-map" %} + + + A single enabled deck + A single disabled deck + Enters Edit Deck screen. + Adds or deletes the selected deck + Changes the deck order + Copies a deck to your clipboard, can be shared with others. + Pastes deck data from your clipboard as a new deck. + Duplicates an existing deck, creating a unique copy. + Opens SAMMI Panel dropdown which acts as your virtual Stream Deck. + Opens SAMMI Voice, which allows you to control SAMMI with voice commands. + Opens SAMMI Bridge menu, to open Bridge or install/uninstall an extension. + Opens menu with all official SAMMI integrations. + Opens About page with information about developers and license. + Connection indicators for all major SAMMI components. + Opens official SAMMI Discord invite link. + Opens official SAMMI Patreon. + Adds a new deck. + Current FPS indicator. FPS plays a role in executing some SAMMI commands. + Opens SAMMI Settings menu.  + Set up OBS connections to SAMMI here. + Setup and link your Twitch accounts here. + Setup and link your YouTube account here. + See all button and global variable here. + See and clear all currently running buttons here. + Current SAMMI version. + ### Deck Menu - **Edit Deck** - allows you to edit currently selected deck, same as double clicking on the deck @@ -21,11 +49,14 @@ SAMMI Core is the main SAMMI component. You can change all the settings, add and - **Paste Deck** - imports the entire deck from your clipboard, must be in JSON format - **Duplicate Deck** - creates a copy of the entire deck inside SAMMI -### SAMMI Deck Menu -{% include image.html w="75" src="deck_menu.png" alt="SAMMI Deck Icon" %} -- **Open SAMMI Deck** - Press to open your [SAMMI Deck]({{ "streamdeck" | relative_url }}), that allows you to press buttons in your decks. -- **Get LAN IP** (for other devices) - puts your Local Area Network IP address into your clipboard, for you to use the Deck on another device. -- **Android Version** - links to the [Google Play Store](https://play.google.com/store/apps/details?id=lioranboard.ca.lioranboard.streamdeck) to download the Android version of the Deck +### SAMMI Panel Menu +{% include image.html w="75" src="PanelMenu.PNG" alt="SAMMI Panel" %} +- **Open Panel** - Opens your SAMMI Panel. +- **Open Panel (Web)** - Opens up your browser to access the browser version of SAMMI Panel. +- **Get LAN IP** - saves your Local Area Network IP to your clipboard, ready for you to paste into a text editor to retrieve your IP address. + +### SAMMI Voice +Opens the SAMMI Voice component. ### Bridge Menu {% include image.html w="auto" src="bridge menu.png" alt="Bridge Menu" %} @@ -39,10 +70,9 @@ SAMMI Core is the main SAMMI component. You can change all the settings, add and - **Install all Extensions from folder** - installs all extensions in a selected folder to the Bridge at once, simply select the first file in the folder - **Reinstall all Extensions** - reinstalls all currently installed extensions in your default Bridge -### Backup -{% include image.html w="auto" src="backup.png" alt="Backup options" %} -- **Save SAMMI Backup** - saves a backup of your SAMMI configuration -- **Load SAMMI Backup** - loads a previously created backup +### Integrations Menu +{% include image.html w="auto" src="integrations.png" alt="Integrations Menu" %} +All official SAMMI extensions and integrations. Click on one to download and [install it in your SAMMI](https://sammi.solutions/extensions/install). ### About {% include image.html w="auto" src="about.png" alt="About" %} @@ -62,20 +92,46 @@ Allows you to adjust general SAMMI settings. {% include image.html w="50" src="settings.png" alt="Settings" %} -- **Deck and Bridge settings** - modify connection settings for Bridge -- **Minimize to Tray** - when checked, SAMMI Core will minimize to tray instead of closing when you press X -- **Remember window size and position** - when checked, SAMMI will automatically remember its window position and size between restarts (please note SAMMI has no control over your monitors and will always open on your default monitor) -- **Auto restart SAMMI after crash** - when checked, SAMMI will re-open itself after a crash -- **Automatically check for new updates** - when checked, SAMMI will let you know if there are updates available when you open SAMMI, with the option to not remind you for a few days -- **Automatically send non crash error logs** - when checked, SAMMI will automatically submit any errors that occur while it is running that would normally lead to SAMMI crashing. Instead you get a yellow alert and can continue using SAMMI as normal. This is an experimental feature being currently used in some of SAMMI scripts. -- **Automatically close variable wrapping** - when checked, SAMMI will automatically write the `$/` when you type `/$` with nothing to the right of the cursor -- **Enable enhanced protection mode** - when checked, SAMMI will not be allowed to modify or delete files outside of the main SAMMI directory, nor any critical files inside its own directory. -- **Open Local API Server** - whether you wish to open SAMMI's [Local API server]({{ "api/overview" | relative_url }}) -- **FPS** - SAMMI Core is technically a game and runs at specific FPS, which, for example, affects Motion Commands for OBS. Should be the same as your stream FPS. -- **Language** - dropdown to change the language of SAMMI -- **Interface Size** - change scaling if you're using a non standard resolution -- **Reset SAMMI** - clears all running buttons and variables and reloads all decks -- **Check for Updates** - checks for new updates, allows you to update SAMMI and view patch notes +#### General Settings +- **Minimize to Tray**: When enabled, SAMMI Core will be minimized to the system tray rather than closing when the "X" button is clicked. +- **Remember window size and position**: When enabled, SAMMI will remember its window size and position between sessions (note that SAMMI cannot control monitor selection and will always open on the default monitor). +- **Auto restart SAMMI after crash**: When enabled, SAMMI will automatically relaunch itself in the event of a crash. +- **Automatically check for new updates**: When enabled, SAMMI will notify you of available updates upon launch, with an option to postpone reminders for a few days. +- **Automatically send non-crash error logs**: When enabled, SAMMI will automatically report errors that would typically cause a crash. Instead, you will receive a yellow alert and can continue using SAMMI normally. This experimental feature is currently used in some SAMMI scripts. +- **Automatically close variable wrapping**: When enabled, SAMMI will automatically insert `$/` when you type `/$` with no text to the right of the cursor. +- **Enable enhanced protection mode**: When enabled, SAMMI will be restricted from modifying or deleting files outside the main SAMMI directory and critical files within its own directory. + +#### SAMMI Bridge and Deck Settings +- **Port** (read-only): The current port used by SAMMI to connect to Bridge/SAMMI Deck. Modifying port numbers is strongly discouraged, but it can be done by editing the `bridge_port` key in the `settings.ini` file. +- **Password**: The current password for connections from Bridge/SAMMI Deck. If you change the password here, update it in Bridge/SAMMI Deck as well. + +#### SAMMI Panel Settings +- **Port** (read-only): The current port used by SAMMI to connect to SAMMI Panel. Modifying port numbers is strongly discouraged, but it can be done by editing the `panel_port` key in the `settings.ini` file. +- **Password**: The current password for connections from SAMMI Panel. If you change the password here, update it in SAMMI Panel as well. + +#### SAMMI Local API Settings +- **Open Local API Server**: Choose whether to open SAMMI's [Local API server]({{ "api/overview" | relative_url }}). +- **Port** (read-only): The current port used by SAMMI for Local API, Webhooks, and SAMMI Voice. Modifying port numbers is strongly discouraged, but it can be done by editing the `api_server_port` key in the `settings.ini` file. +- **Password**: The current password for API calls, Webhooks, or SAMMI Voice connections to SAMMI. If you change the password here, update it in any custom creations using Local API and SAMMI Voice as well. + +#### Language Settings +- **Language**: Dropdown menu to select SAMMI's language. +- **Download Languages**: Download updated language files (automatically done when updating SAMMI). + +#### UI Settings +- **FPS**: SAMMI Core functions like a game and runs at a specific FPS, affecting features like OBS Motion Commands. Set this to match your stream FPS. +- **Interface Size**: Adjust the scaling for non-standard resolutions. + +#### Other Settings +- **Reset SAMMI**: Clears all active buttons and variables and reloads all decks. +- **Check for Updates**: Checks for updates, allows you to update SAMMI, and view patch notes. + +#### Resetting SAMMI and Developer Mode +Clicking the "Reset SAMMI" button will reset all active buttons and their variables. Clicking it 10 times will enable developer mode in SAMMI. + +#### Updates +Clicking "Check for Updates" allows you to check for available updates for SAMMI components. Clicking "View Patch Notes" allows you to view the patch notes for the latest version. + ### OBS Connections Allows you to set up your OBS connection. Multiple connections and multiple OBSWS protocols are supported.\ @@ -83,7 +139,6 @@ Learn more about setting up an OBS connection in our [Integrations-OBS]({{ "inte {% include image.html w="50" src="obs_connection.png" alt="OBS Connections" %} - ### Twitch Connections Allows you to connect SAMMI Core to your Twitch account (or multiple accounts) to listen for new events, send chat messages, and use other Twitch commands.\ Find out more about Twitch connection in our [Integrations-Twitch]({{ "integrations/twitch" | relative_url }}) section. @@ -99,14 +154,17 @@ Find out more about Twitch connection in our [Integrations-Youtube]({{ "integrat ### Variable Viewer The variable viewer can be accessed from the Main Menu, Deck Editor, or the Commands Editor. You can also press `Ctrl+Tab` key as a shortcut. -In this menu you can see all global variables (marked red) and all button IDs with persistent variables enabled. -{% include image.html w="75" src="var_viewer.gif" alt="Variable window showing button ID variables" %} - -If you click on the eye icon, you can see all current variables for the selected button ID. +In this menu you can view all global variables (marked red) and all button IDs with persistent variables enabled. -The variable viewer can be sorted alphabetically, or by type. +{% include video.html w="75" src="var-window.mp4" alt="Variable window showing button and global variables" %} -Use search function to search for a specific button ID. +- Use search function to search for a specific button ID or variable +- Click on the arrow icon next to the button ID to view all current variables for the selected button ID +- Click on 'Sort by Type/Aphabetically' to sort the variable list +- Click on dollar sign icon to copy the variable value +- Click on path icon to copy the variable path +- Click on the trash bin icon to delete the variable +- Click on the home button to return to the main variable screen Learn more about variables in our [Commands-Variables](commands/variables#introduction) section. @@ -114,7 +172,7 @@ Learn more about variables in our [Commands-Variables](commands/variables#introd All currently running buttons will be displayed in this window.\ You can choose to interrupt (clear) all, ongoing or queued buttons. -{% include image.html w="75" src="active_buttons.gif" alt="Interrupting an active button" %} +{% include video.html w="75" src="ongoing-buttons.mp4" alt="Interrupting an active button" %} ### Deck @@ -161,7 +219,7 @@ There are several keyboard shortcuts you can use: #### Edit Appearance You can right click on a button or press `SHIFT + double click` to edit its appearance. -Edit your button text, color, image and border size.\ +Edit your button text, color, image, transparency and border size.\ All button images will be automatically resized and copied to `SAMMI/image` folder.\ {% include image.html w="50" src="appearance.png" alt="Button Appearance" %} @@ -190,7 +248,6 @@ You can right on a button or press `CTRL + double click` to edit settings. - **Local Variable Persist** - checked - button variables will be accessible even after the button has finished. If Allow Button Overlap is enabled, all button executions will share the same variables. - unchecked - button variables will be accessible only when the button is running and only inside their own button. Other buttons cannot access them even if the button is currently running. If Allow Button Overlap is enabled, unique variables will be created for each button execution and will never be shared. -- **Switch Deck** - whether you want the button to also switch your deck when activated - **Press type** - Normal Press - single button press - Drag Press - the button will trigger if dragged over. You can add either a single or multiple drag press (activates if it's dragged over again). Useful for creating your own volume buttons! diff --git a/doc_posts/_components/deck-app.md b/doc_posts/_components/deck-app.md new file mode 100644 index 00000000..d61d0431 --- /dev/null +++ b/doc_posts/_components/deck-app.md @@ -0,0 +1,62 @@ +--- +layout: default +title: Deck App +menu: Components +num: 4 +type: fullpage +permalink: /deck-app +version: 202320 +--- + +A Deck App is a type of application designed to interact with decks and buttons created in SAMMI Core. It's a great way to control SAMMI from a different device, such as a tablet or a phone. + +{% include image.html w="75" src="deckapp.png" alt="Spotify Deck in Deck Hopper" %} + +### SAMMI Panel and SAMMI Deck +Due to unexpected events, the development of SAMMI Panel has stopped, and it's **no longer being updated or developed**. + +The existing version of SAMMI Panel is still accessible as a web browser application at [http://sammipanel.solutions](http://sammipanel.solutions), but its functionality and stability are not guaranteed. + +SAMMI Deck is now outdated and incompatible with the latest SAMMI Core versions. + +### Deck Hopper +We highly recommend using [Deck Hopper](https://christinak.ca/deckhopper/), a solution officially endorsed by the SAMMI team. + +{% include alert.html text="Deck Hopper, created and maintained solely by Christina Kral, a SAMMI founder, is a personal project and not officially part of SAMMI Solutions." type="info" %} + +Deck Hopper is available for [Desktop](https://christinak.itch.io/deck-hopper) (Windows, macOS, Linux), [Android](https://play.google.com/store/apps/details?id=ca.christinak.DeckHopper) and [iOS](https://apps.apple.com/us/app/deck-hopper/id6746429701). + +It comes with a [free trial](https://christinak.ca/deckhopper/download), and a [PRO version](https://christinak.ca/deckhopper/upgrade) that removes ads and includes all advanced features. (not applicable to the iOS version, which is Pro by default) + +### Setup + +#### Deck Hopper +Deck Hopper setup file is included in all SAMMI 2024.1.0 or newer downloads by default. + +Go to SAMMI Core - Deck App and select **Open Deck Hopper**. If Deck Hopper isn't installed, you'll be prompted to install it. After installation, you can launch it from the same menu. + +Follow the setup instructions on the [Deck Hopper Setup Page](https://christinak.ca/deckhopper/setup#initialSetup) to connect it with your SAMMI Core. + +{% include image.html w="75" src="deckhopper.png" alt="Deck Hopper" %} + +#### SAMMI Panel + +{% include alert.html text="SAMMI Panel is no longer being updated or developed. Its functionality and stability are not guaranteed." type="warning" %} + +Visit the SAMMI Panel website at [http://sammipanel.solutions](http://sammipanel.solutions). + +Upon first use, you'll see an agreement page. After agreeing to the SAMMI Panel EULA, the Panel will start. You'll then see the connection settings for the Panel. + +The default IP address for using the Panel on the same PC as SAMMI Core is `127.0.0.1` with the port `9470`. + +For accessing SAMMI Panel from a different device, use the IP address of the PC running SAMMI Core. This can be found in SAMMI Core - Deck APP - Get LAN IP. Enter this IP address in the Panel's IP address field. + +{% include image.html w="75" src="panel2.png" alt="SAMMI Panel Connection Settings" %} + +Choose a deck from the dropdown and click 'Connect'. Now, you can interact with it by pressing its buttons! + +{% include alert.html text="To switch decks quickly in SAMMI Panel, press the Backspace key on your keyboard to load a different deck." type="info" %} + +### Other Alternatives + +[Deck Mate Control](https://play.google.com/store/apps/details?id=com.flipstream.android.deckmatecontrol&pli=1), developed by SAMMI Community member Flipstream, is an Android-exclusive alternative to SAMMI Panel. diff --git a/doc_posts/_components/deck.md b/doc_posts/_components/deck.md deleted file mode 100644 index c80d6ca9..00000000 --- a/doc_posts/_components/deck.md +++ /dev/null @@ -1,38 +0,0 @@ ---- -layout: default -title: SAMMI Deck -menu: Components -num: 3 -type: fullpage -permalink: /deck ---- -SAMMI Deck is where you load your decks containing buttons that you previously created in SAMMI Core. With how much customization SAMMI offers, you can create extremely complex great looking decks! - -{% include image.html w="75" src="streamdeck.png" alt="SAMMI Deck showing an example deck with buttons" %} - -### PC Version -Desktop version of SAMMI Deck can be found at `SAMMI/SAMMI Deck` folder. You can also open it by pressing SAMMI Deck button in the main menu in SAMMI.\ -If you do not have SAMMI Deck, navigate to SAMMI Core - Settings - Check for Updates and press Download. You can manually download it from our Itch page as well: [https://sammisolutions.itch.io/sammi](https://sammisolutions.itch.io/sammi).\ -Once launched, you will see connection settings. Default IP address for SAMMI is always `127.0.0.1` and port is always `9425`. Unless you changed port in your SAMMI-settings, you can leave it at its default value.\ -**You must fill out the password if you decided to use one in SAMMI-Settings menu.**\ -Note that you only need to do this once, as your SAMMI Deck will remember the previous settings. - -{% include image.html w="75" src="streamdeck-pw.png" alt="SAMMI Deck Connection Settings" %} - -Once you select a deck to connect to, you can interact with it by pressing its buttons. - -{% include alert.html text="To quickly change decks in your SAMMI Deck, press Backspace button on your keyboard to load a different deck!" type="info" %} - -**Auto Reconnect** - -Check this if you wish your SAMMI Deck to auto reconnect after SAMMI has been closed and the connection has been lost. - -**Auto Connect** - -Check this if you wish to auto connect each time you open SAMMI Deck. - -### Android Version -You can download SAMMI Deck for Android from [Google Play Store](https://play.google.com/store/apps/details?id=lioranboard.ca.lioranboard.streamdeck). - - - diff --git a/doc_posts/_components/panel.md b/doc_posts/_components/panel.md deleted file mode 100644 index bc0ed7c1..00000000 --- a/doc_posts/_components/panel.md +++ /dev/null @@ -1,10 +0,0 @@ ---- -layout: default -title: SAMMI Panel -menu: Components -num: 4 -type: fullpage -permalink: /panel -version: 202320 ---- -SAMMI Panel is great. That's all. diff --git a/doc_posts/_components/voice.md b/doc_posts/_components/voice.md index df1d58ea..939125a7 100644 --- a/doc_posts/_components/voice.md +++ b/doc_posts/_components/voice.md @@ -7,4 +7,59 @@ type: fullpage permalink: /voice version: 202320 --- -SAMMI Voice is great. That's all. +## Introduction +SAMMI Voice is a component of SAMMI that allows you to trigger your SAMMI buttons using customised spoken words or phrases. SAMMI Voice uses Microsoft Speech Recognition software that is built into Windows 10 and up. + +## Setup +### Microsoft Speech Recognition +As SAMMI Voice uses Microsoft Speech Recognition, first you will have to ensure that the Speech Recognition software has been properly set up on your system. For a step by step tutorial on how to set this up, please visit [Microsoft's Support Page](https://support.microsoft.com/en-us/windows/use-voice-recognition-in-windows-83ff75bd-63eb-0b6c-18d4-6fae94050571). + +{% include alert.html text="If you want in setup Speech Recognition to Spanish, you should choose 'Spanish (Spain)' as the language. Other options may not work (and it still recognises accents and words from other countries)" type="warning" %} + +{% include alert.html text="It is highly recommended you go through the steps to 'Train your computer to better understand you' so that SAMMI Voice can properly detect your voice and accent when used to trigger buttons. This can be found in the Windows Speech Recognition settings." type="info" %} + +Once you have Microsoft Speech Recognition set up and trained, open up SAMMI Core and click on SAMMI Voice on the left side of the window. + +### SAMMI Connection and Settings +{% include image.html w="75" src="voice.png" alt="Settings window for SAMMI Voice" %} + +If SAMMI Voice is running on the same system as SAMMI Core, you will not need to change the default IP address of `127.0.0.1`. If it is on a different system, use the IP address of the PC where your SAMMI Core is running from. + +The port number should not be altered, except in some very small cases. SAMMI Voice uses the port in your local API settings of 9450. + +{% include alert.html text="In order for SAMMI Voice to work, you will need to go into your SAMMI Core settings and tick the box that enables the Local API Server." type="info" %} + +The password for SAMMI Voice is optional. If you do want to set a password, ensure that you set it so it matches the `Password` field in your SAMMI Core settings for your local API. + +{% include image.html w="75" src="voice2.png" alt="Local API settings in SAMMI Core" %} + +If you want SAMMI Voice to immediately start listening when you open SAMMI Voice, tick the 'Listen on Startup' checkbox. + +If you want SAMMI Voice to minimise to the System Tray when you close the window, tick the 'Minimize only to SysTray checkbox. + +If you want SAMMI Voice to show a confirmation dialog box when you close the window, tick the 'Closing Confirmation' checkbox. + +If you want SAMMI Voice to create a file to display the recognised results and their confidence level (accuracy), tick the 'Create Recognition Logfile' checkbox. + +You can adjust what confidence level (accuracy) that SAMMI Voice sends the trigger to SAMMI by changing the value in the 'Confidence Level' dropdown. + +### Triggers +The Triggers tab for SAMMI Voice is where you list all the triggers you want to use to trigger your SAMMI buttons. Each line represents a different trigger that can be used on your buttons. + +## Creating a voice activated button on SAMMI Core + +#### Add a trigger to SAMMI Voice and a SAMMI Core button +In SAMMI Voice, in the triggers tab, type the word or phrase that you want to use to trigger a button. In this example, we will use the trigger `Testing`. + +Triggers can only be added when SAMMI Voice is not listening. If you are listening, click 'Stop Listening' before adding a new trigger. Once you are done adding your trigger, you can click 'Start Listening'. + +Create a button in SAMMI Core, setting the trigger as a 'SAMMI Voice' trigger. Enter `Testing` as the trigger. + +{% include image.html w="75" src="voice3.png" alt="Creating a voice activated button" %} + +This button will now be triggered when you say `Testing` and for this example, a pop up window will show up with the phrase 'Testing is a success!' + +{% include video.html w="75" src="Vid 070423 174551.mp4" alt="SAMMI Voice Example" %} + + + diff --git a/doc_posts/_faq-commands/switch_deck.md b/doc_posts/_faq-commands/switch_deck.md index 11ced1a1..6a324fe8 100644 --- a/doc_posts/_faq-commands/switch_deck.md +++ b/doc_posts/_faq-commands/switch_deck.md @@ -4,9 +4,7 @@ title: Switch decks with a button num: 3.5 --- -Create a new button. Right click on the button - **Edit Settings**. You can then set up the button to switch your decks when pressed. - -{% include image.html w="75" src="switch-deck.png" alt="Switch decks with a button" %} +Create a new button. Add a new command [Deck App: Switch Deck]({{ "/commands/deck-app#deckappswitchdeck" | relative_url }}) to the button, and select the deck you want to switch to from the dropdown list when the button is pressed. diff --git a/doc_posts/_faq-general/elgato.md b/doc_posts/_faq-general/elgato.md index f901aa70..dbc8c021 100644 --- a/doc_posts/_faq-general/elgato.md +++ b/doc_posts/_faq-general/elgato.md @@ -3,5 +3,4 @@ title: Elgato Stream Deck num: 4 --- -SAMMI can natively communicate with Elgato Stream Deck via key presses.\ -If you're looking for even better functionality, there is an extension [SAMMI Bridge for Elgato Stream Deck](https://streamup.tips/product/lioranboard-bridge-elgato) from StreamUp that you might wanna check out! \ No newline at end of file +SAMMI has official support for the Elgato Stream Deck which can be found here: [Elgato Stream Deck for SAMMI](https://sammisolutions.itch.io/elgato-streamdeck)! \ No newline at end of file diff --git a/doc_posts/_faq-general/fps.md b/doc_posts/_faq-general/fps.md new file mode 100644 index 00000000..8839a22c --- /dev/null +++ b/doc_posts/_faq-general/fps.md @@ -0,0 +1,14 @@ +--- +title: SAMMI FPS +num: 10 +--- + +Full FPS is enabled when SAMMI is in focus. When SAMMI is not in focus, FPS is severely limited to save resources. +In order to enable full FPS even when SAMMI is not in focus, you can add the following key to `settings.ini` file in your SAMMI folder: +``` +[settings] +fullFPS="1" +``` +The changes will take effect after restarting SAMMI. + +{% include alert.html text="This will use more resources and may cause performance issues on some systems." type="warning" %} \ No newline at end of file diff --git a/doc_posts/_faq-general/install-extension.md b/doc_posts/_faq-general/install-extension.md index fcda664e..542a1544 100644 --- a/doc_posts/_faq-general/install-extension.md +++ b/doc_posts/_faq-general/install-extension.md @@ -33,7 +33,4 @@ Extensions are meant to add new functionality to SAMMI. They're made by the SAMM Extension developers can choose to protect their extension decks and their buttons. If the particular button is protected, you cannot copy the button, its commands or see what's inside nested commands (if they're closed). You may still add new commands, modify or delete them. #### Create an extension -SAMMI communicates with all its extensions via bridge.html and its own websocket.\ -Information about how to make your own extension can be found in `SAMMI/bridge/how to make extensions.txt` file.\ -Knowledge of JavaScript programming and SAMMI variable handling is a requirement to program extensions. We encourage you to go over some existing extensions to understand the process.\ -Once you have an extension working, you can submit it in *#development* channel in the official [SAMMI Discord server](https://discord.gg/dXez8Zh). You will need one of the mods to approve it before it can be officially released. Use our [Extension Submission Form](https://sammi.solutions/extensions/submit) if you want your extension to be posted on the official SAMMI website. +All information about how to build your own extension can be found in the [Extension Guide](https://sammi.solutions/extensions/build). You can also reference [Bridge documentation](https://github.com/SAMMISolutions/SAMMI-Bridge#extension-command) and download an [Extension Example File](https://sammi.solutions/extensions/extension_example.sef). \ No newline at end of file diff --git a/doc_posts/_faq-general/keyboard-shortcuts.md b/doc_posts/_faq-general/keyboard-shortcuts.md new file mode 100644 index 00000000..fe6bbb68 --- /dev/null +++ b/doc_posts/_faq-general/keyboard-shortcuts.md @@ -0,0 +1,37 @@ +--- +title: Keyboard Shortcuts +num: 1.2 +--- + +#### Main Window + +| Combination | Action | +|-------|-------- +|Ctrl + Tab|Open/Close the variable window +|Ctrl + N|Create a new deck +{:class='table table-primary table-hover' } + +#### Deck Editor Window + +| Combination | Action | +|-------|-------- +|Ctrl + Tab|Open/Close the variable window +|Ctrl + S|Save and exit deck +|Ctrl + Z|Undo an action +|Shift + Ctrl + Z
Ctrl + Y|Redo an action +|Ctrl + C|Copy a button +|Ctrl + V|Paste a button +|Delete|Delete a button +{:class='table table-primary table-hover' } + +#### Command Editor Window + +As well as the keyboard shortcuts listed below, you can also hover your cursor over any existing command's name and press F1 to open the documentation to that command's info. + +| Combination | Action | +|-------|-------- +|Ctrl + Tab|Open/Close the variable window +|Ctrl + R|Run the button +|Ctrl + S|Save the button +|Ctrl + N
Ctrl + Enter|Add a command to the bottom of the button +{:class='table table-primary table-hover' } diff --git a/doc_posts/_faq-general/localisation.md b/doc_posts/_faq-general/localisation.md index 2337a60d..6eb2e183 100644 --- a/doc_posts/_faq-general/localisation.md +++ b/doc_posts/_faq-general/localisation.md @@ -14,4 +14,4 @@ You can change your language by going to Settings and selecting it from the Lang {% include image.html w="75" src="lang_dropdown.png" alt="Changing Languages in SAMMI" %} -If you'd like to contribute to the localisation efforts, [please let us know!](mailto:sammi.solutions@gmail.com) +If you'd like to contribute to the localisation efforts, please send us an email at info[at]sammi.solutions. diff --git a/doc_posts/_faq-general/other-apps.md b/doc_posts/_faq-general/other-apps.md index 131892d3..ea573f2a 100644 --- a/doc_posts/_faq-general/other-apps.md +++ b/doc_posts/_faq-general/other-apps.md @@ -5,5 +5,5 @@ num: 7 SAMMI can connect to any app or service that has public API or websocket access.\ It is done via custom made extensions. -All available and approved extensions are listed in the #Releases channel in our [Discord server](https://discord.gg/dXez8Zh).\ +All available and approved extensions are listed in the #Releases channel in our [Discord server](https://discord.sammi.solutions).\ If none of them suits your needs, feel free ask in the #Suggestions channel or request a commission! \ No newline at end of file diff --git a/doc_posts/_faq-general/remote-connection.md b/doc_posts/_faq-general/remote-connection.md index 58674975..1a09cec1 100644 --- a/doc_posts/_faq-general/remote-connection.md +++ b/doc_posts/_faq-general/remote-connection.md @@ -3,15 +3,15 @@ title: Remote Connection num: 3 --- -It's possible to remotely connect and control SAMMI via SAMMI Deck from anywhere in the world.\ +It's possible to remotely connect and control SAMMI via Deck Apps from anywhere in the world.\ There are multiple ways to accomplish this. This documentation covers the easiest and most accessible one. 1. Download Ngrok and sign up for an account. 2. Log in to your account and retrieve your authtoken. 3. Go to the downloaded file, unzip it and run ngrok.exe. You should see a command line open. 4. Type `ngrok authtoken YOURAUTHTOKEN` and press enter. You should see a message `Authtoken saved to configuration file: C:\Users\...`. This step is necessary to prevent your session from timing out. -5. To start the tunnel, type `ngrok tcp 9425` and hit enter.
The default region is US. You can change it by adding `-region=REGION` flag. Available regions: us, eu, ap, au, sa, jp, in. Example: `ngrok tcp -region=eu 9425`. -6. You should see your session started. Go to your SAMMI Deck and paste the new IP and port from the Forwarding line (make sure to omit the `tcp://` part). As long as your tunnel is active, you can connect to your SAMMI from anywhere in the world now! :) +5. To start the tunnel, type `ngrok tcp 9470` and hit enter.
The default region is US. You can change it by adding `-region=REGION` flag. Available regions: us, eu, ap, au, sa, jp, in. Example: `ngrok tcp -region=eu 9470`. +6. You should see your session started. Go to your SAMMI Deck App and paste the new IP and port from the Forwarding line (make sure to omit the `tcp://` part). As long as your tunnel is active, you can connect to your SAMMI from anywhere in the world now! :) {% include image.html w="50" src="ngrok.png" alt="Creating a new tunnel via ngrok" %} All currently active tunnels can be seen on your dashboard.\ diff --git a/doc_posts/_getting-started/community.md b/doc_posts/_getting-started/community.md index f8127bba..41691813 100644 --- a/doc_posts/_getting-started/community.md +++ b/doc_posts/_getting-started/community.md @@ -12,62 +12,63 @@ type: fullpage Written purely in `markdown`, *yay*! - bullet point - another bullet point -- and another one -{% include selectAll.html text="This sentence will all be selected even if the user clicks only on a single letter." %} -{% include colored_text.html color="red" text="Some red text hello 123456" -%} +- and another one + +{% include selectAll.html text="This sentence will all be selected even if the user clicks only on a single letter." %} +{% include colored_text.html color="red" text="Some red text hello 123456" %} + | table header | another header | one more | |-------|--------|--------| | first | second | third | | one | two | three | -{:class='table table-primary w-auto'} +{:class='table table-primary w-auto'} + {% include alert.html text="Some important alert text" type="warning" %} {% endcapture %} -## Where to get support -If you're looking for support for SAMMI, you have these options: -1. Read this documentation. You can use the search bar to find any relevant topics for your question. -2. Join the official [SAMMI Discord server](https://discord.gg/dXez8Zh). We've got lots of very knowledgeable members that will be able to help you! -3. Become a member of our [subreddit](http://reddit.com/r/SAMMI). It's still pretty new, help us get it going! + +{% capture example1 %} +simple template which will produce this particular button: {% include example_public.html src="https://i.imgur.com/mDMCrPC.png" size="50" title="Simple button" pastebin="9HNbNCrN" %} +{% endcapture %} + +{% capture example2 %} +advanced template which will produce this button: {% include example_public.html src="https://i.imgur.com/jydvLf6.jpeg" size="50" title="Advanced button" pastebin="9HNbNCrN" desc=description %} +{% endcapture %} + +### Where to Get Support +If you need support for SAMMI, you have several options available: +1. Read this documentation. Use the search bar to find topics relevant to your question. +2. Join the official [SAMMI Discord server](https://discord.sammi.solutions). Our knowledgeable members are ready to assist you! {:class='mt-2 anchor-header'} -## Ways to contribute +### Ways to Contribute Interested in contributing to SAMMI documentation or building an extension? We’d love your help! -### Edit a page -1. Read through the documentation, and click the {::nomarkdown} Edit{:/} button if you see anything confusing or have any **suggestions** for something to be improved. -2. If this is your first time editing this website, you must click on +#### Edit a page +1. Browse the documentation and click the {::nomarkdown} Edit{:/} button if you find anything unclear or have suggestions for improvement. +2. If this is your first time editing the website, click "Fork the repository." 3. Make your changes! -4. Scroll down, create a meaningful title (and optionally description) and press -5. Once the page reloads, click on -6. Wait for an approval for it to show live on our page! +4. Scroll down, provide a meaningful title (and optional description), and click "Propose changes." +5. After the page reloads, click "Create pull request." +6. Wait for approval for your changes to appear live on the website.
{% include video.html w="50" src="edit_page.mp4" alt="Editing a page on Github" %} -### Add your own button example -Want to **add your own button example** to any of the commands in the [Commands]({{ "commands/variables" | relative_url }}) section? Each command can have up to 3 different button examples! -1. First you will need a screenshot of the button uploaded to Imgur and [pastebin](https://pastebin.com/) with the button's [imported JSON]({{ "faq/commands#shareabutton" | relative_url }}). -2. Click on {::nomarkdown} Edit{:/} button for the command you want to add an example to. Maybe you would like to add one to [Variable Transition]({{ "commands/variables#variabletransition" | relative_url }}) command? -3. If this is your first time editing this website, you must click on -4. Use this [very simple template](https://github.com/SAMMISolutions/docs/edit/main/templates/example_command_simple.md) which will produce this particular button: {% include example_public.html src="https://i.imgur.com/zsxdHym.jpeg" size="50" title="Simple button" pastebin="9HNbNCrN" %} -{:start="5"} -5. (optional) Like to experiment? Check out the [advanced template](https://github.com/SAMMISolutions/docs/edit/main/templates/example_command.md) instead which will produce this button: {% include example_public.html src="https://i.imgur.com/jydvLf6.jpeg" size="50" title="Advanced button" pastebin="9HNbNCrN" desc=description %} - -{:start="6"} -6. Add the code snippet from the template to the very end of the command you're editing on Github! -7. Scroll down, create a meaningful title (and optionally description) and press -8. Once the page reloads, click on -9. Wait for an approval for it to show live on our page! - - +#### Add your own button example +To add your own button example to a command in the [Commands]({{ "commands/variables" | relative_url }}) section (each command should have up to 3 examples): -{:class='mt-2 anchor-header'} -### Submit your own extension -Have you made your own extension and would like to share it with the rest of the community? You can now [submit it](https://sammi.solutions/extensions/submit) directly from this website! - -### Report a bug -Found a bug? The fastest way to report a bug is to let us know via Discord! If a bug is causing your SAMMI Core to crash, you can also send us a crash log by clicking 'Yes' and entering a comment in the crash log pop-up that appears after the crash. +1. Upload a screenshot of the button to Imgur (while logged in) and the button's [imported JSON]({{ "faq/commands#shareabutton" | relative_url }}) to [pastebin](https://pastebin.com/). +2. Click the {::nomarkdown} Edit{:/} for the command you want to add an example to (e.g., Variable Transition command). +3. If this is your first time editing the website, click "Fork the repository." +4. Use the provided {{ example1 }} +{:start="4"} +5. (optionally) Explore the {{ example2 }} +{:start="5"} +5. Add the code snippet from the template to the end of the command you're editing on Github. +6. Scroll down, provide a meaningful title (and optional description), and click "Propose changes." +7. After the page reloads, click "Create pull request." +8. Wait for approval for your example to appear live on the website. -## Content Creators Under construction -Watch videos from members of the SAMMI community to give you tips and tricks on how to use SAMMI. +#### Report a Bug +To report a bug, the quickest way is to contact us via Discord. If a bug causes SAMMI Core to crash, you can also send us a crash log by clicking "Yes" and providing a comment in the crash log pop-up that appears after the crash. diff --git a/doc_posts/_getting-started/data-backup.md b/doc_posts/_getting-started/data-backup.md deleted file mode 100644 index 68ed595a..00000000 --- a/doc_posts/_getting-started/data-backup.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -layout: default -title: Update and Backup -menu: Getting Started -num: 4 -permalink: /getting-started/data-backup -type: fullpage ---- - -#### Auto Update SAMMI -SAMMI comes with an auto-updater that allows you to update or verify SAMMI Core, SAMMI Deck and Bridge. While SAMMI is running, right-click on the SAMMI icon in your system tray and select `Check for Updates`. - -If there are updates available, you will be able to update or verify the SAMMI components to make sure you are on the latest version. - -{% include image.html w="75" src="updater.png" alt="SAMMI Updater" %} - -#### Back up your data -SAMMI is a self contained app in the SAMMI folder, you do not go through the process of installing it like with other apps. -This means you can freely copy the whole SAMMI folder to another computer and it will work just the same! - -All your current decks are saved as `json/decks_data.json` file. SAMMI automatically creates a backup file every time you save your deck. - - diff --git a/doc_posts/_getting-started/download.md b/doc_posts/_getting-started/download.md index 50524f6c..4ac3f5f9 100644 --- a/doc_posts/_getting-started/download.md +++ b/doc_posts/_getting-started/download.md @@ -7,45 +7,31 @@ permalink: /download type: fullpage --- -### SAMMI Core, Bridge and Deck +### How to Download SAMMI -When you download SAMMI, it comes with SAMMI Core, Bridge and SAMMI Deck for PC. You can download an Android Deck from [Google Play Store](https://play.google.com/store/apps/details?id=lioranboard.ca.lioranboard.streamdeck). -{% include alert.html type="warning" text="Android Deck was not made by the SAMMI Devs, and is utilising program code written and developed by Lioran for LioranBoard." %} +When you download SAMMI, the package includes SAMMI Core, SAMMI Bridge, SAMMI Panel, and SAMMI Voice. -SAMMI Core is only fully supported on Windows 10 and above, support for other platforms is coming! +Please note that SAMMI Core is fully supported on Windows 10 and later versions. -You should be able to run SAMMI on Linux and MacOs using [Wine](https://www.winehq.org/), however we cannot guarantee its functionality and do not provide any technical support at this time. -*If you do use Wine, it will also need to be running Windows 10 and above*. +While it may be possible to run SAMMI on Linux and macOS using [Wine](https://www.winehq.org/), we cannot guarantee full functionality and do not offer technical support for this setup. If you choose to use Wine, ensure that it is configured to emulate Windows 10 or later. - + -Wish to have early-access to all our beta versions? You can become our [Patron](https://www.patreon.com/sammidevs)! +For early access to beta versions of SAMMI, consider becoming our [Patron](https://www.patreon.com/sammidevs)! -### Updating -Updating SAMMI can be done via the in-app updater. Click 'Settings' and then 'Check for Updates'. - -{% include image.html w="75" src="updater.png" alt="SAMMI Updater" %} - -Alternatively, you can download the latest version of the entire SAMMI package from our [SAMMI Itch Page](https://sammisolutions.itch.io/sammi) and replace both `SAMMI Core.exe` and `data.win` files in your SAMMI folder. - -### Dependencies +### Required Software **OBS Studio** -SAMMI Core is compatible with OBS Studio. Other streaming software, such as Streamlabs OBS, is not currently supported. +SAMMI Core is compatible with OBS Studio. Other streaming software, such as Streamlabs OBS, is not currently supported. **OBS Websocket** -This is how SAMMI Core communicates with OBS Studio. - -OBS version 28 has websocket 5.0 built in and SAMMI is fully compatible with it. However, please note that since websocket 5.0 is still very new, some extensions that formerly worked on OBS Websocket 4.9.1 will not work if you use 5.0. - -If you are on OBS version 27, you can download OBS Websocket 5.0 **along with** the [OBS Websocket 4.9-compat](https://github.com/obsproject/obs-websocket/releases/tag/4.9.1-compat) in order to preserve backwards compatibility. However, this means you will need to set up two instances of OBS in SAMMI, one using 5.0 and one using the 4.9-compat version. - -For the time being, until you are sure your extensions have been fully updated to use OBS Websocket 5.0, we suggest staying on OBSws 4.9.1. +OBS Websocket enables communication between SAMMI Core and OBS Studio. SAMMI is compatible with OBS Websocket versions 5.0 and 4.9. However, we highly recommend using OBS Websocket 5.0 with OBS Studio versions 28 and above. - +OBS Studio 28 and higher come with OBS Websocket 5.0 pre-installed, so there is no need to install it separately. +While OBS Websocket 5.0 is preferred, there may be specific cases where OBS Websocket 4.9 is still needed, such as when using certain outdated plugins that have not yet been updated for compatibility with OBS Websocket 5.0. For users who need to maintain compatibility with OBS Websocket 4.9, OBS Studio 28 and above supports the installation of the OBS Websocket 4.9.1-compat plugin, which can be downloaded from the OBS Websocket GitHub. ### Extensions -Extensions can be found in our [Extensions](https://sammi.solutions/extensions) section or #releases channel in our **[Discord](https://discord.gg/dXez8Zh)** server! +You can find additional extensions in our [Extensions](https://sammi.solutions/extensions) section or in the #releases channel on our **[Discord](https://discord.sammi.solutions)** server! diff --git a/doc_posts/_getting-started/introduction.md b/doc_posts/_getting-started/introduction.md index 8c573350..af73a19c 100644 --- a/doc_posts/_getting-started/introduction.md +++ b/doc_posts/_getting-started/introduction.md @@ -8,32 +8,35 @@ notoc: true type: fullpage --- -

SAMMI is a fully customizable Streaming Assistant that lets your Twitch and YouTube Live audience control and interact with your stream.

+

SAMMI is a versatile Streaming Assistant designed to enhance interactivity between streamers and their Twitch and YouTube Live audiences.

-It is fully compatible with [OBS Websocket](https://obsproject.com/forum/resources/obs-websocket-remote-control-obs-studio-from-websockets.466/) which can remotely control your [OBS Studio](https://obsproject.com/). +SAMMI is fully compatible with [OBS Websocket](https://obsproject.com/forum/resources/obs-websocket-remote-control-obs-studio-from-websockets.466/), allowing you to remotely control [OBS Studio](https://obsproject.com/). -{% include alert.html text="OBS Websocket is natively integrated in OBS 28 or later versions" type="success" %} +{% include alert.html text="OBS Websocket is natively integrated in OBS 28 and later versions." type="success" %} -You can easily create buttons for the most basic things, such as automatic scene switching and custom alerts. However, once you get more familiar with the software, whole new possibilites will open up for you. +With SAMMI, you can create simple buttons for tasks like scene switching and custom alerts. As you become more proficient with the software, you'll discover a wealth of advanced possibilities. -SAMMI Core itself works like a simple programming language. It has variables, operators, arrays, objects, string and number methods, If and Else statements, loops, async/await commands and much more. +SAMMI Core functions like a programming language, offering variables, operators, arrays, objects, string and number methods, conditional statements, loops, async/await commands, and more. -#### Connection to Twitch +#### Twitch Integration -SAMMI Core can listen to Twitch alerts and chat messages, send chat messages, edit your channel point rewards and fully control your Twitch Stream via Twitch API. +SAMMI Core integrates with Twitch, enabling you to listen to alerts and chat messages, send chat messages, manage channel point rewards, and control your Twitch stream via the Twitch API. -#### Connection to YouTube Live +#### YouTube Live Integration -SAMMI Core can listen to YouTube Live events and control your live stream! Find out more in -[Integrations - YouTube]({{ "integrations/youtube" | relative_url }}) +SAMMI Core integrates with YouTube Live, allowing you to listen to live events and manage your live stream. Learn more in [Integrations - YouTube]({{ "integrations/youtube" | relative_url }}). -#### Connection to OBS Studio +#### OBS Studio Integration -SAMMI Core can directly connect to OBS Websocket to control your OBS Studio. You can start/stop streaming, switch scenes, change source settings, control media, animate your sources, toggle filters and much more. +SAMMI Core connects directly to OBS Websocket, giving you control over OBS Studio. Start/stop streaming, switch scenes, modify source settings, control media, animate sources, toggle filters, and more. + +#### Voice Control + +SAMMI Voice is a component that enables voice-activated control of SAMMI. Automate buttons with simple voice commands! #### Extensions -If all of the above is not enough for your needs, SAMMI Core also supports community made JavaScript extensions through the SAMMI Bridge, which can greatly extend its functionality, such as controlling other apps and services directly from your stream. Some of our extensions allow for direct SAMMI interaction with: +For even greater functionality, SAMMI Core supports community-created JavaScript extensions via SAMMI Bridge. These extensions allow you to interact with other apps and services, including: - Ko-Fi - Twitter - Spotify @@ -42,6 +45,6 @@ If all of the above is not enough for your needs, SAMMI Core also supports commu - foobar - Discord - Heat Map Twitch extension -- and many more! +- and more! -A full list of SAMMI extensions can be found in [Extensions](https://sammi.solutions/extensions) and in our [Discord Server](https://discord.gg/dXez8Zh)! +Explore the full list of SAMMI extensions in [Extensions](https://sammi.solutions/extensions) and on our [Discord Server](https://discord.sammi.solutions)! \ No newline at end of file diff --git a/doc_posts/_getting-started/migration-lb2.md b/doc_posts/_getting-started/migration-lb2.md index 6684fc8b..e5d12a00 100644 --- a/doc_posts/_getting-started/migration-lb2.md +++ b/doc_posts/_getting-started/migration-lb2.md @@ -10,9 +10,9 @@ type: fullpage {% include alert.html text="Always back up your files and folders before running updates!" type="warning" %} #### Updating from Lioranboard 2 versions 2.08.6 and below -1. Download the entire SAMMI package from our [itch.io page](https://sammisolutions.itch.io/sammi). In the `x64` folder, copy the following files: +1. Download and unpack the entire SAMMI package from our [itch.io page](https://sammisolutions.itch.io/sammi). Copy the following files: - SAMMI core.exe -- DLLextension.dll +- SAMMI.dll - settings.ini - data.win @@ -20,7 +20,7 @@ type: fullpage 3. Run `SAMMI Core.exe` and you should see your existing decks and buttons from LioranBoard 2. Go to the settings page and click 'Check for Updates'. SAMMI Core should have been updated to the current version of SAMMI. SAMMI versions are identified by versions 2022.4.0 and above. -4. Once you have successfully updated the LioranBoard 2 Receiver to SAMMI Core, you can proceed to updating the Transmitter (now called Bridge) and the Stream Deck (now called SAMMI Deck). Continue reading below for some important steps you need to take after updating to SAMMI. +4. Once you have successfully updated the LioranBoard 2 Receiver to SAMMI Core, you can proceed to updating the Transmitter (now called Bridge) and the Stream Deck (now called SAMMI Panel). Continue reading below for some important steps you need to take after updating to SAMMI. #### Updating from Lioranboard 2 CE You can use the automatic built-in updater within SAMMI Core to update all components of SAMMI. You do not need to update your Bridge files if the button says 'Redownload'. Re-donwloading the Bridge files will download a fresh copy of your `bridge.html` file and reinstall all extensions. @@ -38,8 +38,8 @@ If you use an OBS dock for your Transmitter, you will have to replace that Trans {% include alert.html text="It is important to note that the LioranBoard Transmitter will not work with SAMMI and the SAMMI Bridge will not work with LioranBoard 2." type="warning" %} -##### SAMMI Deck -Functionality of the SAMMI Deck remains exactly the same as the Stream Deck. The update for the Deck will update your taskbar icon. +##### SAMMI Panel and other Deck Apps +Functionality of the SAMMI Panel remains exactly the same as the Stream Deck. The update for the Panel will update your taskbar icon. ##### New Twitch Token When updating to SAMMI, the program uses a new Twitch Token to handle all Twitch integrations. This means that once you update to SAMMI you will need to revoke your existing Twitch credentials and relink them to Twitch. @@ -63,10 +63,11 @@ There will no longer be any YouTube integration to any other app (LioranBoard 2 ##### Deleting LioranBoard Files and Folders {% include alert.html text="You should only proceed with file deletion once you are sure everything in SAMMI is working!" type="warning" %} -Ensure all your SAMMI components (Core, Bridge and Deck) are updated to the latest versions and are functioning properly before deleting any old LioranBoard 2 files. Make sure all your extensions that were installed in your transmitter.html have been successfully transferred to the bridge.html and are working as expected. +Ensure all your SAMMI components (Core, Bridge and Panel) are updated to the latest versions and are functioning properly before deleting any old LioranBoard 2 files. Make sure all your extensions that were installed in your transmitter.html have been successfully transferred to the bridge.html and are working as expected. Once you have made sure they are all in working order, you can delete the following files and folders: - Stream Deck folder - transmitter folder - Lioranboard 2.0.exe +- DLLExtension.dll diff --git a/doc_posts/_getting-started/step-by-step.md b/doc_posts/_getting-started/step-by-step.md index 7793d002..9538ee46 100644 --- a/doc_posts/_getting-started/step-by-step.md +++ b/doc_posts/_getting-started/step-by-step.md @@ -11,14 +11,6 @@ Welcome to SAMMI and the world of endless possibilities! On this page, we will walk you through a step by step tutorial on how to set up SAMMI, and connect it to OBS and your Twitch account. You will also learn how to create your first button, add a command and trigger it via Twitch chat. -You can watch our full setup video walkthrough or follow the written guide below. - -{% include alert.html text="SAMMI is a closed source application currently supported only on Windows." type="warning" %} - -#### Watch Full Setup Video - - - #### 1. Install all dependencies - Download and install **[OBS Studio](https://obsproject.com/)**. As of now, SAMMI does not support other streaming software. - As of OBS Studio v28, there is no need to download a separate OBS Websocket plugin as it already has OBS Websocket 5.0 built into it. This is how SAMMI communicates with OBS Studio. If you are running OBS Studio version 27, you will need to download and install **[OBS Websocket 4.9.1](https://obsproject.com/forum/resources/obs-websocket-remote-control-obs-studio-from-websockets.466/)** @@ -30,9 +22,10 @@ We recommend selecting **64bits release**. SAMMI 2022.5.0 is the final release t -Unpack the zip file and unpack it to a folder on your PC. +Extract the zip folder and unpack the files to a location on your PC. Windows 11 should let you right click and extract all from zip files without 3rd party tools, otherwise you can use trusted software like WinRar or 7Zip to extract the files. -{% include alert.html text="Do not place SAMMI folder in your Program Files or any network drives (Google Drive, OneDrive, Dropbox), as it sometimes can cause issues. Do not put SAMMI in your OBS folder, or your obs-plugins folder." type="danger" %} +{% include alert.html text="Do not run SAMMI directly out of the zip folder. Make sure you extract the zipped files to a location on your PC. You will inevtiably lose all your decks if you do not extract SAMMI first." type="danger" %} +{% include alert.html text="Do not place the SAMMI folder in your Program Files or any network drives (Google Drive, OneDrive, Dropbox), as it can sometimes cause issues. Do not put SAMMI in your OBS folder, or your obs-plugins folder." type="danger" %} #### 3. Launch SAMMI @@ -165,4 +158,4 @@ Do you still remember the Twitch chat trigger you configured for your button? If Now you have learned how to create a button, add a command and trigger it via Twitch chat! You can find more information about the individual components, commands and triggers in the next sections of the documentation. -{% include alert.html text="Didn't work as expected? Cannot connect to OBS, Bridge or Twitch chat? Please refer to our Troubleshooting section!" type="info" %} +{% include alert.html text="Didn't work as expected? Cannot connect to OBS, Bridge or Twitch chat? Please refer to our Troubleshooting section!" type="info" %} diff --git a/doc_posts/_getting-started/update-backup.md b/doc_posts/_getting-started/update-backup.md new file mode 100644 index 00000000..3d1212c5 --- /dev/null +++ b/doc_posts/_getting-started/update-backup.md @@ -0,0 +1,38 @@ +--- +layout: default +title: Update and Backup +menu: Getting Started +num: 4 +permalink: /getting-started/data-backup +type: fullpage +--- + +## Auto Update SAMMI +**To check for new versions of SAMMI Core, follow these steps**: +1. Open SAMMI Core and navigate to "SAMMI-Settings." +2. Select "Check for Updates." +3. If updates are available, a popup will appear asking if you would like to update now. +4. Click "Yes" to initiate the SAMMI Updater, which will automatically update all components and restart SAMMI Core. The update process is now complete! + +{% include image.html w="75" src="updater.png" alt="SAMMI Updater" %} + +**If you wish to update or downgrade specific components, you can do so by manually launching the SAMMI Updater**: +1. Go to the SAMMI folder on your computer and locate the "SAMMI Updater" subfolder. +2. Double-click on "SAMMI Updater.exe" to open the updater. +3. A menu will be displayed, allowing you to choose whether to update or downgrade a component. +4. If you choose to downgrade a component, you will have the option to select the version to which you want to revert. + +{% include alert.html text="You may be prompted to run SAMMI Updater as an administrator." type="warning" %} + +### Download SAMMI Updater +If there is no SAMMI Updater in your SAMMI folder, you can download the newest SAMMI Updater from [SAMMI Github repository](https://github.com/SAMMISolutions/SAMMI-Official/raw/main/download/SAMMI%20Updater.zip).\ +Place the whole SAMMI Updater folder in your SAMMI folder and run SAMMI Updater.exe to update SAMMI manually. Read more about manual updates in [Troubleshooting Section](/docs/troubleshooting/common#updateproblemsmissingsammiupdater). + + +## Back up your data +SAMMI is a self contained app in the SAMMI folder, you do not go through the process of installing it like with other apps. +This means you can freely copy the whole SAMMI folder to another computer and it will work just the same! + +All your current decks are saved as `json/decks_data.json` file. SAMMI automatically creates a backup file every time you save your deck. + + diff --git a/doc_posts/_integrations-obs/obs.md b/doc_posts/_integrations-obs/obs.md deleted file mode 100644 index 8dbc15ce..00000000 --- a/doc_posts/_integrations-obs/obs.md +++ /dev/null @@ -1,100 +0,0 @@ ---- -layout: default -title: OBS Studio -menu: Integrations -num: 1 -permalink: /integrations/obs -type: fullpage ---- - -SAMMI communicates with OBS via OBS Websocket (OBSWS), which allows you to remotely control and listen to OBS Studio events. - -#### Install OBS Websocket - -SAMMI is compatible with both OBS websocket 5.0 and 4.9. As OBSWS 5 is still very new, please note that some of your extensions might not work with it until they have been updated. - -OBS Studio 28 comes bundled with OBS Websocket 5.0. There is no need to download a separate plugin for it. - -To ensure the 4.9 version protocol is still supported, you can download the 4.9.1-compat plugin for OBS Studio 28 available at the link below. - - - - - - - -
- -#### Connect SAMMI to OBS Websocket -You do not need to download OBS Websocket 5.0 if you are running OBS version 28 as it is bundled with the OBS install. You will only need to download the OBS 4.9.1-compat plugin if you wish to run OBS Websocket 4.9 which some extensions might still need. - -In your SAMMI click on **OBS Connections** at the bottom menu: -- `Name`: Name of your OBS. The first OBS will always be Main and cannot be changed. -- `Protocol`: Choose the protocol your OBS Websocket is using. Choose OBSws4 or OBSws5 accordingly. -- `IP`: IP Address of the OBS Websocket. Unless you're connecting to an OBS on another computer, it will be always `127.0.0.1`. -- `Port`: Port of the OBS Websocket. Must match the port in your OBS-Tools-Websocket Server Settings. Default port for OBSws5 is `4455` and for OBSws4 `4444`. We do not recommend changing the default port. -- `Password`: Password to authorize with OBS Websocket. Leave empty, unless you checked Enable Authorization in OBS-Tools-OBS Websocket Settings. In that case the passwords must match. -- `Auto Connect`: Whether you want SAMMI to automatically connect to OBS Websocket on launch -- `Non-Blocking`: Leave checked unless you have difficulties connecting to OBS Websocket. - - {% include image.html w="75" src="obs_connection.png" alt="OBSWS settings in SAMMI and OBS must match" type="image" %} - -Once you press **connect**, you should see the `OBS Main` light indicator turn from red to green in your SAMMI. - -
- -#### Connect SAMMI to multiple OBS Websockets -You can connect SAMMI to multiple OBS Websockets, just add another connection in your OBS Connections settings. - -You will need to manually select your OBS Name for all your OBS commands (if not using Main OBS connection), so SAMMI knows which OBS to send them to. OBS Name accepts variables as inserts as well. - -{% include image.html w="75" src="obs-manual-select.png" alt="Manually select OBS name for OBS commands" %} - -
- -#### Control OBS from SAMMI -You can remotely control your OBS Studio with [SAMMI OBS commands]({{ "commands/obs-general" | relative_url }}). - - -**1. Navigate to an existing deck or click on `Add a new deck` in your SAMMI**\ -**2. Right click on an empty grid and select `Create Button`**\ -**3. Click on the and add your OBS command(s)** - - Example 1: Switch to previous scene - {% include image.html w="75" src="obs-switch-scenes.png" alt="Switch to previous scene" %} - - Example 2: Change text in your Text (GDI+) source in OBS - {% include image.html w="75" src="obs-gdi-text.png" alt="Change text in your Text (GDI+) source" %} - - Example 3: Change position of a source - {% include image.html w="75" src="obs-source-position.png" alt="Change source position" %} - -{% include alert.html text="You can combine your OBS commands with all other SAMMI commands to create complex logic." type="info" %} - -**4. Click Save in your edit button screen and then Save again in your deck. This is an important step to save your button!**\ -**5. Press the button in your SAMMI Deck while connected to OBS to execute the command(s).** - - {% include video.html w="75" src="obs-control.mp4" alt="Controlling OBS remotely from SAMMI" %} - -#### Permanent Variables -Once you're connected to OBS Websocket, SAMMI provides you with some useful permanent variables that you can use in your commands.\ -All OBS variables are saved in `global.[obsName]` object.\ -**If you're using only one single OBS connection**, your variables will be always saved in `global.Main`, for example `global.Main.connected`. - -{% include image.html w="75" src="obs_variables.png" alt="Variable window showing permanent OBS variables" %} - -| Variable | Explanation| -|-------|--------|-------- -{% include selectAll.html text="global.[obsName].connected" %} | Whether you're connected to your selected OBS Name, 1 = connected, 0 = not connected -{% include selectAll.html text="global.[obsName].current_scene" %} | Your selected OBS current scene -{% include selectAll.html text="global.[obsName].previous_scene" %} | Your selected OBS previous scene -{% include selectAll.html text="global.[obsName].type" %} | OBSws selected type in OBS Connections, either `OBSws4`, `OBSws5` or `Auto` -{% include selectAll.html text="global.[obsName].ip" %} | The IP address of the OBS connection -{% include selectAll.html text="global.[obsName].port" %} | The port of the OBS connection -{% include selectAll.html text="global.[obsName].obs_studio_version" %} | Current OBS studio version the OBSws is connected to -{% include selectAll.html text="global.[obsName].obs_websocket_version" %} | Current OBS Websocket version the OBSws is connected to -{:class='table table-secondary w-auto table-hover text-break' } - -
- - -#### Listen to OBS events in SAMMI -You can trigger buttons in your SAMMI by listening to events in your OBS Studio, such as switching to a new scene or enabling a studio mode.\ -You can find a detailed guide to setting up your OBS triggers in our [Triggers-OBS]({{ "triggers/obs" | relative_url }}) section. diff --git a/doc_posts/_integrations/crowd_control.md b/doc_posts/_integrations/crowd_control.md new file mode 100644 index 00000000..445331bc --- /dev/null +++ b/doc_posts/_integrations/crowd_control.md @@ -0,0 +1,51 @@ +--- +layout: default +title: Crowd Control +menu: Integrations +num: 5 +permalink: /integrations/crowd-control +type: fullpage +version: 202322 +--- + +{% include alert.html text="This integration no longer exists, and is here for legacy purposes to those already using it." type="warning" %} + +Our integration connects SAMMI with Crowd Control, providing an interactive gaming experience where viewers on platforms like Twitch and YouTube can directly impact your games. + +#### Download + + +#### Install +You can follow the [Extension Install Guide](https://sammi.solutions/extensions/install) + +#### Bridge Interface + +You can select the platform, username, game and pack in Bridge. + +{% include image.html w="50" src="crowdcontrol_bridge.png" alt="Crowd Control Interface" %} + + +#### Crowd Control Commands +SAMMI offers several commands for Crowd Control: + +{% include alert.html text="These commands needs some time to execute, we recommend to use Wait Until Variable Exists command." type="warning" %} + +| Command | Description | +|--------------------------|-------------| +| Get Effects for current game | Returns an object with all the available effects for the selected game/pack in the bridge. | +| Get Game List | Returns an object array with all available Crowd Control games. | +| Get Connection Status | Returns the connection status, returning 0 if not connected, and 1 when connected. | +| Toggle Connection Status | Changes your connection status based on the connection settings from the bridge. Returns 0 if not connected or 1 when connected. | +{:class='table table-primary w-auto table-hover data-toggle='table'} + +#### Crowd Control Triggers + +| Trigger | Description | +|--------------------------|-------------| +| Effect Success | Triggered whenever an effect is successfully activated. | +| Effect Failure | Triggered whenever an effect fails to trigger. | +| Effect Request | Triggered whenever an effect is requested. This is always followed by either an Effect Success or an Effect Failure trigger. | +| Timed Effect Update | Triggered whenever a timed effect is updated, such as when the effect has started (begin), the game was paused (pause), or resumed (resume). | +{:class='table table-primary w-auto table-hover data-toggle='table'} + + diff --git a/doc_posts/_integrations/elgato_stream_deck.md b/doc_posts/_integrations/elgato_stream_deck.md new file mode 100644 index 00000000..c02ef896 --- /dev/null +++ b/doc_posts/_integrations/elgato_stream_deck.md @@ -0,0 +1,113 @@ +--- +layout: default +title: Elgato Stream Deck +menu: Integrations +num: 8 +permalink: /integrations/elgato-stream-deck +type: fullpage +version: 202430 +--- + +Our integration connects SAMMI with Elgato Stream Deck unlocking even more potential out of your Stream Deck powered devices such as the Stream Deck, Footpedal, Stream Deck+, and more! + +#### Download +First, you'll need the SAMMI Extension below: + + + +Next, you'll need the Elgato Stream Deck plugin. +Currently, we are awaiting approval of our plugin to show up on the Elgato Marketplace. + +In the meantime, you can download the plugin file [from our Github Releases here](https://github.com/SAMMISolutions/SAMMI-Elgato-StreamDeck-Extension/releases) + +Make sure that you are looking at the latest version, and click on the file that says: +`SAMMI.streamDeckPlugin` + +{% include image.html w="50" src="elgatostreamdeck_plugin_download.png" alt="Elgato Stream Deck plugin download screen indicating that you must press on the file that says SAMMI stream deck plugin" %} + + +#### Install +For the SAMMI extension, you can follow the [Extension Install Guide](https://sammi.solutions/extensions/install) + +For the Elgato Stream Deck plugin, you'll want to navigate to where your `SAMMI.streamDeckPlugin` was downloaded. + +If you have the Stream Deck software installed on your system, this plugin should have a unique icon. Double click on the file with the Stream Deck software open, and the window should suddenly become focused. + +Wait a moment or two and you should get a popup on the top right indicating that the plugin was successfully installed. + +{% include image.html w="50" src="elgatostreamdeck_plugin_install.png" alt="Elgato Stream Deck plugin installation process with the successful install alert highlighted in red" %} + +#### Bridge Interface + +This simply lets you know if the extension is successfully connected to SAMMI or not! + +You should see "Connected" in green if the Stream Deck software successfully has a connection with SAMMI! + +You'll need the Elgato Stream Deck *Plugin* for that! + +{% include image.html w="50" src="elgatostreamdeck_bridge.png" alt="Elgato Stream Deck Bridge Interface" %} + +#### Elgato Stream Deck Interface + +There should be a new category in your Stream Deck software under the name "SAMMI". Click it to expand all available "Actions". + +{% include image.html w="50" src="elgatostreamdeck_plugin_sidebar.png" alt="Elgato Stream Deck Plugin Sidebar showing a new SAMMI section" %} + +#### Elgato Stream Deck Actions +The Stream Deck offers (currently) a single action to you: + +The "Action" Action + +{% include image.html w="50" src="elgatostreamdeck_plugin_action.png" alt="Elgato Stream Deck Plugin Action, known as 'Action'." %} + +Sounds a little confusing, but it'll all make sense once you drag that action onto your "Canvas", where all of your active Actions are stored. + +Upon clicking on your new SAMMI Action in your Canvas, you should see the "Property Inspector" along the bottom of the application window. + +{% include image.html w="50" src="elgatostreamdeck_plugin_pi.png" alt="Elgato Stream Deck Plugin Property Inspector for Action" %} + +Here is what each field does: + +| Action Field | Description | +|--------------------------|-------------| +| Action ID | A UUID used to identify this action from within SAMMI. It is highly recommended that you do not change this value, however, you may as long as you keep them unique. Overlapping Action IDs may have unintended side effects! | +| Title | A clone of the disabled "Title" field above, with the same functionality. You can click the text options beside the disabled text field to give your text some style just like in other Actions.| +| Icon | Provide a local filepath, URL, or Base64 URI to give your action an icon! An unknown image will appear as a question mark until resolved, or the field becomes blank. | +| Custom Properties | This section allows you to provide custom metadata to be attatched to your action. You may add as many as you want, these will appear as an Object within SAMMI. | +{:class='table table-primary w-auto table-hover data-toggle='table'} + +Each of these fields can be read, **and** manipulated using SAMMI! + +{% include alert.html text="Fields manipulated via SAMMI are not visible in the Property Inspector. Treat these fields as the startup-defaults to your action." type="warning" %} + +#### SAMMI Commands +SAMMI offers a powerful command for Elgato Stream Deck: + +{% include alert.html text="changes using this command are **not** saved in the Stream Deck software across loads." type="warning" %} + +| Command | Description | +|--------------------------|-------------| +| Update Action | Manipulate any of the fields in your Stream Deck Action. Provide the Action ID found in your Action's property inspector to identify which action you will be editing. Title can be whatever you'd like, while Icon follows the same rules outlined above. Custom Properties (JSON) allows you to change the metadata of the action via providing the box a Stringified Object. If this command is ran in quick succession, it will be queued in the Stream Deck software.| +{:class='table table-primary w-auto data-toggle='table'} + +#### SAMMI Triggers + +SAMMI offers a single "Elgato Stream Deck" trigger, which contains types you can pick to fire on. + +{% include alert.html text="Make sure you provide the Action ID from your Action's property inspector in the Stream Deck software! leave as a * to fire the button on any pressed Action." type="info" %} + +{% include alert.html text="If the action has updated fields via the 'Update Action' SAMMI command, this is the only way to visually see that information as it's not visible in the Action's Property Inspector." type="warning" %} + +| Trigger | Description | +|--------------------------|-------------| +| Pressed | Triggered whenever an Elgato Stream Deck action is pressed. | +| Released | Triggered whenever an Elgato Stream Deck action is released. | +{:class='table table-primary w-auto data-toggle='table'} + +| Pull Data Value | Explanation | +|-------|--------| +| Action ID | The Elgato Stream Deck action's ID. | +| Title | The Elgato Stream Deck action's title. | +| Icon | The Elgato Stream Deck action's displayed icon in whichever format you provided. | +| Custom Properties | An object containing the Elgato Stream Deck action's custom properties. | +{:class='table table-secondary' } \ No newline at end of file diff --git a/doc_posts/_integrations/mix_it_up.md b/doc_posts/_integrations/mix_it_up.md new file mode 100644 index 00000000..4decb900 --- /dev/null +++ b/doc_posts/_integrations/mix_it_up.md @@ -0,0 +1,21 @@ +--- +layout: default +title: Mix It Up +menu: Integrations +num: 6 +permalink: /integrations/mix-it-up +type: fullpage +version: 202322 +--- + +SAMMI can talk to [Mix It Up](https://mixitupapp.com/) via the following commands: + +- [Mix It Up: Get All Commands]({{ "commands/integrations#mixitupgetallcommands" | relative_url }}) +- [Mix It Up: Run Command]({{ "commands/integrations#mixitupruncommand" | relative_url }}) + +Please ensure the Mix It Up Developer API under services is enabled. + +{% include image.html w="75" src="mix_it_up_dev_api.png" alt="Mix It Up Developer API" %} + + + diff --git a/doc_posts/_integrations/obs.md b/doc_posts/_integrations/obs.md new file mode 100644 index 00000000..3cec7636 --- /dev/null +++ b/doc_posts/_integrations/obs.md @@ -0,0 +1,99 @@ +--- +layout: default +title: OBS Studio +menu: Integrations +num: 1 +permalink: /integrations/obs +type: fullpage +--- + +SAMMI interacts with OBS Studio through OBS Websocket (OBSWS), enabling remote control and event monitoring in OBS Studio. + +#### Install OBS Websocket + +SAMMI is compatible with OBS Websocket versions 5.0 and 4.9. However, we highly recommend using OBS Websocket 5.0 with OBS Studio versions 28 and 29, as it is the latest version. + +OBS Studio 28 and higher come with OBS Websocket 5.0 pre-installed, so there is no need to install it separately. + +While OBS Websocket 5.0 is preferred, there may be specific cases where OBS Websocket 4.9 is still needed, such as when using certain outdated plugins that have not yet been updated for compatibility with OBS Websocket 5.0. For users who need to maintain compatibility with OBS Websocket 4.9, OBS Studio 28 supports the installation of the OBS Websocket 4.9.1-compat plugin, which can be downloaded from the link below. + + + + + + + +
+ +#### Connect SAMMI to OBS Websocket +If you are using OBS Studio version 28 or higher, you do not need to install OBS Websocket 5.0 separately, as it is included with OBS. However, you may need to install the OBS Websocket 4.9.1-compat plugin if you want to use OBS Websocket 4.9, which may be required by some extensions. + +To connect SAMMI to OBS Websocket, follow these steps in SAMMI: + +1. Click on **OBS Connections** in the bottom menu. + {% include image.html w="75" src="obs_connection.png" alt="OBSWS settings in SAMMI and OBS must match" type="image" %} + +{:start="2"} +2. Enter the following information: + - `Name`: The name of your OBS instance. The first OBS instance will always be named "Main" and cannot be changed. + - `Protocol`: Select the protocol used by your OBS Websocket (OBSws4 or OBSws5). + - `IP`: The IP address of the OBS Websocket. Use `127.0.0.1` unless connecting to OBS on a different computer. + - `Port`: The port used by the OBS Websocket. It must match the port in OBS > Tools > Websocket Server Settings. Default ports are `4455` for OBSws5 and `4444` for OBSws4. We recommend keeping the default port. + - `Password`: The password for OBS Websocket authorization. Leave empty unless "Enable Authorization" is checked in OBS > Tools > OBS Websocket Settings. Passwords must match. + - `Auto Connect`: Check this option if you want SAMMI to automatically connect to OBS Websocket on launch. + - `Non-Blocking`: Keep this option checked unless you have trouble connecting to OBS Websocket. +3. Click **Connect**. The `OBS Main` indicator should turn from red to green in SAMMI. + +
+ +#### Connect SAMMI to Multiple OBS Websockets + +SAMMI can connect to multiple OBS Websockets. To add another connection, go to OBS Connections settings and add a new entry. + +For OBS commands, you must manually select the OBS Name (unless using the "Main" OBS connection) to specify which OBS instance to send commands to. OBS Name also accepts variable inserts. + +{% include image.html w="75" src="obs-manual-select.png" alt="Manually select OBS name for OBS commands" %} + +#### Control OBS from SAMMI + +You can remotely control OBS Studio using [SAMMI OBS commands]({{ "commands/obs-general" | relative_url }}). To do so: + +1. Go to an existing deck in SAMMI or click on `Add a new deck`. +2. Right-click on an empty grid and select `Create Button`. +3. Click on the icon and add your desired OBS command(s). Examples include: + + - Switch to previous scene + {% include image.html w="75" src="obs-switch-scenes.png" alt="Switch to previous scene" %} + - Change text in your Text (GDI+) source in OBS + {% include image.html w="75" src="obs-gdi-text.png" alt="Change text in your Text (GDI+) source" %} + - Change position of a source + {% include image.html w="75" src="obs-source-position.png" alt="Change source position" %} + +{:start="4"} +4. Click "Save" in the edit button screen and then click "Save" again in your deck. This step is crucial to save your button. +5. Press the button in your SAMMI Deck while connected to OBS to execute the command(s). + +{% include video.html w="75" src="obs-control.mp4" alt="Controlling OBS remotely from SAMMI" %} + +#### Permanent Variables + +Once connected to OBS Websocket, SAMMI provides useful permanent variables that you can use in your commands. All OBS variables are stored in the `global.[obsName]` object. If you're using only one OBS connection, your variables will always be stored in `global.Main`, for example `global.Main.connected`. + +{% include image.html w="75" src="obs_variables.png" alt="Variable window showing permanent OBS variables" %} + +| Variable | Explanation| +|-------|--------|-------- +{% include selectAll.html text="global.[obsName].connected" %} | Whether you're connected to your selected OBS Name, 1 = connected, 0 = not connected +{% include selectAll.html text="global.[obsName].current_scene" %} | Your selected OBS current scene +{% include selectAll.html text="global.[obsName].previous_scene" %} | Your selected OBS previous scene +{% include selectAll.html text="global.[obsName].type" %} | OBSws selected type in OBS Connections, either `OBSws4`, `OBSws5` or `Auto` +{% include selectAll.html text="global.[obsName].ip" %} | The IP address of the OBS connection +{% include selectAll.html text="global.[obsName].port" %} | The port of the OBS connection +{% include selectAll.html text="global.[obsName].obs_studio_version" %} | Current OBS studio version the OBSws is connected to +{% include selectAll.html text="global.[obsName].obs_websocket_version" %} | Current OBS Websocket version the OBSws is connected to +{:class='table table-secondary w-auto table-hover text-break' } + +#### Listen to OBS Events in SAMMI + +You can trigger buttons in SAMMI by listening to events in OBS Studio, such as switching to a new scene or enabling studio mode. A detailed guide for setting up OBS triggers can be found in the [Triggers-OBS]({{ "triggers/obs" | relative_url }}) section. +
\ No newline at end of file diff --git a/doc_posts/_integrations/pulsoid.md b/doc_posts/_integrations/pulsoid.md new file mode 100644 index 00000000..9b03660b --- /dev/null +++ b/doc_posts/_integrations/pulsoid.md @@ -0,0 +1,20 @@ +--- +layout: default +title: Pulsoid +menu: Integrations +num: 7 +permalink: /integrations/pulsoid +type: fullpage +version: 202330 +--- + +{% include alert.html text="This integration no longer exists, and is here for legacy purposes to those already using it." type="warning" %} + +#### Download + + +#### Install +Please refer to the installation instructions per the [Pulsoid for SAMMI](https://sammisolutions.itch.io/pulsoid) page on Itch.io. + + + diff --git a/doc_posts/_integrations-twitch/twitch.md b/doc_posts/_integrations/twitch.md similarity index 86% rename from doc_posts/_integrations-twitch/twitch.md rename to doc_posts/_integrations/twitch.md index b397afcc..ea8448f4 100644 --- a/doc_posts/_integrations-twitch/twitch.md +++ b/doc_posts/_integrations/twitch.md @@ -67,19 +67,17 @@ Enabling **custom scopes** for your Streamer account is possible while you're in All changes to scopes require you to revoke your token, relinking and reauthorising your Twitch account. **Remember to specify channel name when using Twitch: Chat message command**\ -If you've linked more than more Twitch account to SAMMI, you must specify the channel name in your [Twitch: Send Message]({{ "commands/twitch#sendchatmessage" | relative_url }}) command. Otherwise the message will be sent to your primary SAMMI account's channel (the one with `Join chat under this name` selected). NOTE: The channel name must be in all lowercase. Otherwise the message will not appear in chat until user refreshes their chat. +If you've linked more than more Twitch account to SAMMI, you must specify the channel name in your [Twitch: Send Chat Message]({{ "/commands/twitch-chat#sendchatmessage" | relative url}}) command. Otherwise the message will be sent to your primary SAMMI account's channel (the one with `Join chat under this name` selected). NOTE: The channel name must be in all lowercase. Otherwise the message will not appear in chat until user refreshes their chat. #### Listen to Twitch Events -Once you link your account(s), SAMMI automatically connects to Twitch PubSub and Twitch Chat (if you pressed Connect Twitch button) to listen to all selected Twitch events and Twitch chat.\ +Once you link your account(s), SAMMI automatically connects to Twitch EventSub and Twitch Chat.\ +Select which Twitch account you wish to listen to Twich events by checking 'Listen to Twitch events' in Twitch Connections window. Al levents are now automatically subscribed to and listened for. Learn more about all Twitch event triggers in our [Triggers-Twitch]({{ "triggers/twitch" | relative_url }}) section. #### Send Twitch chat messages -SAMMI can natively send Twitch chat messages, whispers and moderation commands (if the linked account has the permissions) to any Twitch chat channel by using [Twitch: Send Message]({{ "commands/twitch#sendchatmessage" | relative_url }}) command. +SAMMI can natively send Twitch chat messages, whispers and moderation commands (if the linked account has the permissions) to any Twitch chat channel by using [Twitch: Send Chat Message]({{ "/commands/twitch-chat#sendchatmessage" | relative url}}) command. See a list of all possible [Twitch chat mod commands](https://help.twitch.tv/s/article/chat-commands?language=en_US#AllMods). - -#### Other Twitch Commands -Navigate to our [Commands-Twitch]({{ "commands/twitch" | relative_url }}) section to see all possible Twitch commands. diff --git a/doc_posts/_integrations/voice_mod.md b/doc_posts/_integrations/voice_mod.md new file mode 100644 index 00000000..20cde20e --- /dev/null +++ b/doc_posts/_integrations/voice_mod.md @@ -0,0 +1,72 @@ +--- +layout: default +title: Voicemod +menu: Integrations +num: 4 +permalink: /integrations/voice-mod +type: fullpage +version: 202322 +--- + +{% include alert.html text="This integration no longer exists, and is here for legacy purposes to those already using it." type="warning" %} + +SAMMI integrates with Voicemod, a popular voice-changing software. This allows you to transform your voice during live streams, adding an element of surprise and fun for your viewers. + +#### Download + + +#### Install +You can follow the [Extension Install Guide](https://sammi.solutions/extensions/install) + +#### Bridge Interface + +The Bridge Interface provides information on the current settings of the Voicemod software. + +{% include image.html w="50" src="voicemod_bridge.png" alt="Voicemod Bridge Interface" %} + +| Feature | Description | +|----------------|------------------------------------------------| +| Status | Shows whether you're connected to Voicemod or not. | +| Voicechanger | Displays the current voice setting. | +| Background Effects | Indicates the status of background effects. | +| Hear My Voice | Shows if you can hear your own transformed voice. | +| Muted | Indicates if your voice is muted. | +| License Type | Displays the type of Voicemod license you have. | +| Voice ID | Shows the identifier for the current voice. | +{:class='table table-primary w-auto table-hover data-toggle='table'} + +#### Voicemod Commands + +The Voicemod extension comes with several commands to provide easy control over the software directly from SAMMI. + +{% include alert.html text="These commands needs some time to execute, we recommend to use Wait Until Variable Exists command." type="warning" %} + +| Command Name | Description | +|----------------------|------------------------------------------------------------| +| VM: Change to Specific Voice | Switch to a specific voice of your choice. | +| VM: Random Voice | Have SAMMI surprise you with a random voice selection. | +| VM: Reset Voice | Reset your voice to the default voice. | +| VM: Toggle Background Effects | Turn on or off any background effects. | +| VM: Toggle Hear My Voice | Control whether you can hear your own voice transformation. | +| VM: Toggle Mute | Mute or unmute your voice. | +| VM: Toggle Voice Changer | Enable or disable the voice changer feature. | +| VM: Get Voice Bitmap | Get the bitmap image for the selected voice. | +| VM: Prevent Bad Language | This command will mute/beep you out for x milliseconds (1000ms => 1s) | +{:class='table table-primary w-auto table-hover data-toggle='table'} + +
+ +#### Voicemod Triggers + +SAMMI has a trigger for Voicemod that activates when the voice changes. + +| Trigger Name | Description | +|-----------------|------------------------------------------------| +| Voicemod: Voice Changed | This is triggered whenever the voice is altered in any way. | +{:class='table table-primary w-auto table-hover data-toggle='table'} + +
+ +Now, with SAMMI's Voicemod extension, you can seamlessly integrate voice-changing features into your live streams, all with the click of a button. Happy streaming! + +
diff --git a/doc_posts/_integrations-youtube/youtube.md b/doc_posts/_integrations/youtube.md similarity index 81% rename from doc_posts/_integrations-youtube/youtube.md rename to doc_posts/_integrations/youtube.md index e8d34f9a..f26f41dc 100644 --- a/doc_posts/_integrations-youtube/youtube.md +++ b/doc_posts/_integrations/youtube.md @@ -22,7 +22,7 @@ Please consider [donating](https://sammi.solutions/donate) or supporting me on [ You must [Authorize the integration]({{ "integrations/youtube/auth" | relative_url }}) to allow SAMMI access to your YouTube Live account and to retrieve your refresh token. -{% include alert.html text="Keep your refresh token safe! If you accidentally share it with someone, you can revoke SAMMI's access in your Google account and authorize it again." type="warning" %} +{% include alert.html text="Keep your refresh token safe! If you accidentally share it with someone, you can go to the Google security settings page to revoke user access to SAMMI in your Google account and authorize it again." type="warning" %} 1. Retrieve your refresh token from the link provided above 2. In your SAMMI, go to **YouTube Connection** and paste your Refresh Token in the Refresh Token box. @@ -82,8 +82,15 @@ The failure to exercise or enforce any right or provision of the Terms of Servic #### Privacy Policy -SAMMI and its developer take your privacy very seriously. Any information you provide to us during the [Authorization process](https://sammi.solutions/docs/integrations/youtube/auth) will be only used to generate your YouTube Live credentials via our secure AWS API acting as a middleman to access the integration.\ -SAMMI does not store or share your YouTube Live credentials. Your credentials are only ever stored locally on your computer in SAMMI in order to use the integration.\ -Any other information regarding your YouTube account is only ever accesssed and stored locally on your computer. Accessing any data via YouTube API is done via Bridge, which is a local HTML file that relays the data via a local websocket connection to SAMMI, which also only ever runs locally.\ -Please see [Google Privacy Policy](https://policies.google.com/privacy), which services SAMMI uses. + +SAMMI and its developer prioritize your privacy and treat all personal data with utmost care. Any information you provide to us during the [Authorization process](https://sammi.solutions/docs/integrations/youtube/auth) is exclusively used to generate your YouTube Live credentials via our secure AWS API. This API acts as an intermediary to access the YouTube API services. + +Please note that SAMMI does not store or share your YouTube Live credentials. Your credentials are only ever stored locally on your computer, allowing SAMMI to use the integration. Additionally, any other information regarding your YouTube account is only ever accessed and stored locally on your computer. + +Accessing any data via YouTube API services is performed using Bridge, a local HTML file that relays the data via a local websocket connection to SAMMI. For your awareness, SAMMI only operates locally on your computer. + +We would also like to explicitly note that SAMMI uses YouTube API Services as a part of its functionality. For more information about how YouTube manages and protects your data, please see [Google Privacy Policy](https://policies.google.com/privacy), as it governs the use of YouTube API Services. + +Please be assured that we are committed to ensuring the privacy and security of your data at all times. + diff --git a/doc_posts/_triggers/general.md b/doc_posts/_triggers/general.md index 3aa74fef..bf4770e9 100644 --- a/doc_posts/_triggers/general.md +++ b/doc_posts/_triggers/general.md @@ -16,13 +16,37 @@ In your button commands, use [Trigger Pull Data]({{ "commands/trigger#triggerpul #### Trigger types +##### Gamepad +Trigger a button whenever you interact with a gamepad such as pressing and releasing digital features (buttons), or changing the value of an analog feature (triggers, sticks) + + +|Condition|Type|Explanation| +|--------|----|--------| +|Type | Dropdown | The type of feature you're interacting with. choices are `Digital`, or `Analog`.| +|Action | Dropdown | The action of the feature you're interacting with. If digital, your choices are `Pressed`, or `Released`. If analog, your choices are `Start` which will fire when the feature starts moving (for sticks this would be when moving in the x or y direction away from 0), `Change`, when the feature changes it's value at all, and `End`, when the feature returns back to it's default position (for sticks this would be when the x and y are at 0)| +|Target | Dropdown (Typeable) | The name of the feature that you're interacting with. Choose from the dropdown what feature you want to target, and make sure the section you pick from matches the type of feature you chose. Supports [Wildcards]({{ "triggers/introduction#wildcards" | relative_url }}).| +{:class='table table-primary' } + +{% include alert.html text="Due to an oversight, Horizontal, Vertical, and Value pull data values are missing from the Trigger Pull Data command's dropdown. please manually type in the field's box horizontal, vertical, or value for the time being." type="warning" %} + +| Pull Data Value | Data Type | Explanation | +|-------|------|--------| +| Action Type | String | The feature's type of action. values can be `pressed`, `released`, `start`, `change`, and `end`.| +|Horizontal| Number | The analog stick's horizontal position from `-1` to `1`. Negative means left, `0` means middle, positive means right. Only available when the feature type is analog, and the target used is a stick.| +|Vertical| Number | The analog stick's vertical position from `-1` to `1`. Negative means up, `0` means middle, positive means down. Only available when the feature type is analog, and the target used is a stick.| +|Value| Number |The analog trigger (as in gamepad feature)'s value from `0` to `1`. the more towards `1`, the more pressed down it is. Only available when the feature type is analog, and the target used is a trigger.| +| Pad Index | Number | The index associated to the gamepad that fired the trigger. Useful for separating out two different gamepad's interactions. Note, can change depending on the order in which gamepads are detected as connected. | +| Target | String | The name of the feature that fired the trigger. You can find the name of all gamepad feature targets in the Target field's dropdown list. | +| Type | String | The type of feature itself. values can be `digital` or `analog`. | +{:class='table table-secondary table-hover' } + ##### Hotkey Trigger a button when you press a specified hotkey.\ You can select a key and attach a modifier (or multiple modifier). -| Condition | Explanation | +| Condition | Type | Explanation | |-------|--------| | Key | Dropdown | Key press to listen to | Ctrl (optional) | Checkbox | Whether you want to attach Ctrl modifier, for example press CTRL+K. @@ -30,7 +54,7 @@ You can select a key and attach a modifier (or multiple modifier). | Shift (optional) | Checkbox | Whether you want to attach Shift modifier, i.e. press Shift+K. {:class='table table-primary' } -{% include alert.html text="Trigger Pull Data command doesn't let you check which key press triggered the button" type="warning" %} +{% include alert.html text="Trigger Pull Data command lets you check which key press triggered the button" type="info" %}
@@ -67,8 +91,9 @@ These triggers allows you to listen to SAMMI state and connection changes. |OBS Disconnected|Every time SAMMI disconnects from OBS. |SAMMI Bridge Connected| Every time SAMMI Bridge connects to SAMMI. |SAMMI Bridge Disconnected| Every time SAMMI Bridge disconnects from SAMMI. -|SAMMI Deck Connected| Every time SAMMI Deck connects to SAMMI. -|SAMMI Deck Disconnected| Every time SAMMI Deck disconnects from SAMMI. +|SAMMI Panel Connected| Every time SAMMI Panel connects to SAMMI. +|SAMMI Panel Disconnected| Every time SAMMI Panel disconnects from SAMMI. +|Deck Enabled/Disabled|Triggers every time a deck is enabled/disabled. |Third Party Connected| Third party application connects to SAMMI. |Third Party Disonnected| Third party application disconnects from SAMMI. {:class='table table-secondary table-hover' } diff --git a/doc_posts/_triggers/integrations.md b/doc_posts/_triggers/integrations.md new file mode 100644 index 00000000..28a484f2 --- /dev/null +++ b/doc_posts/_triggers/integrations.md @@ -0,0 +1,30 @@ +--- +layout: default +title: Integrations +menu: Triggers +num: 6 +type: fullpage +permalink: /triggers/integrations +version: 202322 +--- + +Following are all available integration triggers. + +#### Crowd Control + +| Trigger | Description | +|--------------------------|-------------| +| Effect Success | Triggered whenever an effect is successfully activated. | +| Effect Failure | Triggered whenever an effect fails to trigger. | +| Effect Request | Triggered whenever an effect is requested. This is always followed by either an Effect Success or an Effect Failure trigger. | +| Timed Effect Update | Triggered whenever a timed effect is updated, such as when the effect has started (begin), the game was paused (pause), or resumed (resume). | +{:class='table table-primary w-auto table-hover data-toggle='table'} + +#### Voicemod + +SAMMI has a trigger for Voicemod that activates when the voice changes. + +| Trigger Name | Description | +|-----------------|------------------------------------------------| +| Voicemod: Voice Changed | This is triggered whenever the voice is altered in any way. | +{:class='table table-primary w-auto table-hover data-toggle='table'} diff --git a/doc_posts/_triggers/introduction.md b/doc_posts/_triggers/introduction.md index 965832af..a9ef0bbc 100644 --- a/doc_posts/_triggers/introduction.md +++ b/doc_posts/_triggers/introduction.md @@ -30,7 +30,7 @@ If you right click on a button - **Edit Settings** and check `Allow Button Overl This is not something you want to enable for certain triggers attached to buttons controlling your OBS animations (for example, you probably don't want two subscriber animations to happen at the same time on your screen), but it can be useful for other events (for example for `!enter giveaway` chat trigger where a lot of users enter at the same time and you want to collect their names as quickly as possible without any queue). ##### Wild Cards -**Some trigger fields (such as Twitch chat messags trigger) accept wild cards.**\ +**Some trigger fields (such as a Twitch Chat Message trigger) accept wild cards.**\ For example, you want your user to type a color in your chat. Instead of creating separate triggers for ALL possible colors, you can create one trigger that will accept a wild card in place of the specific color. diff --git a/doc_posts/_triggers/obs.md b/doc_posts/_triggers/obs.md index e2426f03..aa0de94c 100644 --- a/doc_posts/_triggers/obs.md +++ b/doc_posts/_triggers/obs.md @@ -13,7 +13,7 @@ SAMMI can listen to all OBS events provided by OBS Websocket. 2. Click on the **+** button and select **OBS Trigger**. 3. Choose the **Update Type**. This is important depending on which OBS websocket version you are using. 4. Choose which OBS the trigger applies to (only if using multiple OBS) -5. Optionally you can right click on a button - **Edit Settings** and check `Add to Request Queue`, which acts as a button queue. If there is another trigger event while the button is still active, it will place is in the queue and reactivate the button as soon as it's ready again. +5. Optionally you can right click on a button - **Edit Settings** and check `Add to Request Queue`, which acts as a button queue. If there is another trigger event while the button is still active, it will place it in the queue and reactivate the button as soon as it's ready again.
#### Retrieve OBS trigger event values diff --git a/doc_posts/_triggers/twitch.md b/doc_posts/_triggers/twitch.md index 4935cf40..185b0a87 100644 --- a/doc_posts/_triggers/twitch.md +++ b/doc_posts/_triggers/twitch.md @@ -34,7 +34,8 @@ The message field comes with a prefilled `*`, which means it will allow ALL chat | Founder | Triggers only if the viewer has founders badge. | Message | Chat message to listen to. Must be an exact match. Can include **[Wild Cards](introduction#wildcards)**. | | Username | Triggers only if the viewer's username who sent the chat message matches the one in the box. Must be an exact match. Does NOT accept wild cards. Case insensitive. | -| Case Sensitive | If the user message trigger should be case sensitive +| Case Sensitive | If the user message trigger should be case sensitive. +| Only Trigger in own Chat | If the user message should only be triggered in your own chat and not in the shared chat. {:class='table table-primary' } {% include alert.html text="If two or more conditions are checked (such as Mod and Sub), all conditions must be met (user must be a mod and a subscriber). Create separate chat triggers for multiple conditions." type="warning" %} @@ -46,11 +47,33 @@ Message | Chat message to listen to. Must be an exact match. Can include **[Wild | Display Name | Viewer's display name (can contain uppercase characters). | | User ID | Viewer's user ID. | | Message | Viewer's message. | -| Emote List | Viewer's available emotes.
Basic format: `FirstEmoteID:FirstIndex-LastIndex/ SecondEmoteID:FirstIndex-LastIndex`
Message containing multiple emotes will be formatted such as: `FirstEmoteID:FirstIndex(1)-LastIndex(1),FirstIndex(2)-LastIndex(2),FirstIndex(3)-LastIndex(3)`
{% include image_collapse_table.html name="chat_emotes" src="chat_emotes.png" alt="Chat Emotes List" btn="Emotes Example" %}| +| Message ID | ID of the viewer's message | +| Emote List | List of emotes in the message.
Basic format: `FirstEmoteID:FirstIndex-LastIndex/ SecondEmoteID:FirstIndex-LastIndex`
Message containing multiple emotes will be formatted such as: `FirstEmoteID:FirstIndex(1)-LastIndex(1),FirstIndex(2)-LastIndex(2),FirstIndex(3)-LastIndex(3)`
{% include image_collapse_table.html name="chat_emotes" src="chat_emotes.png" alt="Chat Emotes List" btn="Emotes Example" %}| | Badge List | Basic format: `FirstBadgeName/version,SecondBadgeName/version`
For example: `broadcaster/1, subscriber/0`
[Global Badges List](https://badges.twitch.tv/v1/badges/global/display), [Channel Badges List](https://badges.twitch.tv/v1/badges/channels/CHANNEL_ID/display)
To find the badge ID in the JSON, look for BadgeList.badge_sets[`BADGENAME`].versions[`VERSION`].image_url_1x. The last part 1x can be changed to 2x, 3x or 4x for bigger size. | | Channel | Channel Name where the message originated from. Will return `w` if it's a whisper. | | Name Color | Chat name color in hexadecimal format. | +| Bits | The amount of bits cheered. (Does not include PowerUps) | +| Custom Reward ID | ID of the Reward that was redeemed. | +| Reply Parent User Login | User login of the sender of the parent message. | +| Reply Parent Display Name | User name of the sender of the parent message. | +| Reply Parent User ID | User ID of the sender of the parent message. | +| Reply Parent Message Body | The message body of the parent message. | +| Reply Parent Message Id | An ID that uniquely identifies the parent message that this message is replying to. | +| Reply Thread Parent Message ID | An ID that identifies the parent message of the reply thread. | +| Reply Thread Parent User Login | User ID of the sender of the thread’s parent message. | +| Room ID | An ID that identifies the chat room (channel). | +| Source ID | A UUID that identifies the source message from the channel the message was sent from. | +| Source Room ID | An ID that identifies the chat room (channel) the message was sent from. | +| Source Badges | Comma-seperated list of chat badges for the chatter in the room the message was sent from. This uses the same format as the badges list. | +| Source Badge Info | Contains metadata related to the chat badges in the source-badges tag. | +| Is Broadcaster | Whether the chatter is the broadcaster. 0 = not broadcaster, 1 = broadcaster | +| Is Mod | Whether the chatter is a mod. 0 = not mod, 1 = mod | +| Is VIP | Whether the chatter is a vip. 0 = not vip, 1 = vip | +| Is Founder | Whether the chatter is a Founder. 0 = not founder, 1 = founder | +| Is Subscriber | Whether the chatter is a subscriber. 0 = not subscriber, 1 = subscriber | +| Is Turbo | Whether the chatter is a turbo user. 0 = no turbo, 1 = has turbo | | First Time | Whether it's user's first chat message. 0 = not first, 1 = first | +| Unix Timestamp | The timestamp when the message was sent, in Unix format. | | From Channel ID | Which channel the trigger came from. | {:class='table table-secondary table-hover' } @@ -79,7 +102,7 @@ Triggers for any new received whisper messages. Must use [Twitch Open Whispers]( | Recipient Color | Color of the user who received the whisper | | Message | Received message. | | Sent | Sent message | -| Emote List | Sender's available emotes.
Basic format: `FirstEmoteID:FirstIndex-LastIndex/ SecondEmoteID:FirstIndex-LastIndex`
Message containing multiple emotes will be formatted such as: `FirstEmoteID:FirstIndex(1)-LastIndex(1),FirstIndex(2)-LastIndex(2),FirstIndex(3)-LastIndex(3)`
{% include image_collapse_table.html name="chat_emotes" src="chat_emotes.png" alt="Chat Emotes List" btn="Emotes Example" %}| +| Emote List | List of emotes in the message.
Basic format: `FirstEmoteID:FirstIndex-LastIndex/ SecondEmoteID:FirstIndex-LastIndex`
Message containing multiple emotes will be formatted such as: `FirstEmoteID:FirstIndex(1)-LastIndex(1),FirstIndex(2)-LastIndex(2),FirstIndex(3)-LastIndex(3)`
{% include image_collapse_table.html name="chat_emotes" src="chat_emotes.png" alt="Chat Emotes List" btn="Emotes Example" %}| | Badge List | Basic format: `FirstBadgeName/version,SecondBadgeName/version`
For example: `broadcaster/1, subscriber/0`
[Global Badges List](https://badges.twitch.tv/v1/badges/global/display), [Channel Badges List](https://badges.twitch.tv/v1/badges/channels/CHANNEL_ID/display)
To find the badge ID in the JSON, look for BadgeList.badge_sets[`BADGENAME`].versions[`VERSION`].image_url_1x. The last part 1x can be changed to 2x, 3x or 4x for bigger size. | {:class='table table-secondary table-hover' } @@ -202,24 +225,6 @@ Listens to all raid events in your stream.
-##### Host -Listens to all host events in your stream. Twitch does not send alerts for host events with less than three viewers. - -| Condition | Explanation | -|-------|--------| -| Minimum | Specify the minimum amount of host's viewers to trigger the button. | -| Maximum | Specify the maximum amount of host's viewers to trigger the button. | -{:class='table table-primary' } - -| Pull Data Value | Explanation | -|-------|--------| -| Display Name | Host's display name. | -| Amount | Amount of host's viewers. | -| From Channel ID | Which channel the trigger came from. | -{:class='table table-secondary table-hover' } - -
- ##### Channel Points Listens to all custom channel points redeems. @@ -229,10 +234,10 @@ In order for SAMMI to listen to Channel Point triggers, make sure the scope to l |-------|--------| | Redemption Name | Select the name of the redemption from the list or type in manually. A single `*` allows all redeems to trigger the button (does not act as a wildcard). | | Username | Triggers only if the viewer's username who redeemed it matches the one in the box. Must be an exact match. Does NOT accept wild cards. Case insensitive. | -| User Input Required | Whether the particular redemption requires viewers to enter text when redeemed -| Case Sensitive | If the user message trigger should be case sensitive -|User Input | User input if the redemption requires requires viewers to enter text when redeemed (use `*` to accept all user messages). Can include **[Wild Cards](introduction#wildcards)**. -| Allow Empty Wildcard | Check to allow empty strings as valid results +| User Input Required | Whether the particular redemption requires viewers to enter text when redeemed | +| Case Sensitive | If the user message trigger should be case sensitive | +| User Input | User input if the redemption requires requires viewers to enter text when redeemed (use `*` to accept all user messages). Can include **[Wild Cards](introduction#wildcards)**. | +| Allow Empty Wildcard | Check to allow empty strings as valid results | {:class='table table-primary' } | Pull Data Value | Explanation | @@ -261,15 +266,15 @@ Triggers for all prediction events. | Pull Data Value | Explanation | |-------|--------| -|Duration|Duration of the prediction -|Event| -|Prediction Name|Name of the prediction -|Prediction ID|Prediction unique ID -|Vote Total|Total prediction votes -|Outcome 1 Info|An object containing prediction's outcome 1 information -|Outcome 2 Info|An object containing prediction's outcome 2 information -|Outcome x Info| An object containing prediction's outcome x information, up to 10 -|Winning Outcome|Winning outcome +| Duration | Duration of the prediction | +| Event | | +| Prediction Name | Name of the prediction | +| Prediction ID | Prediction unique ID | +| Vote Total | Total prediction votes | +| Outcome 1 Info | An object containing prediction's outcome 1 information | +| Outcome 2 Info | An object containing prediction's outcome 2 information | +| Outcome x Info | An object containing prediction's outcome x information, up to 10 | +| Winning Outcome | Winning outcome | | From Channel ID | Which channel the trigger came from. | {:class='table table-secondary table-hover' } @@ -280,25 +285,25 @@ Triggers for all poll events. | Condition | Explanation | |-------|--------| -|Type | Type of the poll event to trigger the button
**Created** = when a new poll is created
**Voted** = when a current poll receives a new vote,
**Ended** = when a current poll ends and no more votes are accepted,
**Archived** - when a current poll is archived (and disappears from Twitch chat) +| Type | Type of the poll event to trigger the button
**Created** = when a new poll is created
**Voted** = when a current poll receives a new vote,
**Ended** = when a current poll ends and no more votes are accepted,
**Archived** - when a current poll is archived (and disappears from Twitch chat) | {:class='table table-primary' } | Pull Data Value | Explanation | |-------|--------| -|Choice Amount|Number of poll choices -|Duration|Duration of the poll -|Poll Name|Name of the poll -|Poll ID|Poll unique ID -|Vote Total|Total poll votes -|Vote Total Base|Total base poll votes (no bits or points used) -|Vote Total Bits|Total bits poll votes -|Vote Total Points|Total channel points poll votes -|Top Vote List|Array of the poll's current choice rankings -|Choice 1 Info|An object containing poll's Choice 1 information -|Choice 2 Info|An object containing poll's Choice 2 information -|Choice 3 Info|An object containing poll's Choice 3 information -|Choice 4 Info|An object containing poll's Choice 4 information -|Choice 5 Info|An object containing poll's Choice 5 information +| Choice Amount | Number of poll choices | +| Duration | Duration of the poll | +| Poll Name | Name of the poll | +| Poll ID | Poll unique ID | +| Vote Total | Total poll votes | +| Vote Total Base | Total base poll votes (no bits or points used) | +| Vote Total Bits | Total bits poll votes | +| Vote Total Points | Total channel points poll votes | +| Top Vote List | Array of the poll's current choice rankings | +| Choice 1 Info | An object containing poll's Choice 1 information | +| Choice 2 Info | An object containing poll's Choice 2 information | +| Choice 3 Info | An object containing poll's Choice 3 information | +| Choice 4 Info | An object containing poll's Choice 4 information | +| Choice 5 Info | An object containing poll's Choice 5 information | | From Channel ID | Which channel the trigger came from. | {:class='table table-secondary table-hover' } @@ -309,13 +314,13 @@ Triggers for all new hype train events. | Condition | Explanation | |-------|--------| -|Approaching| Triggers when a hype train is approaching -|Started| Triggers when a hype train has started -|Conductor Update|Triggers when a hype train conductor is assigned -|Level Up|Triggers when the hype train levels up -|Ended|Triggers when a hype train has ended -|Cooldown expired| Triggers when a previous hype train's cooldown has expired -|Progressed| Triggers when an event progresses the hype train level| +| Started | Triggers when a hype train has started | +| Progressed | Triggers when an event progresses the hype train level | +| Ended | Triggers when a hype train has ended | +| Approaching `DEPRECATED` | Triggers when a hype train is approaching | +| Conductor Update `DEPRECATED` | Triggers when a hype train conductor is assigned | +| Level Up `DEPRECATED` | Triggers when the hype train levels up | +| Cooldown expired `DEPRECATED` | Triggers when a previous hype train's cooldown has expired | {:class='table table-primary' }
@@ -335,12 +340,51 @@ Triggers when the /shoutout command is used. The channel must be live and stream | Pull Data Value | Explanation | |-------|--------| -|User Name|User name of the person being shouted out. -|Display Name|Display name of the person being shouted out. -|User ID|User ID of the person being shouted out. -|Picture URL|URL of the profile picture of the person being shouted out. -|ID|Shoutout ID -|Name Color|Hex code colour of the name of the person being shouted out. -|Recent Categories|Recent categories streamed by the person being shouted out. -|From Channel ID|Channel ID of the channel making the shoutout. +| User Name | User name of the person being shouted out. | +| Display Name | Display name of the person being shouted out. | +| User ID | User ID of the person being shouted out. | +| Picture URL | URL of the profile picture of the person being shouted out. | +| ID | Shoutout ID | +| Name Color | Hex code colour of the name of the person being shouted out. | +| Recent Categories | Recent categories streamed by the person being shouted out. | +| From Channel ID | Channel ID of the channel making the shoutout. | +{:class='table table-secondary table-hover' } + +
+ +##### Twitch Automatic Reward Redemption +Triggers when any automatic reward is redeemed, for example "Gigantify an Emote" or "Unlock a Random Sub Emote". + +{% include alert.html text="Cost does not show Bit cost. It only shows the amount of channel points something cost." type="warning" %} +{% include alert.html text="If user redeems Gigantify Emote the emote the user Gigantified will be the last index in the array." type="info" %} + +| Pull Data Value | Explanation | +|-------|--------| +| User Name | Viewers username. | +| Display Name | Viewer's display name. | +| User ID | Viewer's user ID. | +| Cost | Reward cost. | +| Message | Viewer's message if required. | +| Emotes | Array of objects with the Emote IDs within the message. | +| Type | Redemption Type. Returns message_effect, gigantify_an_emote, celebration, send_highlighted_message, random_sub_emote_unlock, single_message_bypass_sub_mode, chosen_sub_emote_unlock or chosen_modified_sub_emote_unlock | +| Unlocked Emote | Returns an Object with the ID and Name of the unlocked emote | +| Redeemed At | The time in twitch format, that the item was redeemed | +| Reward ID | Reward's general ID. | +| Redeem ID | Redeem's specific ID. | +| Channel ID | Which channel the trigger came from. | +| From Channel ID | Which channel the trigger came from. | +{:class='table table-secondary table-hover' } + +
+ +##### Twitch Custom EventSub Subscription +Triggers when any custom EventSub subscription event is fired. + +{% include alert.html text="You need to use the Twtich: Create EventSub Subscription command in order to subscribe to custom events." type="warning" %} + +| Pull Data Value | Explanation | +|-------|--------| +| All | The raw parsed payload from Twitch. This will be different per EventSub subscription, so please check the Twitch documentation for the payload structure. | +| Subscription Type | The name of the subscription that triggered the button. | +| Trigger Type | The SAMMI trigger type. | {:class='table table-secondary table-hover' } diff --git a/doc_posts/_triggers/voice.md b/doc_posts/_triggers/voice.md new file mode 100644 index 00000000..2d77a88f --- /dev/null +++ b/doc_posts/_triggers/voice.md @@ -0,0 +1,16 @@ +--- +layout: default +title: SAMMI Voice +menu: Triggers +num: 5 +type: fullpage +permalink: /triggers/voice +version: 202320 +--- +SAMMI can listen to all SAMMI Voice triggers. + +To add a SAMMI Voice trigger, you will first have to set a trigger in the SAMMI Voice component. Please see our [set up page](https://sammi.solutions/docs/voice#addatriggertosammivoiceandasammicorebutton) for more information. + +Once you have identified the triggers you want in SAMMI Voice, you can set up the 'SAMMI Voice' trigger in your button. + +Ensure the spelling is identical in both SAMMI Voice and in your SAMMI button trigger. diff --git a/doc_posts/_troubleshooting-bugs/X copy.md b/doc_posts/_troubleshooting-bugs/X copy.md deleted file mode 100644 index 74709756..00000000 --- a/doc_posts/_troubleshooting-bugs/X copy.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -title: Coming soon! -num: 0 ---- - -Stickbugs\ -Spiders\ -Praying Mantis\ -Goliaths\ -Ants\ -Centipedes\ -Beetles diff --git a/doc_posts/_troubleshooting-buttons/button-crashes.md b/doc_posts/_troubleshooting-buttons/button-crashes.md index 9a62365f..b59b7117 100644 --- a/doc_posts/_troubleshooting-buttons/button-crashes.md +++ b/doc_posts/_troubleshooting-buttons/button-crashes.md @@ -5,6 +5,6 @@ num: 2 SAMMI's crash screen will show you which button and command caused the crash: -{% include image.html w="75" src="https://i.imgur.com/3lmSCMi.png" alt="Crash error example" external="true" %} +{% include image.html w="75" src="btnCrash.png" alt="Crash error example" %} The crash log tells you which command crashed SAMMI, but be aware that the error could have been made in a command that executed earlier! Use that information (and what the actual error says) to troubleshoot using the tips in the next section. diff --git a/doc_posts/_troubleshooting-buttons/button-does-nothing.md b/doc_posts/_troubleshooting-buttons/button-does-nothing.md index 21cad72b..82940ba0 100644 --- a/doc_posts/_troubleshooting-buttons/button-does-nothing.md +++ b/doc_posts/_troubleshooting-buttons/button-does-nothing.md @@ -42,7 +42,7 @@ Your button not triggering at all could have three causes: either your button's |OBS trigger | If you can’t connect or it disconnects every time, check Common Issues in Troubleshooting. | {:class='table table-primary' } -{% include image.html w="100" src="https://i.imgur.com/X8pE68j.png" alt="Communication between Twitch and SAMMI" type="image" external="true" %} +{% include image.html w="100" src="btnDoNothing.png" alt="Communication between Twitch and SAMMI" type="image" %} *Check whether the button is being blocked* diff --git a/doc_posts/_troubleshooting-common/crashes-launch.md b/doc_posts/_troubleshooting-common/crashes-launch.md index 804a773a..aeae781c 100644 --- a/doc_posts/_troubleshooting-common/crashes-launch.md +++ b/doc_posts/_troubleshooting-common/crashes-launch.md @@ -1,5 +1,5 @@ --- -title: Crashes On Launch/SAMMI Core Doesn't Start +title: "Launch Issues: SAMMI Core Fails to Start" num: 1 --- @@ -13,10 +13,6 @@ Make a backup of your `decks_data.json` file, then rename `decks_data_old.json` **Faulty sound drivers**\ You can try [reinstalling your sound drivers](https://support.microsoft.com/en-us/windows/fix-sound-problems-in-windows-10-73025246-b61c-40fb-671a-2535c7cd56c8). -**Incompatible versions between SAMMI Core and SAMMI Deck**\ -You may have a newer version of the SAMMI Deck compared to SAMMI. Close all connections to SAMMI (OBS, SAMMI Deck) and restart SAMMI, then update it to the latest version.\ -If the crash persists, you can also save the 'json' folder in your SAMMI folder to a different location, then delete the folder. Restart (or download a new copy of) SAMMI, then update your SAMMI to the latest version. After doing so and verifying that it no longer crashes, copy the json back into your SAMMI folder. - **Run SAMMI Core in Compatibility Mode**\ You can try right-clicking the `Sammi Core.exe` file and selecting 'Troubleshoot'. You can also select the option to run `SAMMI Core.exe` in Windows 8 Compatibilty mode. diff --git a/doc_posts/_troubleshooting-common/deck-app-errors.md b/doc_posts/_troubleshooting-common/deck-app-errors.md new file mode 100644 index 00000000..b4179e33 --- /dev/null +++ b/doc_posts/_troubleshooting-common/deck-app-errors.md @@ -0,0 +1,37 @@ +--- +title: Deck App Connection +num: 6 +--- + +### Deck Hopper +Please see Troubleshooting section on [Deck Hopper's official website](https://christinak.ca/deckhopper/troubleshooting). + +### SAMMI Panel +If you click 'Connect' in your SAMMI Panel and nothing happens, this indicates that a successful connection to SAMMI Core has not been established. The following are potential reasons for the lack of connection and their respective solutions: + +- **Outdated SAMMI Panel**\ +Ensure that you are using the most recent version of SAMMI Panel. + +- **Incorrect IP/Port or Password**\ +The IP address should always be set to `127.0.0.1` unless you are using SAMMI Panel on a different device from where SAMMI Core is running. In such cases, navigate to SAMMI > SAMMI Panel > Get LAN IP to copy your local IP address to your clipboard, and use this IP address instead. It will be in the format `192.168.X.X`. +Verify that the Port and Password entered in SAMMI Panel match the Port and Password in your SAMMI Settings. The default port is `9470`. + +- **Accessing SAMMI Panel (Web) over HTTPS**\ +SAMMI Panel will not connect to SAMMI Core if you access `http://sammipanel.solutions/` over HTTPS and the IP address you are attempting to connect with is not `127.0.0.1` (e.g., if you are using SAMMI Panel on a different device over a local network). + +- **Firewall Interference**\ +Check that your firewall is not preventing SAMMI Panel from connecting.\ +Consider [temporarily disabling your antivirus/firewall](https://support.microsoft.com/en-us/windows/turn-off-defender-antivirus-protection-in-windows-security-99e6004f-c54c-8509-773c-a4d776b77960) or [adding an exception](https://support.microsoft.com/en-us/windows/add-an-exclusion-to-windows-security-811816c0-4dfd-af4a-47e4-c301afe13b26) to allow SAMMI Panel through. + +- **Antivirus or Security Software Interference**\ +Some antivirus or security software may have additional features (beyond the firewall) that could block or interfere with the connection between SAMMI Panel and SAMMI Core. You may need to adjust the settings of their security software to allow the connection. + +- **Non Local Network**\ +Ensure that the device running SAMMI Core is on the same local network as the device running SAMMI Panel.\ +If you are using a VPN, you may need to disable VPN settings. + +- **Running Multiple Instances**\ +Running multiple instances of SAMMI Core or SAMMI Panel on the same device or network could lead to conflicts and prevent a successful connection. Ensure that only one instance of each is running. + +- **Port Conflicts**\ +If the default port used by SAMMI (e.g., 9470) is already in use by another application, it could prevent SAMMI Panel from connecting to SAMMI Core. You may need to change the port number to an available port by opening `settings.ini` file located in SAMMI Folder and adding the following under [Settings] section: `panel_port = "XXXX"` diff --git a/doc_posts/_troubleshooting-common/dll-functions-not-working.md b/doc_posts/_troubleshooting-common/dll-functions-not-working.md new file mode 100644 index 00000000..97c431f3 --- /dev/null +++ b/doc_posts/_troubleshooting-common/dll-functions-not-working.md @@ -0,0 +1,20 @@ +--- +title: "DLL Functions Don't Work" +num: 6 +--- +The SAMMI DLL relates to the following SAMMI functions: +- Minimizing to Tray +- Command Line Command +- Get LAN IP +- Auto-boot after a restart +- Bubble notifications + +If the above functions are not working as expected, it is most likely that your machine is missing some dependencies.\ +Users might be missing the following dependencies on fresh Windows 10: +- VCRUNTIME140_1.dll +- VCRUNTIME140.dll +- MSVCP140.dll + +This problem can be fixed by installing the Visual C++ Redistributable from [here](https://aka.ms/vs/16/release/vc_redist.x64.exe). + + diff --git a/doc_posts/_troubleshooting-common/extensions-missing.md b/doc_posts/_troubleshooting-common/extensions-missing.md new file mode 100644 index 00000000..72303b78 --- /dev/null +++ b/doc_posts/_troubleshooting-common/extensions-missing.md @@ -0,0 +1,20 @@ +--- +title: "Extensions missing after updating" +num: 3 +--- + +**Bridge was not properly migrated from Transmitter**\ +In certain situations, you may find that some of your installed extensions remain in the `transmitter/Extensions/installed` directory. However, when updating a bridge to a newer version, SAMMI only attempts to reinstall extensions located in the `bridge/Extensions/installed` directory. To address this issue, please follow the steps outlined below: + +1. Verify that your chosen bridge is no longer in the `transmitter` directory. To do this, navigate to SAMMI Core > Bridge > Select a Bridge. If the bridge is still in the `transmitter` directory, either select a different bridge file or copy `bridge.html` from the `transmitter` directory to the `bridge` directory and select that one. +2. Transfer all extension files from the `transmitter/Extensions/installed` directory to the `bridge/Extensions/installed` directory. +3. In SAMMI Core, navigate to Bridge > Install all extensions from folder. From there, go to the `bridge/Extensions/installed` directory and select any extension file. It's recommended to press 'No' to force reinstall extensions and manually select whether you wish to replace your Deck for each extension. +4. Wait for the reinstallation process to complete for all of your extensions +5. Once the reinstallation is complete, delete the `transmitter` directory. + +**I do not have Transmitter folder**\ +A bug was identified in the SAMMI Updater, which may result in missing extensions if you update or revert your bridge while using an older version of the updater. To address this issue, please follow the steps below: + +1. Open SAMMI Core and navigate to Bridge > Install all extensions from folder. Proceed to the `bridge/Extensions/installed` directory and select any extension file. It's recommended to press 'No' to force reinstall extensions and manually select whether you wish to replace your Deck for each extension. +2. Allow time for the reinstallation process to finish for all of your extensions. +3. To ensure you have the latest bug fixes, download the [latest SAMMI Updater version](https://github.com/SAMMISolutions/SAMMI-Official/raw/main/download/SAMMI%20Updater.zip) and use it to replace your current SAMMI Updater. diff --git a/doc_posts/_troubleshooting-common/not-updating.md b/doc_posts/_troubleshooting-common/not-updating.md new file mode 100644 index 00000000..4371d9de --- /dev/null +++ b/doc_posts/_troubleshooting-common/not-updating.md @@ -0,0 +1,13 @@ +--- +title: "Update Problems: Missing SAMMI Updater" +num: 2 +--- +Occasionally, when updating from earlier versions of SAMMI, you may encounter an issue where the SAMMI Updater fails to download correctly. + +If this happens, you can manually download the SAMMI Updater from the [SAMMI Github repository](https://github.com/SAMMISolutions/SAMMI-Official/raw/main/download/SAMMI%20Updater.zip). + +Once downloaded, move the complete SAMMI Updater folder into the directory where SAMMI is installed, and then launch SAMMI Updater.exe to perform the update. The steps for doing so are illustrated in the video provided below. + +{% include video.html w="100" src="manual_update.mp4" alt="Manually Updating SAMMI" %} + + diff --git a/doc_posts/_troubleshooting-common/obs-connection.md b/doc_posts/_troubleshooting-common/obs-connection.md index b8a6cb4e..fb6f8ac0 100644 --- a/doc_posts/_troubleshooting-common/obs-connection.md +++ b/doc_posts/_troubleshooting-common/obs-connection.md @@ -1,46 +1,27 @@ --- title: OBS Connection -num: 0 +num: 4 --- -To connect to and control OBS, SAMMI uses an add-on called the OBS WebSocket. +To connect and control OBS, SAMMI uses the OBS WebSocket add-on. If you encounter issues connecting SAMMI to OBS Websockets, try the following troubleshooting steps: -You can find a link to the latest compatible version of the WebSocket in the [Step-by-step Tutorial](https://sammi.solutions/docs/getting-started/step-by-step). +- **OBS Studio 28 (and up) and OBS Websockets**: We highly recommend using OBS Studio 28 or 29 with OBS Websocket 5.0, as this is the latest and preferred version. OBS Studio 28 and higher include OBS Websocket 5.0 by default, so no separate installation is needed. +However, there may be specific cases where OBS Websocket 4.9 is still required, such as when using certain outdated plugins that have not been updated for compatibility with OBS Websocket 5.0. In such cases, you can install the [OBS Websocket 4.9.1-compat plugin](https://github.com/obsproject/obs-websocket/releases) and create a new OBS instance in SAMMI to use OBS Websocket 4.9.1. Specify the OBS Websocket protocol for each command. -Try these steps to troubleshoot the connection between SAMMI and OBS WebSockets: +- **Run as Administrator**: Try launching SAMMI as an administrator by right-clicking the SAMMI Core.exe launch file and selecting `Run as administrator`. -- **OBS Studio 28 and OBS Websockets**\ -If you have just downloaded OBS Studio 28, it comes bundled with OBS Websocket 5.0. This means that if you are running SAMMI using the OBS Websocket 4.9.1 protocol, you will not be able to connect to OBS. +- **Check Firewall and Antivirus**: Ensure your firewall and antivirus software are not blocking SAMMI. Consider [temporarily disabling your antivirus/firewall](https://support.microsoft.com/en-us/windows/turn-off-defender-antivirus-protection-in-windows-security-99e6004f-c54c-8509-773c-a4d776b77960) or [adding an exception](https://support.microsoft.com/en-us/windows/add-an-exclusion-to-windows-security-811816c0-4dfd-af4a-47e4-c301afe13b26) for SAMMI. -Instead, you will either have to: -1. Switch to the OBS Websocket 5.0 protocol in SAMMI and make the necessary changes to your Fetch OBS Data, Custom Packet and Send OBS Requests to reflect the correct OBS Websocket 5.0 protocol syntax and change your OBS Triggers, OR -2. Download the OBS Websocket 4.9.1-compat plugin [HERE](https://github.com/obsproject/obs-websocket/releases), and create a new OBS instance in SAMMI to run the OBS Websocket 4.9.1 protocol. All your commands will have to specify which OBS Websocket protocol you want SAMMI to use. +- **Verify Password Settings**: Ensure the password in OBS > Tools > OBS Websocket Settings matches the password in SAMMI > OBS Connections. Leave the password field empty if "Enable Authentication" is unchecked. -{% include alert.html text="It is important to check in Tools > Websocket Server Settings that the OBS Websocket server is Enabled, and is running with the correct ports." type="warning" %} +- **Verify Port Settings**: Ensure the port in OBS > Tools > OBS Websocket Settings matches the port in SAMMI > OBS Connections. Default ports are `4444` for WebSockets 4.x.x and `4455` for WebSockets 5.x.x. Use a different port from the one used in Bridge settings. -- **Run as administrator**\ -Try running SAMMI as an administrator. Right click on the SAMMI launch file and select `Run as administrator`. +- **Try Non-Blocking Connection**: In SAMMI, go to OBS Connections and check or uncheck "Non-Blocking." -- **Check your firewall and antivirus**\ -Make sure your firewall is not blocking SAMMI.\ -You can try [temporarily disabling your antivirus/firewall](https://support.microsoft.com/en-us/windows/turn-off-defender-antivirus-protection-in-windows-security-99e6004f-c54c-8509-773c-a4d776b77960) or [adding an exception](https://support.microsoft.com/en-us/windows/add-an-exclusion-to-windows-security-811816c0-4dfd-af4a-47e4-c301afe13b26) to allow the app through. +- **Change IP Connection**: Try using your local IP address instead of `127.0.0.1`. Find your IPv4 address using the `ipconfig` command and enter it in SAMMI > OBS Connections. -- **Verify password settings**\ -The password you enter in OBS > Tools > OBS Websocket Settings must match the password you enter in SAMMI > OBS Connections. If you do not use a password, uncheck Enable authentication. +- **Test Connection with Other Tools**: Use tools like the [Simple Websocket Client](https://chrome.google.com/webstore/detail/simple-websocket-client/pfdhoblngboilpfeibdedpjgfnlcodoo) Chrome extension to test if you can establish a connection to OBS Websocket. -- **Verify ports settings**\ -The port entered in OBS > Tools > OBS Websocket Settings must match the port in SAMMI > OBS Connections.\ -The default port for WebSockets 4.x.x is 4444. The default for WebSockets 5.x.x is 4455.\ -Note that this port MUST be different from the port number used in your Bridge settings. +Remember to check the OBS Websocket server settings in OBS Studio (Tools > Websocket Server Settings) to ensure that the server is enabled and running with the correct ports. -- **Try Non-Blocking Connection**\ -In SAMMI, go to OBS Connections and check/uncheck "Non-Blocking". - -- **Change IP connection**\ -Normally you will use 127.0.0.1 to connect to OBS, but you can try local IP as well: -1. Launch command line (cmd.exe) and run `ipconfig` command. -2. Note down your IPv4 address (it will start with `192.168`). -3. Go to SAMMI > OBS Connections and change the IP address. - -- **Try connecting using other means**\ -You can try a chrome extension [Simple Websocket Client](https://chrome.google.com/webstore/detail/simple-websocket-client/pfdhoblngboilpfeibdedpjgfnlcodoo) to check if you can make a connection in the first place. +If you continue to experience issues connecting SAMMI to OBS Websocket, please reach out to us via the official [SAMMI Discord server](https://discord.sammi.solutions). \ No newline at end of file diff --git a/doc_posts/_troubleshooting-common/streamdeck-crashes.md b/doc_posts/_troubleshooting-common/streamdeck-crashes.md deleted file mode 100644 index 1fb1e395..00000000 --- a/doc_posts/_troubleshooting-common/streamdeck-crashes.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -title: SAMMI Deck -num: 0 ---- - -If you press 'Connect' in your SAMMI Deck and nothing happens (you only see the progress icon), it means it hasn't established a successful connection to SAMMI Core. - -- **Outdated SAMMI Deck**\ -Make sure you're using the latest version of SAMMI Deck. - -- **Mismatched port/password settings**\ -Confirm that the Port and Password entered there match the Port and Password in your SAMMI Deck connection settings. The default port is 9425.\ -Please note that these settings are separate from those used by OBS WebSockets, and must use a different port number. - -- **Blocked by firewall**\ -Make sure your firewall is not blocking SAMMI.\ -You can try [temporarily disabling your antivirus/firewall](https://support.microsoft.com/en-us/windows/turn-off-defender-antivirus-protection-in-windows-security-99e6004f-c54c-8509-773c-a4d776b77960) or [adding an exception](https://support.microsoft.com/en-us/windows/add-an-exclusion-to-windows-security-811816c0-4dfd-af4a-47e4-c301afe13b26) to allow the app through. - -- **Unable to connect to the Android App**\ -Make sure your firewalls/antivirus has whitelisted the app.\ -Make sure both your PC and your mobile device is on the **same network**.\ -VPNs do not work well with the mobile app, so make sure you have disabled your VPN settings.\ diff --git a/doc_posts/_troubleshooting-common/twitch-connection.md b/doc_posts/_troubleshooting-common/twitch-connection.md index cda9e779..ae2d7c70 100644 --- a/doc_posts/_troubleshooting-common/twitch-connection.md +++ b/doc_posts/_troubleshooting-common/twitch-connection.md @@ -1,21 +1,84 @@ --- title: Twitch Connection -num: 0 +num: 5 --- -#### Getting an ERR_BADAUTH error +#### Resolving ERR_BADAUTH Error -Your auth token probably expired. -1. In SAMMI Core, go to Twitch Connections. Click "Revoke Token" for the problem account. -2. Link your Twitch account again by pressing `Link Streamer Account` or `Link Bot Account` button. +If you encounter an ERR_BADAUTH error, your authentication token may have expired. Follow these steps to resolve the issue: +1. In SAMMI Core, navigate to Twitch Connections and click "Revoke Token" for the affected account. +2. Re-link your Twitch account by clicking the `Link Streamer Account` or `Link Bot Account` button. -#### Twitch Alerts don't work +#### Resolving Issues with Twitch Alerts -**Check your Twitch Pubsub/Chat connection**\ -Make sure your Twitch Pubsub and Chat is connected (the light indicator must be green for both) and you're listening to the right topics (you can check them under Twitch Connections). +If Twitch Alerts are not working as expected, consider the following troubleshooting steps: + +**Verify Your Twitch Pubsub/Chat Connection**\ +Ensure that both your Twitch Pubsub and Chat are connected (indicated by green light indicators) and that you are listening to the correct topics (which can be verified under Twitch Connections). {% include image.html w="75" src="twitch_connected.png" alt="Twitch Connected" %} +**Test Alerts from Your Bridge**\ +In your Bridge, go to the Twitch Triggers tab and click any of the test buttons. A small yellow notification should appear in the bottom-left corner of SAMMI Core. Based on the results, consider the following: +- *No notification appears* - Your Bridge may not be connected to SAMMI. Check for incorrect Bridge versions or duplicate instances. +- *Notification appears, but buttons don't trigger* - Review your button triggers and follow the guide in the Triggers section. +- *Notification appears, buttons trigger, but OBS is unresponsive* - Check your connection to OBS and verify your button commands. + +#### Resolving Issues with Twitch Chat Messages + +If sending Twitch chat messages is not working, consider the following troubleshooting steps: + +**Ensure Connection to Twitch Chat**\ +In SAMMI > Twitch Connections, click "Connect Twitch Chat" and enable `Auto connect to Twitch Chat` to automatically connect upon launching SAMMI. + +**Verify the Target Channel for Messages**\ +- For a single linked Twitch account, leave the channel name field empty. +- For multiple linked Twitch accounts, enter the correct Twitch channel name (in lowercase). + +**Avoid Excessive Messaging**\ +Twitch may temporarily block accounts that send too many messages in a short period. Avoid sending excessive messages. + +#### Chat Slash Commands do not work +In SAMMI versions 2023.1.0 and later, deprecated Twitch chat slash commands are automatically converted to the appropriate API calls. However, in some cases you may need to manually update these commands to use the corresponding API calls. + +See below which SAMMI command corresponds to which chat slash command. + +| Chat Slash Command | SAMMI Command to use instead | +|-------|--------| +|/announce| Twitch: Send Announcement| +|/ban|Twitch: Ban User|| +|/unban|Twitch: Unban User| +|/timeout and /untimeout|Twitch: Timeout User| +|/clear| Twitch: Delete Chat Message| +|/color|Twitch: Set User Color| +|/commercial|Twitch: Run Ad (Commercial) | +|/delete|Twitch: Delete Chat Message | +|/emoteonly and /emoteonlyoff|Twitch: Set Emote Mode| +|/followers and /followersoff |Twitch: Set Follower Mode | +|/marker|Twitch: Create Marker| +|/mod|Twitch: Add Moderator| +|/mods|Twitch: Get Moderators| +|/unmod|Twitch: Remove Moderator| +|/raid|Twitch: Start Raid| +|/unraid|Twitch: Cancel Raid| +|/slow and /slowoff|Twitch: Set Slow Mode| +|/subscribers and /subscribersoff|Twitch: Set Subscriber Mode| +|/uniquechat and /uniquechatoff|Twitch: API Call| +|/vip|Twitch: Add VIP| +|/unvip|Twitch: Remove VIP| +|/vips |Twitch: Get VIPs| +|/w |Twitch: Send Whisper| +{:class='table table-secondary w-auto table-hover data-toggle='table' text-break } + + + + + + + + + + **Try triggering a test alert from your Bridge** In your Bridge, go to Twitch Triggers tab and press any of the test buttons.\ A small yellow notification message should pop up in the bottom-left corner of SAMMI Core. @@ -42,4 +105,4 @@ If you send too many messages in a short period of time, Twitch might temporaril **Using `/w username` in a Send Chat Message command**\ This method for sending whispers is unreliable, as Twitch can prevent accounts from sending whispers using this method without warning or any visible indication it has.\ -Instead, try the [Send Whispers]({{ "commands/twitch#sendwhispers" | relative_url }}) command. +Instead, try the [Send Whispers]({{ "commands/twitch-chat#sendwhisper" | relative_url }}) command. diff --git a/doc_posts/_troubleshooting-errors/button_crashes.md b/doc_posts/_troubleshooting-errors/button_crashes.md index d2e6ecb5..54e25780 100644 --- a/doc_posts/_troubleshooting-errors/button_crashes.md +++ b/doc_posts/_troubleshooting-errors/button_crashes.md @@ -7,6 +7,6 @@ The error will be called `Button Command Error` and these crashes are in 99% of Your buttons may have incorrect syntax or you just told SAMMI to do something it really didn't like, such as trying to execute a math on a string or adding a string and number together. -Debugging these crashes is rather easy, since the error message tells you exactly which button ID, command and line the crash occured in. +Debugging these crashes is rather easy, since the error message tells you exactly which deck, button ID, command and line the crash occured in. {% include image.html w="75" src="buttonCrash.png" alt="SAMMI Button Crash" %} \ No newline at end of file diff --git a/doc_posts/_troubleshooting-outputs/outputs.md b/doc_posts/_troubleshooting-outputs/outputs.md index feb91148..041ae0dd 100644 --- a/doc_posts/_troubleshooting-outputs/outputs.md +++ b/doc_posts/_troubleshooting-outputs/outputs.md @@ -6,9 +6,10 @@ num: 0 When troubleshooting problems, especially via the Discord server, you may be asked to record an output from SAMMI.\ To do so, you need to close SAMMI if it's open, head to your main SAMMI folder, open `Settings.ini`, and add one of the following to the `[settings]` section (not the `[last_crash_data]` section): -`record_pubsub="1"`\ `record_bridge="1"`\ `record_twitchchat="1"`\ +`record_pubsub="1"`\ +`record_eventsub="1"`\ `record_http="1"`\ `record_obs="1"` @@ -21,6 +22,10 @@ After saving the settings.ini file, and relaunching SAMMI, a new text file will The PubSub system allows Twitch to broadcast realtime messages to SAMMI (as well as other services, like StreamElements). Think of it like a radio station broadcast, and SAMMI is a radio that's tuned in to that frequency - it gets news, weather, and songs from the station. SAMMI then relays those to you in the form of triggers, such as Twitch Chat, New Follower, etc.\ Enabling this records that information to `record_pubsub.txt` +#### Record EventSub +EventSub listens to follower alerts with future plans to fully replace PubSub.\ +Enabling `record_eventsub` will save all EventSub messages to `record_eventsub.txt` + #### Record Bridge The Bridge sends information to SAMMI from both extensions and the Test Triggers tabs.\ diff --git a/doc_posts/extension-policy.md b/doc_posts/extension-policy.md new file mode 100644 index 00000000..867b098e --- /dev/null +++ b/doc_posts/extension-policy.md @@ -0,0 +1,5 @@ +--- +permalink: /extension-policy +redirect_sammi: https://sammi.solutions/extensions/policy +layout: redirect_sammi +--- diff --git a/docs/commands/deck-app.html b/docs/commands/deck-app.html new file mode 100644 index 00000000..a3be4a8a --- /dev/null +++ b/docs/commands/deck-app.html @@ -0,0 +1,7 @@ +--- +title: Deck App +collection: commands-deck-app +permalink: commands/deck-app +--- + + diff --git a/docs/commands/integrations.html b/docs/commands/integrations.html new file mode 100644 index 00000000..1b02bc11 --- /dev/null +++ b/docs/commands/integrations.html @@ -0,0 +1,7 @@ +--- +title: Integrations +collection: commands-integrations +permalink: commands/integrations +--- + + diff --git a/docs/commands/variable.html b/docs/commands/variable.html index da6aebfd..8a16499d 100644 --- a/docs/commands/variable.html +++ b/docs/commands/variable.html @@ -1,5 +1,5 @@ --- title: Variables -collection: commands-variable +collection: commands-variables permalink: commands/variables --- diff --git a/docs/troubleshooting/bugs.html b/docs/troubleshooting/bugs.html deleted file mode 100644 index 4df03e3b..00000000 --- a/docs/troubleshooting/bugs.html +++ /dev/null @@ -1,9 +0,0 @@ ---- -title: Known Bugs -collection: troubleshooting-bugs -permalink: troubleshooting/bugs ---- - - - - diff --git a/ext/youtube_auth.html b/ext/youtube_auth.html index 54d9f7e9..9934e8cf 100644 --- a/ext/youtube_auth.html +++ b/ext/youtube_auth.html @@ -35,7 +35,7 @@

Step 2: Save your refresh token

} async function Auth() { - const response = await fetch(`https://fq4adpt9rc.execute-api.us-west-2.amazonaws.com/main/refreshtoken?code=${code}&redirect_uri=https://sammi.solutions/docs/integrations/youtube/auth`); + const response = await fetch(`https://ryffwm1pmc.execute-api.us-west-1.amazonaws.com/YouTubeStage/refreshtoken?code=${code}&redirect_uri=https://sammi.solutions/docs/integrations/youtube/auth`); let content; if (!response.ok) { const data = await response.json(); diff --git a/index.html b/index.html index 23817e4f..a8edf508 100644 --- a/index.html +++ b/index.html @@ -1,9 +1,9 @@ --- layout: default -title: Introduction +title: Getting Started menu: Getting Started --- -{%- assign index = site.getting-started | where: 'title', 'Introduction' | first-%} +{%- assign index = site.getting-started | where: 'title', 'Step by step tutorial' | first -%}

{{ index.content | markdownify }}

diff --git a/templates/example_command.md b/templates/example_command.md index 7f096401..34df3696 100644 --- a/templates/example_command.md +++ b/templates/example_command.md @@ -49,4 +49,4 @@ Written purely in `markdown`, *yay*! -{% include example_public.html src="https://i.imgur.com/jydvLf6.jpeg" size="50" title="Advanced button" pastebin="9HNbNCrN" desc=description %} +{% include example_public.html src="https://i.imgur.com/mDMCrPC.png" size="50" title="Advanced button" pastebin="9HNbNCrN" desc=description %} diff --git a/templates/example_command_internal.md b/templates/example_command_internal.md new file mode 100644 index 00000000..e56dc17a --- /dev/null +++ b/templates/example_command_internal.md @@ -0,0 +1,9 @@ +--- +layout: default +permalink: templates/example-command +--- +{% capture description %} +**Some description** +Written purely in `markdown`, *yay*! +{% endcapture %} +{% include example_public.html src="https://i.imgur.com/mDMCrPC.png" size="50" title="Advanced button" pastebin="9HNbNCrN" desc=description %} \ No newline at end of file diff --git a/templates/example_command_simple.md b/templates/example_command_simple.md index 9fec835e..32cede71 100644 --- a/templates/example_command_simple.md +++ b/templates/example_command_simple.md @@ -11,4 +11,4 @@ permalink: templates/example-command-simple -{% include example_public.html src="https://i.imgur.com/zsxdHym.jpeg" size="50" title="Simple button" pastebin="9HNbNCrN" desc=description %} +{% include example_public.html src="https://i.imgur.com/mDMCrPC.png" size="50" title="Simple button" pastebin="9HNbNCrN" desc=description %}