├── LICENSE ├── README.md ├── getNightbotStatus.sh ├── iTunesSong.applescript ├── nowPlaying.sh ├── setNightbotStatus.sh ├── setup-twitch.applescript └── twitch-mod-tools ├── .gitignore ├── modtooldaemon.js ├── package-lock.json ├── package.json └── pasteUrl /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2019 Suz Hinton 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # twitch-scripts -------------------------------------------------------------------------------- /getNightbotStatus.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | NIGHTBOT_COMMAND="" 4 | 5 | SCRIPT_DIR="/Users/noopkat/bin/twitch-scripts" 6 | CREDS_FILE="${SCRIPT_DIR}/nightbot-creds.txt" 7 | TOKENS_FILE="${SCRIPT_DIR}/nightbot-tokens.txt" 8 | 9 | REFRESH_TOKEN=$(cat $TOKENS_FILE | /usr/local/bin/jq '.refresh_token' -r) 10 | CREDS=$(cat $CREDS_FILE) 11 | 12 | curl -X POST https://api.nightbot.tv/oauth2/token \ 13 | -H "Content-Type: application/x-www-form-urlencoded" \ 14 | -d "${CREDS}&grant_type=refresh_token&refresh_token=${REFRESH_TOKEN}" \ 15 | --silent \ 16 | -o $TOKENS_FILE 17 | 18 | ACCESS_TOKEN=$(cat $TOKENS_FILE | /usr/local/bin/jq '.access_token' -r) 19 | 20 | LAST_STATUS=$(curl -X GET "https://api.nightbot.tv/1/commands/${NIGHTBOT_COMMAND}" \ 21 | -H "Authorization: Bearer ${ACCESS_TOKEN}" \ 22 | --silent \ 23 | | /usr/local/bin/jq '.command.message' -r) 24 | 25 | echo $LAST_STATUS 26 | -------------------------------------------------------------------------------- /iTunesSong.applescript: -------------------------------------------------------------------------------- 1 | on is_running(appName) 2 | tell application "System Events" to (name of processes) contains appName 3 | end is_running 4 | 5 | 6 | set iTunesRunning to is_running("iTunes") 7 | set noMusic to "no music is playing" 8 | set song to noMusic 9 | 10 | if iTunesRunning then 11 | set song to run script "tell application \"iTunes\" to if player state is playing then \"now playing: \" & name of current track & \" by \" & artist of current track" 12 | try 13 | song 14 | return song 15 | on error 16 | return noMusic 17 | end try 18 | else 19 | return noMusic 20 | end if 21 | -------------------------------------------------------------------------------- /nowPlaying.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | # Adds the currently playing iTunes track to a text file for an OBS text label. 3 | # 4 | SONG=`osascript ~/bin/twitch-scripts/iTunesSong.scpt` 5 | echo -e $SONG > ~/Documents/twitch/custom-labels/now-playing.txt 6 | 7 | -------------------------------------------------------------------------------- /setNightbotStatus.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | NIGHTBOT_STATUS=$1 4 | NIGHTBOT_COMMAND="" 5 | 6 | SCRIPT_DIR="/Users/noopkat/bin/twitch-scripts" 7 | CREDS_FILE="${SCRIPT_DIR}/nightbot-creds.txt" 8 | TOKENS_FILE="${SCRIPT_DIR}/nightbot-tokens.txt" 9 | 10 | REFRESH_TOKEN=$(cat $TOKENS_FILE | /usr/local/bin/jq '.refresh_token' -r) 11 | CREDS=$(cat $CREDS_FILE) 12 | 13 | curl -X POST https://api.nightbot.tv/oauth2/token \ 14 | --silent \ 15 | -H "Content-Type: application/x-www-form-urlencoded" \ 16 | -d "${CREDS}&grant_type=refresh_token&refresh_token=${REFRESH_TOKEN}" \ 17 | -o $TOKENS_FILE 18 | 19 | ACCESS_TOKEN=$(cat $TOKENS_FILE | /usr/local/bin/jq '.access_token' -r) 20 | 21 | curl -X PUT "https://api.nightbot.tv/1/commands/${NIGHTBOT_COMMAND}" \ 22 | -H "Authorization: Bearer ${ACCESS_TOKEN}" \ 23 | --data-urlencode "message=${NIGHTBOT_STATUS}" 24 | 25 | -------------------------------------------------------------------------------- /setup-twitch.applescript: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/noopkat/twitch-scripts/ddc1a1c6db0a5a76cd1a40a71239098bdc631d67/setup-twitch.applescript -------------------------------------------------------------------------------- /twitch-mod-tools/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | .env 3 | -------------------------------------------------------------------------------- /twitch-mod-tools/modtooldaemon.js: -------------------------------------------------------------------------------- 1 | const tmi = require('tmi.js'); 2 | const robot = require('robotjs'); 3 | const notifier = require('node-notifier'); 4 | const net = require('net'); 5 | 6 | const tcpHost = 'localhost'; 7 | const tcpPort = 6969; 8 | let tcpsock; 9 | 10 | const channelname = 'noopkat'; 11 | 12 | const keyMap = { 13 | desktop: 'm', 14 | camera: 's' 15 | }; 16 | 17 | function handleMessage(channel, tags, message) { 18 | const mod = (tags.username == channelname || tags.mod); 19 | 20 | if (message.toLowerCase().substring(0,6) === '!scene' && mod) switchScene(message); 21 | if (message.includes('STOP')) sendStopNotification(tags.username); 22 | if (message.toLowerCase().substring(0,5) === '!line') placeVimSign(message, tags); 23 | }; 24 | 25 | function handleTcpConnection(sock) { 26 | // only vim is using this so just replace the socket used every time 27 | tcpsock = sock; 28 | console.log(`vim is connected: ${sock.remoteAddress}: ${sock.remotePort}`); 29 | 30 | sock.on('close', function(data) { 31 | console.log(`vim closed connection: ${sock.remoteAddress} ${sock.remotePort}`); 32 | }); 33 | } 34 | 35 | function placeVimSign(message, tags) { 36 | const nick = "@" + tags.username; 37 | const line = parseInt(message.split(' ')[1], 10); 38 | const suggestion = message.split(' ').slice(2).join(' '); 39 | 40 | const payload = [0, { line, nick, suggestion }]; 41 | const jsonPayload = JSON.stringify(payload); 42 | 43 | tcpsock.write(jsonPayload + '\n'); 44 | } 45 | 46 | function switchScene(message) { 47 | const scene = message.toLowerCase().split(' ')[1]; 48 | if (!scene || !keyMap[scene]) return; 49 | const key = keyMap[scene]; 50 | robot.keyTap(key, ['control', 'shift', 'command']); 51 | } 52 | 53 | function sendStopNotification(username) { 54 | notifier.notify({ 55 | title: 'STOP!', 56 | message: `${username} is asking for your attention.`, 57 | sound: 'Glass' 58 | }); 59 | } 60 | 61 | const ircClient = new tmi.Client({ 62 | options: {debug: true}, 63 | connection: { 64 | reconnect: true, 65 | secure: true 66 | }, 67 | channels: [channelname] 68 | }); 69 | 70 | ircClient.connect(); 71 | ircClient.on('message', handleMessage); 72 | 73 | // tcp server for vim channel 74 | const tcpServer = net.createServer() 75 | tcpServer.on('connection', handleTcpConnection); 76 | tcpServer.listen(tcpPort, tcpHost); 77 | console.log('Server listening on ' + tcpHost +':'+ tcpPort); 78 | 79 | -------------------------------------------------------------------------------- /twitch-mod-tools/package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "twitch-mod-tools", 3 | "version": "1.0.0", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "ajv": { 8 | "version": "6.10.2", 9 | "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.2.tgz", 10 | "integrity": "sha512-TXtUUEYHuaTEbLZWIKUr5pmBuhDLy+8KYtPYdcV8qC+pOZL+NKqYwvWSRrVXHn+ZmRRAu8vJTAznH7Oag6RVRw==", 11 | "requires": { 12 | "fast-deep-equal": "^2.0.1", 13 | "fast-json-stable-stringify": "^2.0.0", 14 | "json-schema-traverse": "^0.4.1", 15 | "uri-js": "^4.2.2" 16 | } 17 | }, 18 | "ansi-regex": { 19 | "version": "2.1.1", 20 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", 21 | "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" 22 | }, 23 | "applescript": { 24 | "version": "1.0.0", 25 | "resolved": "https://registry.npmjs.org/applescript/-/applescript-1.0.0.tgz", 26 | "integrity": "sha1-u4evVoytA0pOSMS9r2Bno6JwExc=" 27 | }, 28 | "aproba": { 29 | "version": "1.2.0", 30 | "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", 31 | "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==" 32 | }, 33 | "are-we-there-yet": { 34 | "version": "1.1.5", 35 | "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz", 36 | "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==", 37 | "requires": { 38 | "delegates": "^1.0.0", 39 | "readable-stream": "^2.0.6" 40 | } 41 | }, 42 | "asn1": { 43 | "version": "0.2.4", 44 | "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", 45 | "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", 46 | "requires": { 47 | "safer-buffer": "~2.1.0" 48 | } 49 | }, 50 | "assert-plus": { 51 | "version": "1.0.0", 52 | "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", 53 | "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" 54 | }, 55 | "async-limiter": { 56 | "version": "1.0.1", 57 | "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", 58 | "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==" 59 | }, 60 | "asynckit": { 61 | "version": "0.4.0", 62 | "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", 63 | "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" 64 | }, 65 | "aws-sign2": { 66 | "version": "0.7.0", 67 | "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", 68 | "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=" 69 | }, 70 | "aws4": { 71 | "version": "1.9.0", 72 | "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.9.0.tgz", 73 | "integrity": "sha512-Uvq6hVe90D0B2WEnUqtdgY1bATGz3mw33nH9Y+dmA+w5DHvUmBgkr5rM/KCHpCsiFNRUfokW/szpPPgMK2hm4A==" 74 | }, 75 | "bcrypt-pbkdf": { 76 | "version": "1.0.2", 77 | "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", 78 | "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", 79 | "requires": { 80 | "tweetnacl": "^0.14.3" 81 | } 82 | }, 83 | "bl": { 84 | "version": "3.0.0", 85 | "resolved": "https://registry.npmjs.org/bl/-/bl-3.0.0.tgz", 86 | "integrity": "sha512-EUAyP5UHU5hxF8BPT0LKW8gjYLhq1DQIcneOX/pL/m2Alo+OYDQAJlHq+yseMP50Os2nHXOSic6Ss3vSQeyf4A==", 87 | "requires": { 88 | "readable-stream": "^3.0.1" 89 | }, 90 | "dependencies": { 91 | "readable-stream": { 92 | "version": "3.4.0", 93 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.4.0.tgz", 94 | "integrity": "sha512-jItXPLmrSR8jmTRmRWJXCnGJsfy85mB3Wd/uINMXA65yrnFo0cPClFIUWzo2najVNSl+mx7/4W8ttlLWJe99pQ==", 95 | "requires": { 96 | "inherits": "^2.0.3", 97 | "string_decoder": "^1.1.1", 98 | "util-deprecate": "^1.0.1" 99 | } 100 | } 101 | } 102 | }, 103 | "caseless": { 104 | "version": "0.12.0", 105 | "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", 106 | "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" 107 | }, 108 | "chownr": { 109 | "version": "1.1.3", 110 | "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.3.tgz", 111 | "integrity": "sha512-i70fVHhmV3DtTl6nqvZOnIjbY0Pe4kAUjwHj8z0zAdgBtYrJyYwLKCCuRBQ5ppkyL0AkN7HKRnETdmdp1zqNXw==" 112 | }, 113 | "code-point-at": { 114 | "version": "1.1.0", 115 | "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", 116 | "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=" 117 | }, 118 | "combined-stream": { 119 | "version": "1.0.8", 120 | "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", 121 | "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", 122 | "requires": { 123 | "delayed-stream": "~1.0.0" 124 | } 125 | }, 126 | "console-control-strings": { 127 | "version": "1.1.0", 128 | "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", 129 | "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=" 130 | }, 131 | "core-util-is": { 132 | "version": "1.0.2", 133 | "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", 134 | "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" 135 | }, 136 | "dashdash": { 137 | "version": "1.14.1", 138 | "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", 139 | "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", 140 | "requires": { 141 | "assert-plus": "^1.0.0" 142 | } 143 | }, 144 | "decompress-response": { 145 | "version": "4.2.1", 146 | "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-4.2.1.tgz", 147 | "integrity": "sha512-jOSne2qbyE+/r8G1VU+G/82LBs2Fs4LAsTiLSHOCOMZQl2OKZ6i8i4IyHemTe+/yIXOtTcRQMzPcgyhoFlqPkw==", 148 | "requires": { 149 | "mimic-response": "^2.0.0" 150 | } 151 | }, 152 | "deep-extend": { 153 | "version": "0.6.0", 154 | "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", 155 | "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==" 156 | }, 157 | "delayed-stream": { 158 | "version": "1.0.0", 159 | "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", 160 | "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" 161 | }, 162 | "delegates": { 163 | "version": "1.0.0", 164 | "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", 165 | "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=" 166 | }, 167 | "detect-libc": { 168 | "version": "1.0.3", 169 | "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", 170 | "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=" 171 | }, 172 | "dotenv": { 173 | "version": "8.2.0", 174 | "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-8.2.0.tgz", 175 | "integrity": "sha512-8sJ78ElpbDJBHNeBzUbUVLsqKdccaa/BXF1uPTw3GrvQTBgrQrtObr2mUrE38vzYd8cEv+m/JBfDLioYcfXoaw==" 176 | }, 177 | "ecc-jsbn": { 178 | "version": "0.1.2", 179 | "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", 180 | "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", 181 | "requires": { 182 | "jsbn": "~0.1.0", 183 | "safer-buffer": "^2.1.0" 184 | } 185 | }, 186 | "end-of-stream": { 187 | "version": "1.4.4", 188 | "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", 189 | "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", 190 | "requires": { 191 | "once": "^1.4.0" 192 | } 193 | }, 194 | "expand-template": { 195 | "version": "2.0.3", 196 | "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", 197 | "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==" 198 | }, 199 | "extend": { 200 | "version": "3.0.2", 201 | "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", 202 | "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" 203 | }, 204 | "extsprintf": { 205 | "version": "1.3.0", 206 | "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", 207 | "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=" 208 | }, 209 | "fast-deep-equal": { 210 | "version": "2.0.1", 211 | "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", 212 | "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=" 213 | }, 214 | "fast-json-stable-stringify": { 215 | "version": "2.0.0", 216 | "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", 217 | "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=" 218 | }, 219 | "forever-agent": { 220 | "version": "0.6.1", 221 | "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", 222 | "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=" 223 | }, 224 | "form-data": { 225 | "version": "2.3.3", 226 | "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", 227 | "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", 228 | "requires": { 229 | "asynckit": "^0.4.0", 230 | "combined-stream": "^1.0.6", 231 | "mime-types": "^2.1.12" 232 | } 233 | }, 234 | "fs-constants": { 235 | "version": "1.0.0", 236 | "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", 237 | "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==" 238 | }, 239 | "gauge": { 240 | "version": "2.7.4", 241 | "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", 242 | "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", 243 | "requires": { 244 | "aproba": "^1.0.3", 245 | "console-control-strings": "^1.0.0", 246 | "has-unicode": "^2.0.0", 247 | "object-assign": "^4.1.0", 248 | "signal-exit": "^3.0.0", 249 | "string-width": "^1.0.1", 250 | "strip-ansi": "^3.0.1", 251 | "wide-align": "^1.1.0" 252 | } 253 | }, 254 | "getpass": { 255 | "version": "0.1.7", 256 | "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", 257 | "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", 258 | "requires": { 259 | "assert-plus": "^1.0.0" 260 | } 261 | }, 262 | "github-from-package": { 263 | "version": "0.0.0", 264 | "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", 265 | "integrity": "sha1-l/tdlr/eiXMxPyDoKI75oWf6ZM4=" 266 | }, 267 | "growly": { 268 | "version": "1.3.0", 269 | "resolved": "https://registry.npmjs.org/growly/-/growly-1.3.0.tgz", 270 | "integrity": "sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE=" 271 | }, 272 | "har-schema": { 273 | "version": "2.0.0", 274 | "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", 275 | "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=" 276 | }, 277 | "har-validator": { 278 | "version": "5.1.3", 279 | "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz", 280 | "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==", 281 | "requires": { 282 | "ajv": "^6.5.5", 283 | "har-schema": "^2.0.0" 284 | } 285 | }, 286 | "has-unicode": { 287 | "version": "2.0.1", 288 | "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", 289 | "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=" 290 | }, 291 | "http-signature": { 292 | "version": "1.2.0", 293 | "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", 294 | "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", 295 | "requires": { 296 | "assert-plus": "^1.0.0", 297 | "jsprim": "^1.2.2", 298 | "sshpk": "^1.7.0" 299 | } 300 | }, 301 | "inherits": { 302 | "version": "2.0.4", 303 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 304 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" 305 | }, 306 | "ini": { 307 | "version": "1.3.5", 308 | "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", 309 | "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==" 310 | }, 311 | "is-fullwidth-code-point": { 312 | "version": "1.0.0", 313 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", 314 | "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", 315 | "requires": { 316 | "number-is-nan": "^1.0.0" 317 | } 318 | }, 319 | "is-typedarray": { 320 | "version": "1.0.0", 321 | "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", 322 | "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" 323 | }, 324 | "is-wsl": { 325 | "version": "2.1.1", 326 | "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.1.1.tgz", 327 | "integrity": "sha512-umZHcSrwlDHo2TGMXv0DZ8dIUGunZ2Iv68YZnrmCiBPkZ4aaOhtv7pXJKeki9k3qJ3RJr0cDyitcl5wEH3AYog==" 328 | }, 329 | "isarray": { 330 | "version": "1.0.0", 331 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", 332 | "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" 333 | }, 334 | "isexe": { 335 | "version": "2.0.0", 336 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", 337 | "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" 338 | }, 339 | "isstream": { 340 | "version": "0.1.2", 341 | "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", 342 | "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" 343 | }, 344 | "jsbn": { 345 | "version": "0.1.1", 346 | "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", 347 | "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=" 348 | }, 349 | "json-schema": { 350 | "version": "0.2.3", 351 | "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", 352 | "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=" 353 | }, 354 | "json-schema-traverse": { 355 | "version": "0.4.1", 356 | "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", 357 | "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" 358 | }, 359 | "json-stringify-safe": { 360 | "version": "5.0.1", 361 | "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", 362 | "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" 363 | }, 364 | "jsprim": { 365 | "version": "1.4.1", 366 | "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", 367 | "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", 368 | "requires": { 369 | "assert-plus": "1.0.0", 370 | "extsprintf": "1.3.0", 371 | "json-schema": "0.2.3", 372 | "verror": "1.10.0" 373 | } 374 | }, 375 | "mime-db": { 376 | "version": "1.42.0", 377 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.42.0.tgz", 378 | "integrity": "sha512-UbfJCR4UAVRNgMpfImz05smAXK7+c+ZntjaA26ANtkXLlOe947Aag5zdIcKQULAiF9Cq4WxBi9jUs5zkA84bYQ==" 379 | }, 380 | "mime-types": { 381 | "version": "2.1.25", 382 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.25.tgz", 383 | "integrity": "sha512-5KhStqB5xpTAeGqKBAMgwaYMnQik7teQN4IAzC7npDv6kzeU6prfkR67bc87J1kWMPGkoaZSq1npmexMgkmEVg==", 384 | "requires": { 385 | "mime-db": "1.42.0" 386 | } 387 | }, 388 | "mimic-response": { 389 | "version": "2.0.0", 390 | "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-2.0.0.tgz", 391 | "integrity": "sha512-8ilDoEapqA4uQ3TwS0jakGONKXVJqpy+RpM+3b7pLdOjghCrEiGp9SRkFbUHAmZW9vdnrENWHjaweIoTIJExSQ==" 392 | }, 393 | "minimist": { 394 | "version": "1.2.0", 395 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", 396 | "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" 397 | }, 398 | "mkdirp": { 399 | "version": "0.5.1", 400 | "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", 401 | "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", 402 | "requires": { 403 | "minimist": "0.0.8" 404 | }, 405 | "dependencies": { 406 | "minimist": { 407 | "version": "0.0.8", 408 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", 409 | "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" 410 | } 411 | } 412 | }, 413 | "nan": { 414 | "version": "2.14.0", 415 | "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.0.tgz", 416 | "integrity": "sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg==" 417 | }, 418 | "napi-build-utils": { 419 | "version": "1.0.1", 420 | "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-1.0.1.tgz", 421 | "integrity": "sha512-boQj1WFgQH3v4clhu3mTNfP+vOBxorDlE8EKiMjUlLG3C4qAESnn9AxIOkFgTR2c9LtzNjPrjS60cT27ZKBhaA==" 422 | }, 423 | "node-abi": { 424 | "version": "2.13.0", 425 | "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-2.13.0.tgz", 426 | "integrity": "sha512-9HrZGFVTR5SOu3PZAnAY2hLO36aW1wmA+FDsVkr85BTST32TLCA1H/AEcatVRAsWLyXS3bqUDYCAjq5/QGuSTA==", 427 | "requires": { 428 | "semver": "^5.4.1" 429 | } 430 | }, 431 | "node-notifier": { 432 | "version": "6.0.0", 433 | "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-6.0.0.tgz", 434 | "integrity": "sha512-SVfQ/wMw+DesunOm5cKqr6yDcvUTDl/yc97ybGHMrteNEY6oekXpNpS3lZwgLlwz0FLgHoiW28ZpmBHUDg37cw==", 435 | "requires": { 436 | "growly": "^1.3.0", 437 | "is-wsl": "^2.1.1", 438 | "semver": "^6.3.0", 439 | "shellwords": "^0.1.1", 440 | "which": "^1.3.1" 441 | }, 442 | "dependencies": { 443 | "semver": { 444 | "version": "6.3.0", 445 | "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", 446 | "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" 447 | } 448 | } 449 | }, 450 | "noop-logger": { 451 | "version": "0.1.1", 452 | "resolved": "https://registry.npmjs.org/noop-logger/-/noop-logger-0.1.1.tgz", 453 | "integrity": "sha1-lKKxYzxPExdVMAfYlm/Q6EG2pMI=" 454 | }, 455 | "npmlog": { 456 | "version": "4.1.2", 457 | "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", 458 | "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", 459 | "requires": { 460 | "are-we-there-yet": "~1.1.2", 461 | "console-control-strings": "~1.1.0", 462 | "gauge": "~2.7.3", 463 | "set-blocking": "~2.0.0" 464 | } 465 | }, 466 | "number-is-nan": { 467 | "version": "1.0.1", 468 | "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", 469 | "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=" 470 | }, 471 | "oauth-sign": { 472 | "version": "0.9.0", 473 | "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", 474 | "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==" 475 | }, 476 | "object-assign": { 477 | "version": "4.1.1", 478 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", 479 | "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" 480 | }, 481 | "once": { 482 | "version": "1.4.0", 483 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 484 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", 485 | "requires": { 486 | "wrappy": "1" 487 | } 488 | }, 489 | "performance-now": { 490 | "version": "2.1.0", 491 | "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", 492 | "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" 493 | }, 494 | "prebuild-install": { 495 | "version": "5.3.3", 496 | "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-5.3.3.tgz", 497 | "integrity": "sha512-GV+nsUXuPW2p8Zy7SarF/2W/oiK8bFQgJcncoJ0d7kRpekEA0ftChjfEaF9/Y+QJEc/wFR7RAEa8lYByuUIe2g==", 498 | "requires": { 499 | "detect-libc": "^1.0.3", 500 | "expand-template": "^2.0.3", 501 | "github-from-package": "0.0.0", 502 | "minimist": "^1.2.0", 503 | "mkdirp": "^0.5.1", 504 | "napi-build-utils": "^1.0.1", 505 | "node-abi": "^2.7.0", 506 | "noop-logger": "^0.1.1", 507 | "npmlog": "^4.0.1", 508 | "pump": "^3.0.0", 509 | "rc": "^1.2.7", 510 | "simple-get": "^3.0.3", 511 | "tar-fs": "^2.0.0", 512 | "tunnel-agent": "^0.6.0", 513 | "which-pm-runs": "^1.0.0" 514 | } 515 | }, 516 | "process-nextick-args": { 517 | "version": "2.0.1", 518 | "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", 519 | "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" 520 | }, 521 | "psl": { 522 | "version": "1.6.0", 523 | "resolved": "https://registry.npmjs.org/psl/-/psl-1.6.0.tgz", 524 | "integrity": "sha512-SYKKmVel98NCOYXpkwUqZqh0ahZeeKfmisiLIcEZdsb+WbLv02g/dI5BUmZnIyOe7RzZtLax81nnb2HbvC2tzA==" 525 | }, 526 | "pump": { 527 | "version": "3.0.0", 528 | "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", 529 | "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", 530 | "requires": { 531 | "end-of-stream": "^1.1.0", 532 | "once": "^1.3.1" 533 | } 534 | }, 535 | "punycode": { 536 | "version": "2.1.1", 537 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", 538 | "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" 539 | }, 540 | "qs": { 541 | "version": "6.5.2", 542 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", 543 | "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==" 544 | }, 545 | "rc": { 546 | "version": "1.2.8", 547 | "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", 548 | "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", 549 | "requires": { 550 | "deep-extend": "^0.6.0", 551 | "ini": "~1.3.0", 552 | "minimist": "^1.2.0", 553 | "strip-json-comments": "~2.0.1" 554 | } 555 | }, 556 | "readable-stream": { 557 | "version": "2.3.6", 558 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", 559 | "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", 560 | "requires": { 561 | "core-util-is": "~1.0.0", 562 | "inherits": "~2.0.3", 563 | "isarray": "~1.0.0", 564 | "process-nextick-args": "~2.0.0", 565 | "safe-buffer": "~5.1.1", 566 | "string_decoder": "~1.1.1", 567 | "util-deprecate": "~1.0.1" 568 | } 569 | }, 570 | "request": { 571 | "version": "2.88.0", 572 | "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz", 573 | "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==", 574 | "requires": { 575 | "aws-sign2": "~0.7.0", 576 | "aws4": "^1.8.0", 577 | "caseless": "~0.12.0", 578 | "combined-stream": "~1.0.6", 579 | "extend": "~3.0.2", 580 | "forever-agent": "~0.6.1", 581 | "form-data": "~2.3.2", 582 | "har-validator": "~5.1.0", 583 | "http-signature": "~1.2.0", 584 | "is-typedarray": "~1.0.0", 585 | "isstream": "~0.1.2", 586 | "json-stringify-safe": "~5.0.1", 587 | "mime-types": "~2.1.19", 588 | "oauth-sign": "~0.9.0", 589 | "performance-now": "^2.1.0", 590 | "qs": "~6.5.2", 591 | "safe-buffer": "^5.1.2", 592 | "tough-cookie": "~2.4.3", 593 | "tunnel-agent": "^0.6.0", 594 | "uuid": "^3.3.2" 595 | } 596 | }, 597 | "robotjs": { 598 | "version": "0.6.0", 599 | "resolved": "https://registry.npmjs.org/robotjs/-/robotjs-0.6.0.tgz", 600 | "integrity": "sha512-6pRWI3d+CBZqCXT/rsJfabbZoELua+jTeXilG27F8Jvix/J2BYZ0O7Tly2WCmXyqw5xYdCvOwvCeLRHEtXkt4w==", 601 | "requires": { 602 | "nan": "^2.14.0", 603 | "node-abi": "^2.13.0", 604 | "prebuild-install": "^5.3.3" 605 | } 606 | }, 607 | "safe-buffer": { 608 | "version": "5.1.2", 609 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 610 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" 611 | }, 612 | "safer-buffer": { 613 | "version": "2.1.2", 614 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", 615 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" 616 | }, 617 | "semver": { 618 | "version": "5.7.1", 619 | "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", 620 | "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" 621 | }, 622 | "set-blocking": { 623 | "version": "2.0.0", 624 | "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", 625 | "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" 626 | }, 627 | "shellwords": { 628 | "version": "0.1.1", 629 | "resolved": "https://registry.npmjs.org/shellwords/-/shellwords-0.1.1.tgz", 630 | "integrity": "sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww==" 631 | }, 632 | "signal-exit": { 633 | "version": "3.0.2", 634 | "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", 635 | "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=" 636 | }, 637 | "simple-concat": { 638 | "version": "1.0.0", 639 | "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.0.tgz", 640 | "integrity": "sha1-c0TLuLbib7J9ZrL8hvn21Zl1IcY=" 641 | }, 642 | "simple-get": { 643 | "version": "3.1.0", 644 | "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-3.1.0.tgz", 645 | "integrity": "sha512-bCR6cP+aTdScaQCnQKbPKtJOKDp/hj9EDLJo3Nw4y1QksqaovlW/bnptB6/c1e+qmNIDHRK+oXFDdEqBT8WzUA==", 646 | "requires": { 647 | "decompress-response": "^4.2.0", 648 | "once": "^1.3.1", 649 | "simple-concat": "^1.0.0" 650 | } 651 | }, 652 | "sshpk": { 653 | "version": "1.16.1", 654 | "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", 655 | "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", 656 | "requires": { 657 | "asn1": "~0.2.3", 658 | "assert-plus": "^1.0.0", 659 | "bcrypt-pbkdf": "^1.0.0", 660 | "dashdash": "^1.12.0", 661 | "ecc-jsbn": "~0.1.1", 662 | "getpass": "^0.1.1", 663 | "jsbn": "~0.1.0", 664 | "safer-buffer": "^2.0.2", 665 | "tweetnacl": "~0.14.0" 666 | } 667 | }, 668 | "string-width": { 669 | "version": "1.0.2", 670 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", 671 | "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", 672 | "requires": { 673 | "code-point-at": "^1.0.0", 674 | "is-fullwidth-code-point": "^1.0.0", 675 | "strip-ansi": "^3.0.0" 676 | } 677 | }, 678 | "string_decoder": { 679 | "version": "1.1.1", 680 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", 681 | "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", 682 | "requires": { 683 | "safe-buffer": "~5.1.0" 684 | } 685 | }, 686 | "strip-ansi": { 687 | "version": "3.0.1", 688 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", 689 | "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", 690 | "requires": { 691 | "ansi-regex": "^2.0.0" 692 | } 693 | }, 694 | "strip-json-comments": { 695 | "version": "2.0.1", 696 | "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", 697 | "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=" 698 | }, 699 | "tar-fs": { 700 | "version": "2.0.0", 701 | "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.0.0.tgz", 702 | "integrity": "sha512-vaY0obB6Om/fso8a8vakQBzwholQ7v5+uy+tF3Ozvxv1KNezmVQAiWtcNmMHFSFPqL3dJA8ha6gdtFbfX9mcxA==", 703 | "requires": { 704 | "chownr": "^1.1.1", 705 | "mkdirp": "^0.5.1", 706 | "pump": "^3.0.0", 707 | "tar-stream": "^2.0.0" 708 | } 709 | }, 710 | "tar-stream": { 711 | "version": "2.1.0", 712 | "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.1.0.tgz", 713 | "integrity": "sha512-+DAn4Nb4+gz6WZigRzKEZl1QuJVOLtAwwF+WUxy1fJ6X63CaGaUAxJRD2KEn1OMfcbCjySTYpNC6WmfQoIEOdw==", 714 | "requires": { 715 | "bl": "^3.0.0", 716 | "end-of-stream": "^1.4.1", 717 | "fs-constants": "^1.0.0", 718 | "inherits": "^2.0.3", 719 | "readable-stream": "^3.1.1" 720 | }, 721 | "dependencies": { 722 | "readable-stream": { 723 | "version": "3.4.0", 724 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.4.0.tgz", 725 | "integrity": "sha512-jItXPLmrSR8jmTRmRWJXCnGJsfy85mB3Wd/uINMXA65yrnFo0cPClFIUWzo2najVNSl+mx7/4W8ttlLWJe99pQ==", 726 | "requires": { 727 | "inherits": "^2.0.3", 728 | "string_decoder": "^1.1.1", 729 | "util-deprecate": "^1.0.1" 730 | } 731 | } 732 | } 733 | }, 734 | "tmi.js": { 735 | "version": "1.5.0", 736 | "resolved": "https://registry.npmjs.org/tmi.js/-/tmi.js-1.5.0.tgz", 737 | "integrity": "sha512-JyWKy9dRkZDG1h6PnpE8fJVsTrW82/yANXoP7R3u02vG7PLCvHGRGTWzBwk0ymMJGX9A+YzDx5tXQDsTeJd/5A==", 738 | "requires": { 739 | "request": "2.88.0", 740 | "ws": "6.1.3" 741 | } 742 | }, 743 | "tough-cookie": { 744 | "version": "2.4.3", 745 | "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz", 746 | "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==", 747 | "requires": { 748 | "psl": "^1.1.24", 749 | "punycode": "^1.4.1" 750 | }, 751 | "dependencies": { 752 | "punycode": { 753 | "version": "1.4.1", 754 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", 755 | "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" 756 | } 757 | } 758 | }, 759 | "tunnel-agent": { 760 | "version": "0.6.0", 761 | "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", 762 | "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", 763 | "requires": { 764 | "safe-buffer": "^5.0.1" 765 | } 766 | }, 767 | "tweetnacl": { 768 | "version": "0.14.5", 769 | "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", 770 | "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=" 771 | }, 772 | "uri-js": { 773 | "version": "4.2.2", 774 | "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", 775 | "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", 776 | "requires": { 777 | "punycode": "^2.1.0" 778 | } 779 | }, 780 | "util-deprecate": { 781 | "version": "1.0.2", 782 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", 783 | "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" 784 | }, 785 | "uuid": { 786 | "version": "3.3.3", 787 | "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.3.tgz", 788 | "integrity": "sha512-pW0No1RGHgzlpHJO1nsVrHKpOEIxkGg1xB+v0ZmdNH5OAeAwzAVrCnI2/6Mtx+Uys6iaylxa+D3g4j63IKKjSQ==" 789 | }, 790 | "verror": { 791 | "version": "1.10.0", 792 | "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", 793 | "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", 794 | "requires": { 795 | "assert-plus": "^1.0.0", 796 | "core-util-is": "1.0.2", 797 | "extsprintf": "^1.2.0" 798 | } 799 | }, 800 | "which": { 801 | "version": "1.3.1", 802 | "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", 803 | "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", 804 | "requires": { 805 | "isexe": "^2.0.0" 806 | } 807 | }, 808 | "which-pm-runs": { 809 | "version": "1.0.0", 810 | "resolved": "https://registry.npmjs.org/which-pm-runs/-/which-pm-runs-1.0.0.tgz", 811 | "integrity": "sha1-Zws6+8VS4LVd9rd4DKdGFfI60cs=" 812 | }, 813 | "wide-align": { 814 | "version": "1.1.3", 815 | "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", 816 | "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", 817 | "requires": { 818 | "string-width": "^1.0.2 || 2" 819 | } 820 | }, 821 | "wrappy": { 822 | "version": "1.0.2", 823 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 824 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" 825 | }, 826 | "ws": { 827 | "version": "6.1.3", 828 | "resolved": "https://registry.npmjs.org/ws/-/ws-6.1.3.tgz", 829 | "integrity": "sha512-tbSxiT+qJI223AP4iLfQbkbxkwdFcneYinM2+x46Gx2wgvbaOMO36czfdfVUBRTHvzAMRhDd98sA5d/BuWbQdg==", 830 | "requires": { 831 | "async-limiter": "~1.0.0" 832 | } 833 | } 834 | } 835 | } 836 | -------------------------------------------------------------------------------- /twitch-mod-tools/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "twitch-mod-tools", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "modtooldaemon.js", 6 | "scripts": { 7 | "test": "echo \"Error: no test specified\" && exit 1" 8 | }, 9 | "keywords": [], 10 | "author": "Suz Hinton", 11 | "license": "MIT", 12 | "dependencies": { 13 | "applescript": "^1.0.0", 14 | "dotenv": "^8.2.0", 15 | "node-notifier": "^6.0.0", 16 | "robotjs": "^0.6.0", 17 | "tmi.js": "^1.5.0" 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /twitch-mod-tools/pasteUrl: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env node 2 | 3 | const path = require('path'); 4 | const applescript = require('applescript'); 5 | const tmi = require('tmi.js'); 6 | require('dotenv').config({path: path.join(__dirname, '.env')}); 7 | 8 | const client = new tmi.Client({ 9 | connection: {secure: true}, 10 | identity: { 11 | username: process.env.TWITCH_NICK, 12 | password: process.env.TWITCH_TOKEN 13 | }, 14 | channels: [process.env.TWITCH_CHANNEL] 15 | }); 16 | 17 | (async function sendUrlToChat() { 18 | await client.connect(); 19 | 20 | const script = 'tell application "Google Chrome" to get URL of active tab of first window'; 21 | applescript.execString(script, async (err, url) => { 22 | if (err) return process.exit(1); 23 | await client.say(process.env.TWITCH_CHANNEL, url); 24 | process.exit(); 25 | }); 26 | })(); 27 | --------------------------------------------------------------------------------