├── .github └── ISSUE_TEMPLATE │ ├── bug_report.md │ └── feature_request.md ├── .gitignore ├── README.md ├── ngrok.exe ├── package-lock.json ├── package.json ├── rebot.svg ├── server.js └── utils ├── package.json └── utils.js /.github/ISSUE_TEMPLATE/bug_report.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Bug report 3 | about: Help me kill bugs. 4 | title: '' 5 | labels: '' 6 | assignees: '' 7 | 8 | --- 9 | 10 | **Describe the bug** 11 | A clear and concise description of what the bug is. 12 | 13 | **To Reproduce** 14 | Steps to reproduce the behavior: 15 | 16 | **Expected behavior** 17 | A clear and concise description of what you expected to happen. 18 | 19 | **Screenshots** 20 | If applicable, add screenshots to help explain your problem. 21 | 22 | **Desktop or Samrtphone (please complete the following information):** 23 | - OS: [e.g. iOS] 24 | - Browser [e.g. chrome, safari] 25 | - Version [e.g. 22] 26 | 27 | **Additional context** 28 | Add any other context about the problem here. 29 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/feature_request.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Feature request 3 | about: Want a feature? Suggest here! 4 | title: '' 5 | labels: '' 6 | assignees: '' 7 | 8 | --- 9 | 10 | **Is your feature request related to a problem? Please describe.** 11 | A clear and concise description of what the problem is. 12 | 13 | **Describe the solution you'd like** 14 | A clear and concise description of what you want to happen. 15 | 16 | **Describe alternatives you've considered** 17 | A clear and concise description of any alternative solutions or features you've considered. 18 | 19 | **Additional context** 20 | Add any other context or screenshots about the feature request here. 21 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .env 2 | node_modules 3 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 |

Rebot 🤖

2 | 3 |

Rebot (REminder + BOT) is a whatsapp bot built upon Twilio's APIs, ExpressJS and MongoDB. It can send reminders through text messages in whatsapp.

4 | 5 | 8 | 9 |

Usage

10 | 11 | ### Set Up 12 | - [Click on this link](https://wa.me/+14155238886?text=join%20think-themselves). This will open up whatsapp on your mobile / PC. 13 | - The invitation text has already been filled into the message box, just send the message and you are in! 🎉. 14 | 15 | ### Setting up reminders 16 | - Send `set` to get a brief insight about usage. 17 | - The general format is `set `. Replace angular brackets with the specified fields. Read more about parameters below : 18 | - `task-name`: **A required field**. Type the task that you want to be reminded about in **NO SPACES**. 19 | - `task-time`: **A required field**. Type the time you want to be reminded at in **24 HOUR** format. 20 | - `task-date`: **An optional field**. The default value is current date however you can also type here `today` if you want to put some extra efforts. For dates other than current date, type in **DD/MM** format. 21 | - Examples : 22 | - Set a reminder for Work at 7:30 PM today --> `set Work 1930` or `set Work 1930 today` 23 | - Set a reminder for Someone's-Birthday on 1st April at 9:00PM --> `set Someone's-Birthday 2100 01/04` 24 | 25 | ### Viewing reminders 26 | - Send `view` to view all your upcoming reminders. 27 | - Returns a message to first set up some reminders if not done so. 28 | 29 | ### Keep in mind 30 | Just like me, this bot is lazy 🦥 and needs to sleep 😴 0000 to 0600 (IST) everyday (due to Heroku's policies). So try **NOT** to set any reminders for the above timings. Also Twilio's WhatsApp API is in beta which may cause issues or even stop working all together. **Also this project is eventually destined to be sun-setted after the trial balance of Twilio is over**. 31 | 32 |

All contributions and issues are welcome 🤗.

33 | -------------------------------------------------------------------------------- /ngrok.exe: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pathakshashank17/Rebot/5c2f146e234e679352f575014061e77509bfde95/ngrok.exe -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "rebot", 3 | "version": "1.0.0", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "@types/bson": { 8 | "version": "4.0.3", 9 | "resolved": "https://registry.npmjs.org/@types/bson/-/bson-4.0.3.tgz", 10 | "integrity": "sha512-mVRvYnTOZJz3ccpxhr3wgxVmSeiYinW+zlzQz3SXWaJmD1DuL05Jeq7nKw3SnbKmbleW5qrLG5vdyWe/A9sXhw==", 11 | "requires": { 12 | "@types/node": "*" 13 | } 14 | }, 15 | "@types/caseless": { 16 | "version": "0.12.2", 17 | "resolved": "https://registry.npmjs.org/@types/caseless/-/caseless-0.12.2.tgz", 18 | "integrity": "sha512-6ckxMjBBD8URvjB6J3NcnuAn5Pkl7t3TizAg+xdlzzQGSPSmBcXf8KoIH0ua/i+tio+ZRUHEXp0HEmvaR4kt0w==" 19 | }, 20 | "@types/mongodb": { 21 | "version": "3.6.16", 22 | "resolved": "https://registry.npmjs.org/@types/mongodb/-/mongodb-3.6.16.tgz", 23 | "integrity": "sha512-D3tM0iRUet3TiIMAdvovxAIRG9gYqFd4j7visGwmPNdQj8Fq/uFFfRxyGCgEwVXAs0NnJPMI/QGVTADxDwhmSQ==", 24 | "requires": { 25 | "@types/bson": "*", 26 | "@types/node": "*" 27 | } 28 | }, 29 | "@types/node": { 30 | "version": "8.10.62", 31 | "resolved": "https://registry.npmjs.org/@types/node/-/node-8.10.62.tgz", 32 | "integrity": "sha512-76fupxOYVxk36kb7O/6KtrAPZ9jnSK3+qisAX4tQMEuGNdlvl7ycwatlHqjoE6jHfVtXFM3pCrCixZOidc5cuw==" 33 | }, 34 | "@types/request": { 35 | "version": "2.48.5", 36 | "resolved": "https://registry.npmjs.org/@types/request/-/request-2.48.5.tgz", 37 | "integrity": "sha512-/LO7xRVnL3DxJ1WkPGDQrp4VTV1reX9RkC85mJ+Qzykj2Bdw+mG15aAfDahc76HtknjzE16SX/Yddn6MxVbmGQ==", 38 | "requires": { 39 | "@types/caseless": "*", 40 | "@types/node": "*", 41 | "@types/tough-cookie": "*", 42 | "form-data": "^2.5.0" 43 | } 44 | }, 45 | "@types/tough-cookie": { 46 | "version": "4.0.0", 47 | "resolved": "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-4.0.0.tgz", 48 | "integrity": "sha512-I99sngh224D0M7XgW1s120zxCt3VYQ3IQsuw3P3jbq5GG4yc79+ZjyKznyOGIQrflfylLgcfekeZW/vk0yng6A==" 49 | }, 50 | "abbrev": { 51 | "version": "1.1.1", 52 | "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", 53 | "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" 54 | }, 55 | "accepts": { 56 | "version": "1.3.7", 57 | "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", 58 | "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", 59 | "requires": { 60 | "mime-types": "~2.1.24", 61 | "negotiator": "0.6.2" 62 | } 63 | }, 64 | "agent-base": { 65 | "version": "6.0.2", 66 | "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", 67 | "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", 68 | "requires": { 69 | "debug": "4" 70 | }, 71 | "dependencies": { 72 | "debug": { 73 | "version": "4.3.1", 74 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", 75 | "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", 76 | "requires": { 77 | "ms": "2.1.2" 78 | } 79 | }, 80 | "ms": { 81 | "version": "2.1.2", 82 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 83 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" 84 | } 85 | } 86 | }, 87 | "ajv": { 88 | "version": "6.12.3", 89 | "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.3.tgz", 90 | "integrity": "sha512-4K0cK3L1hsqk9xIb2z9vs/XU+PGJZ9PNpJRDS9YLzmNdX6jmVPfamLvTJr0aDAusnHyCHO6MjzlkAsgtqp9teA==", 91 | "requires": { 92 | "fast-deep-equal": "^3.1.1", 93 | "fast-json-stable-stringify": "^2.0.0", 94 | "json-schema-traverse": "^0.4.1", 95 | "uri-js": "^4.2.2" 96 | } 97 | }, 98 | "array-flatten": { 99 | "version": "1.1.1", 100 | "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", 101 | "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" 102 | }, 103 | "asap": { 104 | "version": "2.0.6", 105 | "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", 106 | "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=" 107 | }, 108 | "asn1": { 109 | "version": "0.2.4", 110 | "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", 111 | "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", 112 | "requires": { 113 | "safer-buffer": "~2.1.0" 114 | } 115 | }, 116 | "assert-plus": { 117 | "version": "1.0.0", 118 | "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", 119 | "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" 120 | }, 121 | "async": { 122 | "version": "2.6.3", 123 | "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz", 124 | "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==", 125 | "requires": { 126 | "lodash": "^4.17.14" 127 | } 128 | }, 129 | "asynckit": { 130 | "version": "0.4.0", 131 | "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", 132 | "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" 133 | }, 134 | "aws-sign2": { 135 | "version": "0.7.0", 136 | "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", 137 | "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=" 138 | }, 139 | "aws4": { 140 | "version": "1.10.0", 141 | "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.10.0.tgz", 142 | "integrity": "sha512-3YDiu347mtVtjpyV3u5kVqQLP242c06zwDOgpeRnybmXlYYsLbtTrUBUm8i8srONt+FWobl5aibnU1030PeeuA==" 143 | }, 144 | "axios": { 145 | "version": "0.21.4", 146 | "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.4.tgz", 147 | "integrity": "sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==", 148 | "requires": { 149 | "follow-redirects": "^1.14.0" 150 | } 151 | }, 152 | "bcrypt-pbkdf": { 153 | "version": "1.0.2", 154 | "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", 155 | "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", 156 | "requires": { 157 | "tweetnacl": "^0.14.3" 158 | } 159 | }, 160 | "binary": { 161 | "version": "0.3.0", 162 | "resolved": "https://registry.npmjs.org/binary/-/binary-0.3.0.tgz", 163 | "integrity": "sha1-n2BVO8XOjDOG87VTz/R0Yq3sqnk=", 164 | "requires": { 165 | "buffers": "~0.1.1", 166 | "chainsaw": "~0.1.0" 167 | } 168 | }, 169 | "bl": { 170 | "version": "2.2.1", 171 | "resolved": "https://registry.npmjs.org/bl/-/bl-2.2.1.tgz", 172 | "integrity": "sha512-6Pesp1w0DEX1N550i/uGV/TqucVL4AM/pgThFSN/Qq9si1/DF9aIHs1BxD8V/QU0HoeHO6cQRTAuYnLPKq1e4g==", 173 | "requires": { 174 | "readable-stream": "^2.3.5", 175 | "safe-buffer": "^5.1.1" 176 | }, 177 | "dependencies": { 178 | "isarray": { 179 | "version": "1.0.0", 180 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", 181 | "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" 182 | }, 183 | "readable-stream": { 184 | "version": "2.3.7", 185 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", 186 | "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", 187 | "requires": { 188 | "core-util-is": "~1.0.0", 189 | "inherits": "~2.0.3", 190 | "isarray": "~1.0.0", 191 | "process-nextick-args": "~2.0.0", 192 | "safe-buffer": "~5.1.1", 193 | "string_decoder": "~1.1.1", 194 | "util-deprecate": "~1.0.1" 195 | } 196 | }, 197 | "string_decoder": { 198 | "version": "1.1.1", 199 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", 200 | "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", 201 | "requires": { 202 | "safe-buffer": "~5.1.0" 203 | } 204 | } 205 | } 206 | }, 207 | "bluebird": { 208 | "version": "3.5.1", 209 | "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.1.tgz", 210 | "integrity": "sha512-MKiLiV+I1AA596t9w1sQJ8jkiSr5+ZKi0WKrYGUn6d1Fx+Ij4tIj+m2WMQSGczs5jZVxV339chE8iwk6F64wjA==" 211 | }, 212 | "body-parser": { 213 | "version": "1.19.0", 214 | "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", 215 | "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", 216 | "requires": { 217 | "bytes": "3.1.0", 218 | "content-type": "~1.0.4", 219 | "debug": "2.6.9", 220 | "depd": "~1.1.2", 221 | "http-errors": "1.7.2", 222 | "iconv-lite": "0.4.24", 223 | "on-finished": "~2.3.0", 224 | "qs": "6.7.0", 225 | "raw-body": "2.4.0", 226 | "type-is": "~1.6.17" 227 | } 228 | }, 229 | "bson": { 230 | "version": "1.1.6", 231 | "resolved": "https://registry.npmjs.org/bson/-/bson-1.1.6.tgz", 232 | "integrity": "sha512-EvVNVeGo4tHxwi8L6bPj3y3itEvStdwvvlojVxxbyYfoaxJ6keLgrTuKdyfEAszFK+H3olzBuafE0yoh0D1gdg==" 233 | }, 234 | "buffer-equal-constant-time": { 235 | "version": "1.0.1", 236 | "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", 237 | "integrity": "sha1-+OcRMvf/5uAaXJaXpMbz5I1cyBk=" 238 | }, 239 | "buffers": { 240 | "version": "0.1.1", 241 | "resolved": "https://registry.npmjs.org/buffers/-/buffers-0.1.1.tgz", 242 | "integrity": "sha1-skV5w77U1tOWru5tmorn9Ugqt7s=" 243 | }, 244 | "bytes": { 245 | "version": "3.1.0", 246 | "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", 247 | "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==" 248 | }, 249 | "call-bind": { 250 | "version": "1.0.2", 251 | "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", 252 | "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", 253 | "requires": { 254 | "function-bind": "^1.1.1", 255 | "get-intrinsic": "^1.0.2" 256 | } 257 | }, 258 | "caseless": { 259 | "version": "0.12.0", 260 | "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", 261 | "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" 262 | }, 263 | "chainsaw": { 264 | "version": "0.1.0", 265 | "resolved": "https://registry.npmjs.org/chainsaw/-/chainsaw-0.1.0.tgz", 266 | "integrity": "sha1-XqtQsor+WAdNDVgpE4iCi15fvJg=", 267 | "requires": { 268 | "traverse": ">=0.3.0 <0.4" 269 | } 270 | }, 271 | "charenc": { 272 | "version": "0.0.2", 273 | "resolved": "https://registry.npmjs.org/charenc/-/charenc-0.0.2.tgz", 274 | "integrity": "sha1-wKHS86cJLgN3S/qD8UwPxXkKhmc=" 275 | }, 276 | "combined-stream": { 277 | "version": "1.0.8", 278 | "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", 279 | "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", 280 | "requires": { 281 | "delayed-stream": "~1.0.0" 282 | } 283 | }, 284 | "content-disposition": { 285 | "version": "0.5.3", 286 | "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", 287 | "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", 288 | "requires": { 289 | "safe-buffer": "5.1.2" 290 | } 291 | }, 292 | "content-type": { 293 | "version": "1.0.4", 294 | "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", 295 | "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" 296 | }, 297 | "cookie": { 298 | "version": "0.4.0", 299 | "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", 300 | "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==" 301 | }, 302 | "cookie-signature": { 303 | "version": "1.0.6", 304 | "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", 305 | "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" 306 | }, 307 | "core-util-is": { 308 | "version": "1.0.2", 309 | "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", 310 | "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" 311 | }, 312 | "crypt": { 313 | "version": "0.0.2", 314 | "resolved": "https://registry.npmjs.org/crypt/-/crypt-0.0.2.tgz", 315 | "integrity": "sha1-iNf/fsDfuG9xPch7u0LQRNPmxBs=" 316 | }, 317 | "dashdash": { 318 | "version": "1.14.1", 319 | "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", 320 | "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", 321 | "requires": { 322 | "assert-plus": "^1.0.0" 323 | } 324 | }, 325 | "dayjs": { 326 | "version": "1.10.4", 327 | "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.10.4.tgz", 328 | "integrity": "sha512-RI/Hh4kqRc1UKLOAf/T5zdMMX5DQIlDxwUe3wSyMMnEbGunnpENCdbUgM+dW7kXidZqCttBrmw7BhN4TMddkCw==" 329 | }, 330 | "debug": { 331 | "version": "2.6.9", 332 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 333 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 334 | "requires": { 335 | "ms": "2.0.0" 336 | } 337 | }, 338 | "decompress-zip": { 339 | "version": "0.3.2", 340 | "resolved": "https://registry.npmjs.org/decompress-zip/-/decompress-zip-0.3.2.tgz", 341 | "integrity": "sha512-Ab1QY4LrWMrUuo53lLnmGOby7v8ryqxJ+bKibKSiPisx+25mhut1dScVBXAYx14i/PqSrFZvR2FRRazhLbvL+g==", 342 | "requires": { 343 | "binary": "^0.3.0", 344 | "graceful-fs": "^4.1.3", 345 | "mkpath": "^0.1.0", 346 | "nopt": "^3.0.1", 347 | "q": "^1.1.2", 348 | "readable-stream": "^1.1.8", 349 | "touch": "0.0.3" 350 | } 351 | }, 352 | "delayed-stream": { 353 | "version": "1.0.0", 354 | "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", 355 | "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" 356 | }, 357 | "denque": { 358 | "version": "1.5.0", 359 | "resolved": "https://registry.npmjs.org/denque/-/denque-1.5.0.tgz", 360 | "integrity": "sha512-CYiCSgIF1p6EUByQPlGkKnP1M9g0ZV3qMIrqMqZqdwazygIA/YP2vrbcyl1h/WppKJTdl1F85cXIle+394iDAQ==" 361 | }, 362 | "depd": { 363 | "version": "1.1.2", 364 | "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", 365 | "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" 366 | }, 367 | "destroy": { 368 | "version": "1.0.4", 369 | "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", 370 | "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" 371 | }, 372 | "dotenv": { 373 | "version": "8.2.0", 374 | "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-8.2.0.tgz", 375 | "integrity": "sha512-8sJ78ElpbDJBHNeBzUbUVLsqKdccaa/BXF1uPTw3GrvQTBgrQrtObr2mUrE38vzYd8cEv+m/JBfDLioYcfXoaw==" 376 | }, 377 | "dotty": { 378 | "version": "0.1.2", 379 | "resolved": "https://registry.npmjs.org/dotty/-/dotty-0.1.2.tgz", 380 | "integrity": "sha512-V0EWmKeH3DEhMwAZ+8ZB2Ao4OK6p++Z0hsDtZq3N0+0ZMVqkzrcEGROvOnZpLnvBg5PTNG23JEDLAm64gPaotQ==" 381 | }, 382 | "ecc-jsbn": { 383 | "version": "0.1.2", 384 | "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", 385 | "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", 386 | "requires": { 387 | "jsbn": "~0.1.0", 388 | "safer-buffer": "^2.1.0" 389 | } 390 | }, 391 | "ecdsa-sig-formatter": { 392 | "version": "1.0.11", 393 | "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", 394 | "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", 395 | "requires": { 396 | "safe-buffer": "^5.0.1" 397 | } 398 | }, 399 | "ee-first": { 400 | "version": "1.1.1", 401 | "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", 402 | "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" 403 | }, 404 | "encodeurl": { 405 | "version": "1.0.2", 406 | "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", 407 | "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" 408 | }, 409 | "escape-html": { 410 | "version": "1.0.3", 411 | "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", 412 | "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" 413 | }, 414 | "etag": { 415 | "version": "1.8.1", 416 | "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", 417 | "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" 418 | }, 419 | "express": { 420 | "version": "4.17.1", 421 | "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", 422 | "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==", 423 | "requires": { 424 | "accepts": "~1.3.7", 425 | "array-flatten": "1.1.1", 426 | "body-parser": "1.19.0", 427 | "content-disposition": "0.5.3", 428 | "content-type": "~1.0.4", 429 | "cookie": "0.4.0", 430 | "cookie-signature": "1.0.6", 431 | "debug": "2.6.9", 432 | "depd": "~1.1.2", 433 | "encodeurl": "~1.0.2", 434 | "escape-html": "~1.0.3", 435 | "etag": "~1.8.1", 436 | "finalhandler": "~1.1.2", 437 | "fresh": "0.5.2", 438 | "merge-descriptors": "1.0.1", 439 | "methods": "~1.1.2", 440 | "on-finished": "~2.3.0", 441 | "parseurl": "~1.3.3", 442 | "path-to-regexp": "0.1.7", 443 | "proxy-addr": "~2.0.5", 444 | "qs": "6.7.0", 445 | "range-parser": "~1.2.1", 446 | "safe-buffer": "5.1.2", 447 | "send": "0.17.1", 448 | "serve-static": "1.14.1", 449 | "setprototypeof": "1.1.1", 450 | "statuses": "~1.5.0", 451 | "type-is": "~1.6.18", 452 | "utils-merge": "1.0.1", 453 | "vary": "~1.1.2" 454 | } 455 | }, 456 | "extend": { 457 | "version": "3.0.2", 458 | "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", 459 | "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" 460 | }, 461 | "extsprintf": { 462 | "version": "1.3.0", 463 | "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", 464 | "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=" 465 | }, 466 | "fast-deep-equal": { 467 | "version": "3.1.3", 468 | "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", 469 | "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" 470 | }, 471 | "fast-json-stable-stringify": { 472 | "version": "2.1.0", 473 | "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", 474 | "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" 475 | }, 476 | "finalhandler": { 477 | "version": "1.1.2", 478 | "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", 479 | "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", 480 | "requires": { 481 | "debug": "2.6.9", 482 | "encodeurl": "~1.0.2", 483 | "escape-html": "~1.0.3", 484 | "on-finished": "~2.3.0", 485 | "parseurl": "~1.3.3", 486 | "statuses": "~1.5.0", 487 | "unpipe": "~1.0.0" 488 | } 489 | }, 490 | "follow-redirects": { 491 | "version": "1.14.7", 492 | "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.7.tgz", 493 | "integrity": "sha512-+hbxoLbFMbRKDwohX8GkTataGqO6Jb7jGwpAlwgy2bIz25XtRm7KEzJM76R1WiNT5SwZkX4Y75SwBolkpmE7iQ==" 494 | }, 495 | "forever-agent": { 496 | "version": "0.6.1", 497 | "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", 498 | "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=" 499 | }, 500 | "form-data": { 501 | "version": "2.5.1", 502 | "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.1.tgz", 503 | "integrity": "sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==", 504 | "requires": { 505 | "asynckit": "^0.4.0", 506 | "combined-stream": "^1.0.6", 507 | "mime-types": "^2.1.12" 508 | } 509 | }, 510 | "forwarded": { 511 | "version": "0.1.2", 512 | "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", 513 | "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=" 514 | }, 515 | "fresh": { 516 | "version": "0.5.2", 517 | "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", 518 | "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" 519 | }, 520 | "function-bind": { 521 | "version": "1.1.1", 522 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", 523 | "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" 524 | }, 525 | "get-intrinsic": { 526 | "version": "1.1.1", 527 | "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", 528 | "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", 529 | "requires": { 530 | "function-bind": "^1.1.1", 531 | "has": "^1.0.3", 532 | "has-symbols": "^1.0.1" 533 | } 534 | }, 535 | "getpass": { 536 | "version": "0.1.7", 537 | "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", 538 | "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", 539 | "requires": { 540 | "assert-plus": "^1.0.0" 541 | } 542 | }, 543 | "google-libphonenumber": { 544 | "version": "3.2.10", 545 | "resolved": "https://registry.npmjs.org/google-libphonenumber/-/google-libphonenumber-3.2.10.tgz", 546 | "integrity": "sha512-TsckE9O8QgqaIeaOXPjcJa4/kX3BzFdO1oCbMfmUpRZckml4xJhjJVxaT9Mdt/VrZZkT9lX44eHAEWfJK1tHtw==" 547 | }, 548 | "graceful-fs": { 549 | "version": "4.2.4", 550 | "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", 551 | "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==" 552 | }, 553 | "har-schema": { 554 | "version": "2.0.0", 555 | "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", 556 | "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=" 557 | }, 558 | "har-validator": { 559 | "version": "5.1.5", 560 | "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", 561 | "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", 562 | "requires": { 563 | "ajv": "^6.12.3", 564 | "har-schema": "^2.0.0" 565 | } 566 | }, 567 | "has": { 568 | "version": "1.0.3", 569 | "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", 570 | "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", 571 | "requires": { 572 | "function-bind": "^1.1.1" 573 | } 574 | }, 575 | "has-symbols": { 576 | "version": "1.0.2", 577 | "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", 578 | "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==" 579 | }, 580 | "http-errors": { 581 | "version": "1.7.2", 582 | "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", 583 | "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", 584 | "requires": { 585 | "depd": "~1.1.2", 586 | "inherits": "2.0.3", 587 | "setprototypeof": "1.1.1", 588 | "statuses": ">= 1.5.0 < 2", 589 | "toidentifier": "1.0.0" 590 | } 591 | }, 592 | "http-signature": { 593 | "version": "1.2.0", 594 | "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", 595 | "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", 596 | "requires": { 597 | "assert-plus": "^1.0.0", 598 | "jsprim": "^1.2.2", 599 | "sshpk": "^1.7.0" 600 | } 601 | }, 602 | "https-proxy-agent": { 603 | "version": "5.0.0", 604 | "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz", 605 | "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==", 606 | "requires": { 607 | "agent-base": "6", 608 | "debug": "4" 609 | }, 610 | "dependencies": { 611 | "debug": { 612 | "version": "4.3.1", 613 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", 614 | "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", 615 | "requires": { 616 | "ms": "2.1.2" 617 | } 618 | }, 619 | "ms": { 620 | "version": "2.1.2", 621 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 622 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" 623 | } 624 | } 625 | }, 626 | "iconv-lite": { 627 | "version": "0.4.24", 628 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", 629 | "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", 630 | "requires": { 631 | "safer-buffer": ">= 2.1.2 < 3" 632 | } 633 | }, 634 | "inherits": { 635 | "version": "2.0.3", 636 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", 637 | "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" 638 | }, 639 | "ipaddr.js": { 640 | "version": "1.9.1", 641 | "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", 642 | "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==" 643 | }, 644 | "is-buffer": { 645 | "version": "1.1.6", 646 | "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", 647 | "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" 648 | }, 649 | "is-typedarray": { 650 | "version": "1.0.0", 651 | "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", 652 | "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" 653 | }, 654 | "isarray": { 655 | "version": "0.0.1", 656 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", 657 | "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" 658 | }, 659 | "isstream": { 660 | "version": "0.1.2", 661 | "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", 662 | "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" 663 | }, 664 | "jsbn": { 665 | "version": "0.1.1", 666 | "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", 667 | "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=" 668 | }, 669 | "json-schema": { 670 | "version": "0.2.3", 671 | "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", 672 | "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=" 673 | }, 674 | "json-schema-traverse": { 675 | "version": "0.4.1", 676 | "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", 677 | "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" 678 | }, 679 | "json-stable-stringify": { 680 | "version": "1.0.1", 681 | "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz", 682 | "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=", 683 | "requires": { 684 | "jsonify": "~0.0.0" 685 | } 686 | }, 687 | "json-stringify-safe": { 688 | "version": "5.0.1", 689 | "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", 690 | "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" 691 | }, 692 | "jsonify": { 693 | "version": "0.0.0", 694 | "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", 695 | "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=" 696 | }, 697 | "jsonwebtoken": { 698 | "version": "8.5.1", 699 | "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-8.5.1.tgz", 700 | "integrity": "sha512-XjwVfRS6jTMsqYs0EsuJ4LGxXV14zQybNd4L2r0UvbVnSF9Af8x7p5MzbJ90Ioz/9TI41/hTCvznF/loiSzn8w==", 701 | "requires": { 702 | "jws": "^3.2.2", 703 | "lodash.includes": "^4.3.0", 704 | "lodash.isboolean": "^3.0.3", 705 | "lodash.isinteger": "^4.0.4", 706 | "lodash.isnumber": "^3.0.3", 707 | "lodash.isplainobject": "^4.0.6", 708 | "lodash.isstring": "^4.0.1", 709 | "lodash.once": "^4.0.0", 710 | "ms": "^2.1.1", 711 | "semver": "^5.6.0" 712 | }, 713 | "dependencies": { 714 | "ms": { 715 | "version": "2.1.3", 716 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", 717 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" 718 | } 719 | } 720 | }, 721 | "jsprim": { 722 | "version": "1.4.1", 723 | "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", 724 | "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", 725 | "requires": { 726 | "assert-plus": "1.0.0", 727 | "extsprintf": "1.3.0", 728 | "json-schema": "0.2.3", 729 | "verror": "1.10.0" 730 | } 731 | }, 732 | "jwa": { 733 | "version": "1.4.1", 734 | "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz", 735 | "integrity": "sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==", 736 | "requires": { 737 | "buffer-equal-constant-time": "1.0.1", 738 | "ecdsa-sig-formatter": "1.0.11", 739 | "safe-buffer": "^5.0.1" 740 | } 741 | }, 742 | "jws": { 743 | "version": "3.2.2", 744 | "resolved": "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz", 745 | "integrity": "sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==", 746 | "requires": { 747 | "jwa": "^1.4.1", 748 | "safe-buffer": "^5.0.1" 749 | } 750 | }, 751 | "kareem": { 752 | "version": "2.3.2", 753 | "resolved": "https://registry.npmjs.org/kareem/-/kareem-2.3.2.tgz", 754 | "integrity": "sha512-STHz9P7X2L4Kwn72fA4rGyqyXdmrMSdxqHx9IXon/FXluXieaFA6KJ2upcHAHxQPQ0LeM/OjLrhFxifHewOALQ==" 755 | }, 756 | "lodash": { 757 | "version": "4.17.21", 758 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", 759 | "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" 760 | }, 761 | "lodash.includes": { 762 | "version": "4.3.0", 763 | "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz", 764 | "integrity": "sha1-YLuYqHy5I8aMoeUTJUgzFISfVT8=" 765 | }, 766 | "lodash.isboolean": { 767 | "version": "3.0.3", 768 | "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz", 769 | "integrity": "sha1-bC4XHbKiV82WgC/UOwGyDV9YcPY=" 770 | }, 771 | "lodash.isinteger": { 772 | "version": "4.0.4", 773 | "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz", 774 | "integrity": "sha1-YZwK89A/iwTDH1iChAt3sRzWg0M=" 775 | }, 776 | "lodash.isnumber": { 777 | "version": "3.0.3", 778 | "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz", 779 | "integrity": "sha1-POdoEMWSjQM1IwGsKHMX8RwLH/w=" 780 | }, 781 | "lodash.isplainobject": { 782 | "version": "4.0.6", 783 | "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", 784 | "integrity": "sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs=" 785 | }, 786 | "lodash.isstring": { 787 | "version": "4.0.1", 788 | "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", 789 | "integrity": "sha1-1SfftUVuynzJu5XV2ur4i6VKVFE=" 790 | }, 791 | "lodash.once": { 792 | "version": "4.1.1", 793 | "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", 794 | "integrity": "sha1-DdOXEhPHxW34gJd9UEyI+0cal6w=" 795 | }, 796 | "luxon": { 797 | "version": "1.24.1", 798 | "resolved": "https://registry.npmjs.org/luxon/-/luxon-1.24.1.tgz", 799 | "integrity": "sha512-CgnIMKAWT0ghcuWFfCWBnWGOddM0zu6c4wZAWmD0NN7MZTnro0+833DF6tJep+xlxRPg4KtsYEHYLfTMBQKwYg==" 800 | }, 801 | "md5": { 802 | "version": "2.3.0", 803 | "resolved": "https://registry.npmjs.org/md5/-/md5-2.3.0.tgz", 804 | "integrity": "sha512-T1GITYmFaKuO91vxyoQMFETst+O71VUPEU3ze5GNzDm0OWdP8v1ziTaAEPUr/3kLsY3Sftgz242A1SetQiDL7g==", 805 | "requires": { 806 | "charenc": "0.0.2", 807 | "crypt": "0.0.2", 808 | "is-buffer": "~1.1.6" 809 | } 810 | }, 811 | "media-typer": { 812 | "version": "0.3.0", 813 | "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", 814 | "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" 815 | }, 816 | "memory-pager": { 817 | "version": "1.5.0", 818 | "resolved": "https://registry.npmjs.org/memory-pager/-/memory-pager-1.5.0.tgz", 819 | "integrity": "sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg==", 820 | "optional": true 821 | }, 822 | "merge-descriptors": { 823 | "version": "1.0.1", 824 | "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", 825 | "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" 826 | }, 827 | "methods": { 828 | "version": "1.1.2", 829 | "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", 830 | "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" 831 | }, 832 | "mime": { 833 | "version": "1.6.0", 834 | "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", 835 | "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" 836 | }, 837 | "mime-db": { 838 | "version": "1.44.0", 839 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz", 840 | "integrity": "sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg==" 841 | }, 842 | "mime-types": { 843 | "version": "2.1.27", 844 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.27.tgz", 845 | "integrity": "sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w==", 846 | "requires": { 847 | "mime-db": "1.44.0" 848 | } 849 | }, 850 | "mkpath": { 851 | "version": "0.1.0", 852 | "resolved": "https://registry.npmjs.org/mkpath/-/mkpath-0.1.0.tgz", 853 | "integrity": "sha1-dVSm+Nhxg0zJe1RisSLEwSTW3pE=" 854 | }, 855 | "moment": { 856 | "version": "2.27.0", 857 | "resolved": "https://registry.npmjs.org/moment/-/moment-2.27.0.tgz", 858 | "integrity": "sha512-al0MUK7cpIcglMv3YF13qSgdAIqxHTO7brRtaz3DlSULbqfazqkc5kEjNrLDOM7fsjshoFIihnU8snrP7zUvhQ==" 859 | }, 860 | "moment-timezone": { 861 | "version": "0.5.31", 862 | "resolved": "https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.5.31.tgz", 863 | "integrity": "sha512-+GgHNg8xRhMXfEbv81iDtrVeTcWt0kWmTEY1XQK14dICTXnWJnT0dxdlPspwqF3keKMVPXwayEsk1DI0AA/jdA==", 864 | "requires": { 865 | "moment": ">= 2.9.0" 866 | } 867 | }, 868 | "mongodb": { 869 | "version": "3.6.8", 870 | "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-3.6.8.tgz", 871 | "integrity": "sha512-sDjJvI73WjON1vapcbyBD3Ao9/VN3TKYY8/QX9EPbs22KaCSrQ5rXo5ZZd44tWJ3wl3FlnrFZ+KyUtNH6+1ZPQ==", 872 | "requires": { 873 | "bl": "^2.2.1", 874 | "bson": "^1.1.4", 875 | "denque": "^1.4.1", 876 | "optional-require": "^1.0.3", 877 | "safe-buffer": "^5.1.2", 878 | "saslprep": "^1.0.0" 879 | } 880 | }, 881 | "mongoose": { 882 | "version": "5.12.11", 883 | "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-5.12.11.tgz", 884 | "integrity": "sha512-16TVqYhHQdZNR8RTis/8iiTPy+nJPq0UhKyBFTucLLU3PWcDLY2gAGv6aOk0LygTNhEfgNnENgUUHhjVqTuh8w==", 885 | "requires": { 886 | "@types/mongodb": "^3.5.27", 887 | "bson": "^1.1.4", 888 | "kareem": "2.3.2", 889 | "mongodb": "3.6.8", 890 | "mongoose-legacy-pluralize": "1.0.2", 891 | "mpath": "0.8.3", 892 | "mquery": "3.2.5", 893 | "ms": "2.1.2", 894 | "regexp-clone": "1.0.0", 895 | "safe-buffer": "5.2.1", 896 | "sift": "13.5.2", 897 | "sliced": "1.0.1" 898 | }, 899 | "dependencies": { 900 | "ms": { 901 | "version": "2.1.2", 902 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 903 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" 904 | }, 905 | "safe-buffer": { 906 | "version": "5.2.1", 907 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", 908 | "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" 909 | } 910 | } 911 | }, 912 | "mongoose-encryption": { 913 | "version": "2.0.2", 914 | "resolved": "https://registry.npmjs.org/mongoose-encryption/-/mongoose-encryption-2.0.2.tgz", 915 | "integrity": "sha512-zh9jbUZgrFnYl880zPZ+JA+sWQFgbtgkQJ0LASWiEnjDQ1CpMdPXIk20xprl61TYr1RQU16NKv4w7OxyI/l12g==", 916 | "requires": { 917 | "async": "^2.6.1", 918 | "buffer-equal-constant-time": "^1.0.1", 919 | "dotty": "~0.1.0", 920 | "json-stable-stringify": "^1.0.0", 921 | "mpath": "^0.5.1", 922 | "semver": "^5.5.0", 923 | "underscore": "^1.5.0" 924 | }, 925 | "dependencies": { 926 | "mpath": { 927 | "version": "0.5.2", 928 | "resolved": "https://registry.npmjs.org/mpath/-/mpath-0.5.2.tgz", 929 | "integrity": "sha512-NOeCoW6AYc3hLi30npe7uzbD9b4FQZKH40YKABUCCvaKKL5agj6YzvHoNx8jQpDMNPgIa5bvSZQbQpWBAVD0Kw==" 930 | } 931 | } 932 | }, 933 | "mongoose-legacy-pluralize": { 934 | "version": "1.0.2", 935 | "resolved": "https://registry.npmjs.org/mongoose-legacy-pluralize/-/mongoose-legacy-pluralize-1.0.2.tgz", 936 | "integrity": "sha512-Yo/7qQU4/EyIS8YDFSeenIvXxZN+ld7YdV9LqFVQJzTLye8unujAWPZ4NWKfFA+RNjh+wvTWKY9Z3E5XM6ZZiQ==" 937 | }, 938 | "mpath": { 939 | "version": "0.8.3", 940 | "resolved": "https://registry.npmjs.org/mpath/-/mpath-0.8.3.tgz", 941 | "integrity": "sha512-eb9rRvhDltXVNL6Fxd2zM9D4vKBxjVVQNLNijlj7uoXUy19zNDsIif5zR+pWmPCWNKwAtqyo4JveQm4nfD5+eA==" 942 | }, 943 | "mquery": { 944 | "version": "3.2.5", 945 | "resolved": "https://registry.npmjs.org/mquery/-/mquery-3.2.5.tgz", 946 | "integrity": "sha512-VjOKHHgU84wij7IUoZzFRU07IAxd5kWJaDmyUzQlbjHjyoeK5TNeeo8ZsFDtTYnSgpW6n/nMNIHvE3u8Lbrf4A==", 947 | "requires": { 948 | "bluebird": "3.5.1", 949 | "debug": "3.1.0", 950 | "regexp-clone": "^1.0.0", 951 | "safe-buffer": "5.1.2", 952 | "sliced": "1.0.1" 953 | }, 954 | "dependencies": { 955 | "debug": { 956 | "version": "3.1.0", 957 | "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", 958 | "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", 959 | "requires": { 960 | "ms": "2.0.0" 961 | } 962 | } 963 | } 964 | }, 965 | "ms": { 966 | "version": "2.0.0", 967 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 968 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" 969 | }, 970 | "negotiator": { 971 | "version": "0.6.2", 972 | "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", 973 | "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==" 974 | }, 975 | "ngrok": { 976 | "version": "3.2.7", 977 | "resolved": "https://registry.npmjs.org/ngrok/-/ngrok-3.2.7.tgz", 978 | "integrity": "sha512-B7K15HM0qRZplL2aO/yfxixYubH0M50Pfu0fa4PDcmXP7RC+wyYzu6YtX77BBHHCfbwCzkObX6YdO8ThpCR6Lg==", 979 | "requires": { 980 | "@types/node": "^8.10.50", 981 | "@types/request": "^2.48.2", 982 | "decompress-zip": "^0.3.2", 983 | "request": "^2.88.0", 984 | "request-promise-native": "^1.0.7", 985 | "uuid": "^3.3.2" 986 | } 987 | }, 988 | "node-cron": { 989 | "version": "2.0.3", 990 | "resolved": "https://registry.npmjs.org/node-cron/-/node-cron-2.0.3.tgz", 991 | "integrity": "sha512-eJI+QitXlwcgiZwNNSRbqsjeZMp5shyajMR81RZCqeW0ZDEj4zU9tpd4nTh/1JsBiKbF8d08FCewiipDmVIYjg==", 992 | "requires": { 993 | "opencollective-postinstall": "^2.0.0", 994 | "tz-offset": "0.0.1" 995 | } 996 | }, 997 | "nopt": { 998 | "version": "3.0.6", 999 | "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", 1000 | "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=", 1001 | "requires": { 1002 | "abbrev": "1" 1003 | } 1004 | }, 1005 | "oauth-sign": { 1006 | "version": "0.9.0", 1007 | "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", 1008 | "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==" 1009 | }, 1010 | "object-inspect": { 1011 | "version": "1.10.3", 1012 | "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.10.3.tgz", 1013 | "integrity": "sha512-e5mCJlSH7poANfC8z8S9s9S2IN5/4Zb3aZ33f5s8YqoazCFzNLloLU8r5VCG+G7WoqLvAAZoVMcy3tp/3X0Plw==" 1014 | }, 1015 | "on-finished": { 1016 | "version": "2.3.0", 1017 | "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", 1018 | "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", 1019 | "requires": { 1020 | "ee-first": "1.1.1" 1021 | } 1022 | }, 1023 | "opencollective-postinstall": { 1024 | "version": "2.0.3", 1025 | "resolved": "https://registry.npmjs.org/opencollective-postinstall/-/opencollective-postinstall-2.0.3.tgz", 1026 | "integrity": "sha512-8AV/sCtuzUeTo8gQK5qDZzARrulB3egtLzFgteqB2tcT4Mw7B8Kt7JcDHmltjz6FOAHsvTevk70gZEbhM4ZS9Q==" 1027 | }, 1028 | "optional-require": { 1029 | "version": "1.0.3", 1030 | "resolved": "https://registry.npmjs.org/optional-require/-/optional-require-1.0.3.tgz", 1031 | "integrity": "sha512-RV2Zp2MY2aeYK5G+B/Sps8lW5NHAzE5QClbFP15j+PWmP+T9PxlJXBOOLoSAdgwFvS4t0aMR4vpedMkbHfh0nA==" 1032 | }, 1033 | "parseurl": { 1034 | "version": "1.3.3", 1035 | "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", 1036 | "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" 1037 | }, 1038 | "path-to-regexp": { 1039 | "version": "0.1.7", 1040 | "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", 1041 | "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" 1042 | }, 1043 | "performance-now": { 1044 | "version": "2.1.0", 1045 | "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", 1046 | "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" 1047 | }, 1048 | "pop-iterate": { 1049 | "version": "1.0.1", 1050 | "resolved": "https://registry.npmjs.org/pop-iterate/-/pop-iterate-1.0.1.tgz", 1051 | "integrity": "sha1-zqz9q0q/NT16DyqqLB/Hs/lBO6M=" 1052 | }, 1053 | "process-nextick-args": { 1054 | "version": "2.0.1", 1055 | "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", 1056 | "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" 1057 | }, 1058 | "proxy-addr": { 1059 | "version": "2.0.6", 1060 | "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.6.tgz", 1061 | "integrity": "sha512-dh/frvCBVmSsDYzw6n926jv974gddhkFPfiN8hPOi30Wax25QZyZEGveluCgliBnqmuM+UJmBErbAUFIoDbjOw==", 1062 | "requires": { 1063 | "forwarded": "~0.1.2", 1064 | "ipaddr.js": "1.9.1" 1065 | } 1066 | }, 1067 | "psl": { 1068 | "version": "1.8.0", 1069 | "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", 1070 | "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==" 1071 | }, 1072 | "punycode": { 1073 | "version": "2.1.1", 1074 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", 1075 | "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" 1076 | }, 1077 | "q": { 1078 | "version": "1.5.1", 1079 | "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", 1080 | "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=" 1081 | }, 1082 | "qs": { 1083 | "version": "6.7.0", 1084 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", 1085 | "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==" 1086 | }, 1087 | "querystringify": { 1088 | "version": "2.2.0", 1089 | "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", 1090 | "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==" 1091 | }, 1092 | "range-parser": { 1093 | "version": "1.2.1", 1094 | "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", 1095 | "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" 1096 | }, 1097 | "raw-body": { 1098 | "version": "2.4.0", 1099 | "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz", 1100 | "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==", 1101 | "requires": { 1102 | "bytes": "3.1.0", 1103 | "http-errors": "1.7.2", 1104 | "iconv-lite": "0.4.24", 1105 | "unpipe": "1.0.0" 1106 | } 1107 | }, 1108 | "readable-stream": { 1109 | "version": "1.1.14", 1110 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", 1111 | "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", 1112 | "requires": { 1113 | "core-util-is": "~1.0.0", 1114 | "inherits": "~2.0.1", 1115 | "isarray": "0.0.1", 1116 | "string_decoder": "~0.10.x" 1117 | } 1118 | }, 1119 | "regexp-clone": { 1120 | "version": "1.0.0", 1121 | "resolved": "https://registry.npmjs.org/regexp-clone/-/regexp-clone-1.0.0.tgz", 1122 | "integrity": "sha512-TuAasHQNamyyJ2hb97IuBEif4qBHGjPHBS64sZwytpLEqtBQ1gPJTnOaQ6qmpET16cK14kkjbazl6+p0RRv0yw==" 1123 | }, 1124 | "request": { 1125 | "version": "2.88.2", 1126 | "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", 1127 | "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", 1128 | "requires": { 1129 | "aws-sign2": "~0.7.0", 1130 | "aws4": "^1.8.0", 1131 | "caseless": "~0.12.0", 1132 | "combined-stream": "~1.0.6", 1133 | "extend": "~3.0.2", 1134 | "forever-agent": "~0.6.1", 1135 | "form-data": "~2.3.2", 1136 | "har-validator": "~5.1.3", 1137 | "http-signature": "~1.2.0", 1138 | "is-typedarray": "~1.0.0", 1139 | "isstream": "~0.1.2", 1140 | "json-stringify-safe": "~5.0.1", 1141 | "mime-types": "~2.1.19", 1142 | "oauth-sign": "~0.9.0", 1143 | "performance-now": "^2.1.0", 1144 | "qs": "~6.5.2", 1145 | "safe-buffer": "^5.1.2", 1146 | "tough-cookie": "~2.5.0", 1147 | "tunnel-agent": "^0.6.0", 1148 | "uuid": "^3.3.2" 1149 | }, 1150 | "dependencies": { 1151 | "form-data": { 1152 | "version": "2.3.3", 1153 | "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", 1154 | "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", 1155 | "requires": { 1156 | "asynckit": "^0.4.0", 1157 | "combined-stream": "^1.0.6", 1158 | "mime-types": "^2.1.12" 1159 | } 1160 | }, 1161 | "qs": { 1162 | "version": "6.5.2", 1163 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", 1164 | "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==" 1165 | } 1166 | } 1167 | }, 1168 | "request-promise-core": { 1169 | "version": "1.1.4", 1170 | "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.4.tgz", 1171 | "integrity": "sha512-TTbAfBBRdWD7aNNOoVOBH4pN/KigV6LyapYNNlAPA8JwbovRti1E88m3sYAwsLi5ryhPKsE9APwnjFTgdUjTpw==", 1172 | "requires": { 1173 | "lodash": "^4.17.19" 1174 | } 1175 | }, 1176 | "request-promise-native": { 1177 | "version": "1.0.9", 1178 | "resolved": "https://registry.npmjs.org/request-promise-native/-/request-promise-native-1.0.9.tgz", 1179 | "integrity": "sha512-wcW+sIUiWnKgNY0dqCpOZkUbF/I+YPi+f09JZIDa39Ec+q82CpSYniDp+ISgTTbKmnpJWASeJBPZmoxH84wt3g==", 1180 | "requires": { 1181 | "request-promise-core": "1.1.4", 1182 | "stealthy-require": "^1.1.1", 1183 | "tough-cookie": "^2.3.3" 1184 | } 1185 | }, 1186 | "requires-port": { 1187 | "version": "1.0.0", 1188 | "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", 1189 | "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=" 1190 | }, 1191 | "rootpath": { 1192 | "version": "0.1.2", 1193 | "resolved": "https://registry.npmjs.org/rootpath/-/rootpath-0.1.2.tgz", 1194 | "integrity": "sha1-Wzeah9ypBum5HWkKWZQ5vvJn6ms=" 1195 | }, 1196 | "safe-buffer": { 1197 | "version": "5.1.2", 1198 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 1199 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" 1200 | }, 1201 | "safer-buffer": { 1202 | "version": "2.1.2", 1203 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", 1204 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" 1205 | }, 1206 | "saslprep": { 1207 | "version": "1.0.3", 1208 | "resolved": "https://registry.npmjs.org/saslprep/-/saslprep-1.0.3.tgz", 1209 | "integrity": "sha512-/MY/PEMbk2SuY5sScONwhUDsV2p77Znkb/q3nSVstq/yQzYJOH/Azh29p9oJLsl3LnQwSvZDKagDGBsBwSooag==", 1210 | "optional": true, 1211 | "requires": { 1212 | "sparse-bitfield": "^3.0.3" 1213 | } 1214 | }, 1215 | "scmp": { 1216 | "version": "2.1.0", 1217 | "resolved": "https://registry.npmjs.org/scmp/-/scmp-2.1.0.tgz", 1218 | "integrity": "sha512-o/mRQGk9Rcer/jEEw/yw4mwo3EU/NvYvp577/Btqrym9Qy5/MdWGBqipbALgd2lrdWTJ5/gqDusxfnQBxOxT2Q==" 1219 | }, 1220 | "semver": { 1221 | "version": "5.7.1", 1222 | "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", 1223 | "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" 1224 | }, 1225 | "send": { 1226 | "version": "0.17.1", 1227 | "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", 1228 | "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", 1229 | "requires": { 1230 | "debug": "2.6.9", 1231 | "depd": "~1.1.2", 1232 | "destroy": "~1.0.4", 1233 | "encodeurl": "~1.0.2", 1234 | "escape-html": "~1.0.3", 1235 | "etag": "~1.8.1", 1236 | "fresh": "0.5.2", 1237 | "http-errors": "~1.7.2", 1238 | "mime": "1.6.0", 1239 | "ms": "2.1.1", 1240 | "on-finished": "~2.3.0", 1241 | "range-parser": "~1.2.1", 1242 | "statuses": "~1.5.0" 1243 | }, 1244 | "dependencies": { 1245 | "ms": { 1246 | "version": "2.1.1", 1247 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", 1248 | "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" 1249 | } 1250 | } 1251 | }, 1252 | "serve-static": { 1253 | "version": "1.14.1", 1254 | "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz", 1255 | "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==", 1256 | "requires": { 1257 | "encodeurl": "~1.0.2", 1258 | "escape-html": "~1.0.3", 1259 | "parseurl": "~1.3.3", 1260 | "send": "0.17.1" 1261 | } 1262 | }, 1263 | "setprototypeof": { 1264 | "version": "1.1.1", 1265 | "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", 1266 | "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==" 1267 | }, 1268 | "side-channel": { 1269 | "version": "1.0.4", 1270 | "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", 1271 | "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", 1272 | "requires": { 1273 | "call-bind": "^1.0.0", 1274 | "get-intrinsic": "^1.0.2", 1275 | "object-inspect": "^1.9.0" 1276 | } 1277 | }, 1278 | "sift": { 1279 | "version": "13.5.2", 1280 | "resolved": "https://registry.npmjs.org/sift/-/sift-13.5.2.tgz", 1281 | "integrity": "sha512-+gxdEOMA2J+AI+fVsCqeNn7Tgx3M9ZN9jdi95939l1IJ8cZsqS8sqpJyOkic2SJk+1+98Uwryt/gL6XDaV+UZA==" 1282 | }, 1283 | "sliced": { 1284 | "version": "1.0.1", 1285 | "resolved": "https://registry.npmjs.org/sliced/-/sliced-1.0.1.tgz", 1286 | "integrity": "sha1-CzpmK10Ewxd7GSa+qCsD+Dei70E=" 1287 | }, 1288 | "sparse-bitfield": { 1289 | "version": "3.0.3", 1290 | "resolved": "https://registry.npmjs.org/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz", 1291 | "integrity": "sha1-/0rm5oZWBWuks+eSqzM004JzyhE=", 1292 | "optional": true, 1293 | "requires": { 1294 | "memory-pager": "^1.0.2" 1295 | } 1296 | }, 1297 | "sshpk": { 1298 | "version": "1.16.1", 1299 | "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", 1300 | "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", 1301 | "requires": { 1302 | "asn1": "~0.2.3", 1303 | "assert-plus": "^1.0.0", 1304 | "bcrypt-pbkdf": "^1.0.0", 1305 | "dashdash": "^1.12.0", 1306 | "ecc-jsbn": "~0.1.1", 1307 | "getpass": "^0.1.1", 1308 | "jsbn": "~0.1.0", 1309 | "safer-buffer": "^2.0.2", 1310 | "tweetnacl": "~0.14.0" 1311 | } 1312 | }, 1313 | "statuses": { 1314 | "version": "1.5.0", 1315 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", 1316 | "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" 1317 | }, 1318 | "stealthy-require": { 1319 | "version": "1.1.1", 1320 | "resolved": "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz", 1321 | "integrity": "sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks=" 1322 | }, 1323 | "string_decoder": { 1324 | "version": "0.10.31", 1325 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", 1326 | "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" 1327 | }, 1328 | "toidentifier": { 1329 | "version": "1.0.0", 1330 | "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", 1331 | "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==" 1332 | }, 1333 | "touch": { 1334 | "version": "0.0.3", 1335 | "resolved": "https://registry.npmjs.org/touch/-/touch-0.0.3.tgz", 1336 | "integrity": "sha1-Ua7z1ElXHU8oel2Hyci0kYGg2x0=", 1337 | "requires": { 1338 | "nopt": "~1.0.10" 1339 | }, 1340 | "dependencies": { 1341 | "nopt": { 1342 | "version": "1.0.10", 1343 | "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz", 1344 | "integrity": "sha1-bd0hvSoxQXuScn3Vhfim83YI6+4=", 1345 | "requires": { 1346 | "abbrev": "1" 1347 | } 1348 | } 1349 | } 1350 | }, 1351 | "tough-cookie": { 1352 | "version": "2.5.0", 1353 | "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", 1354 | "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", 1355 | "requires": { 1356 | "psl": "^1.1.28", 1357 | "punycode": "^2.1.1" 1358 | } 1359 | }, 1360 | "traverse": { 1361 | "version": "0.3.9", 1362 | "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.3.9.tgz", 1363 | "integrity": "sha1-cXuPIgzAu3tE5AUUwisui7xw2Lk=" 1364 | }, 1365 | "tunnel-agent": { 1366 | "version": "0.6.0", 1367 | "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", 1368 | "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", 1369 | "requires": { 1370 | "safe-buffer": "^5.0.1" 1371 | } 1372 | }, 1373 | "tweetnacl": { 1374 | "version": "0.14.5", 1375 | "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", 1376 | "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=" 1377 | }, 1378 | "twilio": { 1379 | "version": "3.63.0", 1380 | "resolved": "https://registry.npmjs.org/twilio/-/twilio-3.63.0.tgz", 1381 | "integrity": "sha512-ftZckbTBjJ5dgzdII9j0sqYw9SYq3wqTC9r6NmV7CRU0EXXDil5/AbKb78xNPLtMPx3+mn2N+2oTkQlTtWs9TQ==", 1382 | "requires": { 1383 | "axios": "^0.21.1", 1384 | "dayjs": "^1.8.29", 1385 | "https-proxy-agent": "^5.0.0", 1386 | "jsonwebtoken": "^8.5.1", 1387 | "lodash": "^4.17.19", 1388 | "q": "2.0.x", 1389 | "qs": "^6.9.4", 1390 | "rootpath": "^0.1.2", 1391 | "scmp": "^2.1.0", 1392 | "url-parse": "^1.5.0", 1393 | "xmlbuilder": "^13.0.2" 1394 | }, 1395 | "dependencies": { 1396 | "q": { 1397 | "version": "2.0.3", 1398 | "resolved": "https://registry.npmjs.org/q/-/q-2.0.3.tgz", 1399 | "integrity": "sha1-dbjbAlWhpa+C9Yw/Oqoe/sfQ0TQ=", 1400 | "requires": { 1401 | "asap": "^2.0.0", 1402 | "pop-iterate": "^1.0.1", 1403 | "weak-map": "^1.0.5" 1404 | } 1405 | }, 1406 | "qs": { 1407 | "version": "6.10.1", 1408 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.1.tgz", 1409 | "integrity": "sha512-M528Hph6wsSVOBiYUnGf+K/7w0hNshs/duGsNXPUCLH5XAqjEtiPGwNONLV0tBH8NoGb0mvD5JubnUTrujKDTg==", 1410 | "requires": { 1411 | "side-channel": "^1.0.4" 1412 | } 1413 | } 1414 | } 1415 | }, 1416 | "type-is": { 1417 | "version": "1.6.18", 1418 | "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", 1419 | "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", 1420 | "requires": { 1421 | "media-typer": "0.3.0", 1422 | "mime-types": "~2.1.24" 1423 | } 1424 | }, 1425 | "tz-offset": { 1426 | "version": "0.0.1", 1427 | "resolved": "https://registry.npmjs.org/tz-offset/-/tz-offset-0.0.1.tgz", 1428 | "integrity": "sha512-kMBmblijHJXyOpKzgDhKx9INYU4u4E1RPMB0HqmKSgWG8vEcf3exEfLh4FFfzd3xdQOw9EuIy/cP0akY6rHopQ==" 1429 | }, 1430 | "underscore": { 1431 | "version": "1.13.1", 1432 | "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.1.tgz", 1433 | "integrity": "sha512-hzSoAVtJF+3ZtiFX0VgfFPHEDRm7Y/QPjGyNo4TVdnDTdft3tr8hEkD25a1jC+TjTuE7tkHGKkhwCgs9dgBB2g==" 1434 | }, 1435 | "unpipe": { 1436 | "version": "1.0.0", 1437 | "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", 1438 | "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" 1439 | }, 1440 | "uri-js": { 1441 | "version": "4.2.2", 1442 | "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", 1443 | "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", 1444 | "requires": { 1445 | "punycode": "^2.1.0" 1446 | } 1447 | }, 1448 | "url-parse": { 1449 | "version": "1.5.8", 1450 | "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.8.tgz", 1451 | "integrity": "sha512-9JZ5zDrn9wJoOy/t+rH00HHejbU8dq9VsOYVu272TYDrCiyVAgHKUSpPh3ruZIpv8PMVR+NXLZvfRPJv8xAcQw==", 1452 | "requires": { 1453 | "querystringify": "^2.1.1", 1454 | "requires-port": "^1.0.0" 1455 | } 1456 | }, 1457 | "util-deprecate": { 1458 | "version": "1.0.2", 1459 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", 1460 | "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" 1461 | }, 1462 | "utils-merge": { 1463 | "version": "1.0.1", 1464 | "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", 1465 | "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" 1466 | }, 1467 | "uuid": { 1468 | "version": "3.4.0", 1469 | "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", 1470 | "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" 1471 | }, 1472 | "vary": { 1473 | "version": "1.1.2", 1474 | "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", 1475 | "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" 1476 | }, 1477 | "verror": { 1478 | "version": "1.10.0", 1479 | "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", 1480 | "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", 1481 | "requires": { 1482 | "assert-plus": "^1.0.0", 1483 | "core-util-is": "1.0.2", 1484 | "extsprintf": "^1.2.0" 1485 | } 1486 | }, 1487 | "weak-map": { 1488 | "version": "1.0.5", 1489 | "resolved": "https://registry.npmjs.org/weak-map/-/weak-map-1.0.5.tgz", 1490 | "integrity": "sha1-eWkVhNmGB/UHC9O3CkDmuyLkAes=" 1491 | }, 1492 | "xmlbuilder": { 1493 | "version": "13.0.2", 1494 | "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-13.0.2.tgz", 1495 | "integrity": "sha512-Eux0i2QdDYKbdbA6AM6xE4m6ZTZr4G4xF9kahI2ukSEMCzwce2eX9WlTI5J3s+NU7hpasFsr8hWIONae7LluAQ==" 1496 | } 1497 | } 1498 | } 1499 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "rebot", 3 | "version": "1.0.0", 4 | "description": "A whatsapp bot that reminds you via text messages.", 5 | "main": "server.js", 6 | "scripts": { 7 | "start": "node server.js" 8 | }, 9 | "author": "Shashank Pathak", 10 | "license": "ISC", 11 | "dependencies": { 12 | "body-parser": "^1.19.0", 13 | "dotenv": "^8.2.0", 14 | "express": "^4.17.1", 15 | "google-libphonenumber": "^3.2.10", 16 | "lodash": "^4.17.21", 17 | "luxon": "^1.24.1", 18 | "md5": "^2.3.0", 19 | "moment": "^2.27.0", 20 | "moment-timezone": "^0.5.31", 21 | "mongoose": "^5.12.11", 22 | "mongoose-encryption": "^2.0.2", 23 | "ngrok": "^3.2.7", 24 | "node-cron": "^2.0.3", 25 | "twilio": "^3.63.0" 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /rebot.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | 113 | 114 | 115 | 116 | 117 | 118 | 119 | 120 | 121 | 122 | 123 | 124 | 125 | 126 | 127 | 128 | 129 | 130 | 131 | 132 | 133 | 134 | 135 | 136 | 137 | 138 | 139 | 140 | 141 | 142 | 143 | 144 | 145 | 146 | 147 | 148 | 149 | 150 | 151 | 152 | 153 | 154 | 155 | 156 | 157 | 158 | 159 | 160 | 161 | 162 | 163 | 164 | 165 | 166 | 167 | 168 | 169 | 170 | 171 | 172 | 173 | 174 | 175 | 176 | 177 | 178 | 179 | 180 | 181 | 182 | 183 | 184 | 185 | 186 | 187 | 188 | 189 | 190 | 191 | 192 | 193 | 194 | 195 | 196 | 197 | 198 | 199 | 200 | 201 | 202 | 203 | 204 | 205 | 206 | 207 | 208 | 209 | 210 | 211 | 212 | 213 | 214 | 215 | 216 | 217 | 218 | 219 | 220 | 221 | 222 | 223 | 224 | 225 | 226 | 227 | 228 | 229 | 230 | 231 | 232 | 233 | 234 | 235 | 236 | 237 | 238 | 239 | 240 | 241 | 242 | 243 | 244 | 245 | 246 | 247 | 248 | 249 | 250 | 251 | 252 | 253 | 254 | 255 | 256 | 257 | 258 | 259 | 260 | 261 | 262 | 263 | 264 | 265 | 266 | 267 | 268 | 269 | 270 | 271 | 272 | 273 | 274 | 275 | 276 | 277 | 278 | 279 | 280 | 281 | 282 | 283 | 284 | 285 | 286 | 287 | 288 | 289 | 290 | 291 | 292 | 293 | 294 | 295 | 296 | 297 | 298 | 299 | 300 | 301 | 302 | 303 | 304 | 305 | 306 | 307 | 308 | 309 | 310 | 311 | 312 | 313 | 314 | 315 | 316 | 317 | 318 | 319 | 320 | 321 | 322 | 323 | 324 | 325 | 326 | 327 | 328 | 329 | 330 | 331 | 332 | 333 | 334 | 335 | 336 | 337 | 338 | 339 | 340 | 341 | 342 | 343 | 344 | 345 | 346 | 347 | 348 | 349 | 350 | 351 | 352 | 353 | 354 | 355 | 356 | 357 | 358 | 359 | 360 | 361 | 362 | 363 | 364 | 365 | 366 | 367 | 368 | 369 | 370 | 371 | 372 | 373 | 374 | 375 | 376 | 377 | 378 | 379 | 380 | 381 | 382 | 383 | 384 | 385 | 386 | 387 | 388 | 389 | 390 | 391 | 392 | 393 | 394 | 395 | 396 | 397 | 398 | 399 | 400 | 401 | 402 | 403 | 404 | 405 | 406 | 407 | 408 | 409 | 410 | 411 | 412 | 413 | 414 | 415 | 416 | 417 | 418 | 419 | 420 | 421 | 422 | 423 | 424 | 425 | 426 | 427 | 428 | 429 | 430 | 431 | 432 | 433 | 434 | 435 | 436 | 437 | 438 | 439 | 440 | 441 | 442 | 443 | 444 | 445 | 446 | 447 | 448 | 449 | 450 | 451 | 452 | 453 | 454 | 455 | 456 | 457 | 458 | 459 | 460 | 461 | 462 | 463 | 464 | 465 | 466 | 467 | 468 | 469 | 470 | 471 | 472 | 473 | 474 | 475 | 476 | 477 | 478 | 479 | 480 | 481 | 482 | 483 | 484 | 485 | 486 | 487 | 488 | 489 | 490 | 491 | 492 | 493 | 494 | 495 | 496 | 497 | 498 | 499 | 500 | 501 | 502 | 503 | 504 | -------------------------------------------------------------------------------- /server.js: -------------------------------------------------------------------------------- 1 | require('dotenv').config(); 2 | const express = require("express"); 3 | const twilio = require("twilio"); 4 | const mongoose = require("mongoose"); 5 | const encrypt = require("mongoose-encryption"); 6 | const bodyParser = require('body-parser'); 7 | const _ = require("lodash"); 8 | const cron = require("node-cron"); 9 | const moment = require("moment-timezone"); 10 | const app = express(); 11 | const SID = process.env.SID; 12 | const AUTH_TOKEN = process.env.AUTH_TOKEN; 13 | const client = new twilio(SID, AUTH_TOKEN); 14 | const { extractClientNumber, sendMessage, testInput } = require("./utils/utils.js"); 15 | 16 | app.use(bodyParser.urlencoded({ extended: false })); 17 | 18 | // Connecting to database 19 | mongoose.connect(process.env.DB_URI, { useNewUrlParser: true, useUnifiedTopology: true }) 20 | 21 | // Database schema 22 | const reminderSchema = new mongoose.Schema({ 23 | taskName: String, 24 | taskTime: String, 25 | taskTimeOG: String, 26 | clientNumber: String 27 | }); 28 | reminderSchema.plugin(encrypt, { 29 | secret: process.env.SECRET, 30 | encryptedFields: ['taskName'] 31 | }); 32 | const Reminder = mongoose.model('Reminder', reminderSchema); 33 | 34 | // Searches the database for reminders per minute 35 | cron.schedule('* * * * *', () => { 36 | console.log("Checking database..."); 37 | const isoString = new Date().toISOString(); 38 | const currTime = moment.tz(isoString, "Asia/Kolkata").format().slice(0, 16); 39 | console.log(currTime); 40 | Reminder.find({ taskTime: currTime }, (err, tasks) => { 41 | if (err) { 42 | console.log(err); 43 | } else { 44 | 45 | // Creating a throttled function that sends messages slowly 46 | var throttledFunction = _.throttle((task) => { 47 | client.messages 48 | .create({ 49 | body: `Here's your reminder for *${task.taskName}*`, 50 | from: "whatsapp:" + process.env.SERVER_NUMBER, 51 | to: "whatsapp:" + task.clientNumber 52 | }, (err, response) => { 53 | if (err) { 54 | console.log(err); 55 | } else { 56 | console.log(`Sent a message!`); 57 | } 58 | }); 59 | }, 1000); 60 | 61 | // Calling throttled function to send message 62 | for (var i = 0; i < tasks.length; i++) { 63 | throttledFunction(tasks[i]); 64 | } 65 | 66 | // Removing reminded tasks 67 | tasks.forEach((task) => { 68 | task.remove(); 69 | }); 70 | } 71 | }); 72 | console.log("Search complete"); 73 | }); 74 | 75 | // Handles incoming messages 76 | app.post("/incoming", (req, res) => { 77 | const query = req.body.Body.split(' '); 78 | const clientNumber = extractClientNumber(req.body.From); 79 | const action = _.lowerCase(query[0]); 80 | 81 | // Creating reminders 82 | if (action === "set") { 83 | // Send instructions 84 | if (!query[1]) { 85 | sendMessage("Format: \n *set* _task(required, no spaces)_ _time(required, in HHMM format)_ _date(optional, in DD/MM format, default is today)_", res); 86 | } 87 | else { 88 | 89 | const taskName = query[1]; 90 | const time = query[2]; 91 | var hours = parseInt(time.slice(0, 2)); 92 | var minutes = parseInt(time.slice(2, 4)); 93 | var year = new Date().getUTCFullYear(); 94 | 95 | // For today 96 | if (!query[3] || query[3] === "today") { 97 | if (testInput(query)) { 98 | const istString = moment.tz(new Date().toISOString(), "Asia/Kolkata").format().slice(0, 16); 99 | var month = istString.slice(5, 7); 100 | var date = istString.slice(8, 10); 101 | const isoString = new Date(year, month - 1, date, hours, minutes, 0, 0).toISOString(); 102 | const taskTime = isoString.slice(0, 16); 103 | console.log(`Reminder created for: ${taskTime}`); 104 | const taskInfo = new Reminder({ 105 | taskName: taskName, 106 | taskTime: taskTime, 107 | taskTimeOG: new Date(year, month - 1, date, hours, minutes, 0, 0).toDateString().slice(0, 16) + " at " + new Date(year, month - 1, date, hours, minutes, 0, 0).toTimeString().slice(0, 5), 108 | clientNumber: clientNumber 109 | }); 110 | taskInfo.save((err) => { 111 | if (err) { 112 | console.log(err) 113 | } else { 114 | sendMessage(`Ok, will remind about *${taskName}*`, res); 115 | } 116 | }); 117 | } else { 118 | sendMessage("Please enter valid inputs and try again. Possible error: *Inputs not according to specified format* or *Reminder time given in past* (I hope you know time travel isn't possible yet)", res); 119 | } 120 | } 121 | 122 | // For any day 123 | else { 124 | if (testInput(query)) { 125 | const dateMonthString = query[3]; 126 | var date = parseInt(dateMonthString.split('/')[0]); 127 | var month = parseInt(dateMonthString.split('/')[1]) - 1; 128 | const isoString = new Date(year, month, date, hours, minutes, 0, 0).toISOString(); 129 | const taskTime = isoString.slice(0, 16); 130 | console.log(`Reminder created for *${taskTime}*`); 131 | const taskInfo = new Reminder({ 132 | taskName: taskName, 133 | taskTime: taskTime, 134 | taskTimeOG: new Date(year, month, date, hours, minutes, 0, 0).toDateString().slice(0, 16) + " at " + new Date(year, month, date, hours, minutes, 0, 0).toTimeString().slice(0, 5), 135 | clientNumber: clientNumber 136 | }); 137 | taskInfo.save((err) => { 138 | if (err) { 139 | console.log(err) 140 | } else { 141 | sendMessage(`Ok, will remind you about *${taskName}*`, res); 142 | } 143 | }); 144 | } else { 145 | sendMessage("Please enter valid inputs and try again. Possible error: *Inputs not according to specified format* or *Reminder time given in past* (I hope you know time travel isn't possible yet)", res); 146 | } 147 | } 148 | } 149 | } 150 | 151 | // View reminders 152 | else if (action === "view") { 153 | console.log("view"); 154 | Reminder.find( 155 | { clientNumber: clientNumber }, 156 | (err, foundTasks) => { 157 | if (err) { 158 | console.log(err); 159 | } else if (foundTasks.length) { 160 | const upcomingTasks = []; 161 | foundTasks.forEach((task) => { 162 | var subMessage = `*${task.taskName}* at *${task.taskTimeOG}*`; 163 | upcomingTasks.push(subMessage); 164 | }); 165 | sendMessage(upcomingTasks.join('\n'), res); 166 | } else if (!foundTasks.length) { 167 | sendMessage("You don't have any upcoming tasks. Create some first. To know how to create type *set* to get insight.", res); 168 | } 169 | } 170 | ); 171 | } else { 172 | sendMessage("I don't know what that means. Try *set* or *view*", res); 173 | } 174 | }); 175 | 176 | app.get("/", (req, res) => { 177 | res.send("Hi! You've just found the server of Rebot. Welcome"); 178 | }); 179 | 180 | app.listen(process.env.PORT || 3000, () => { 181 | console.log("Server started."); 182 | }); -------------------------------------------------------------------------------- /utils/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name" : "utils", 3 | "main" : "./utils.js" 4 | } -------------------------------------------------------------------------------- /utils/utils.js: -------------------------------------------------------------------------------- 1 | const MessagingResponse = require('../node_modules/twilio/lib/twiml/MessagingResponse'); 2 | const moment = require("moment-timezone"); 3 | 4 | module.exports = { 5 | extractClientNumber: (ogNumber) => { 6 | const number = ogNumber.split(':'); 7 | return number[1]; 8 | }, 9 | sendMessage: (msg, res) => { 10 | const twiml = new MessagingResponse(); 11 | twiml.message(msg); 12 | res.writeHead(200, { 'Content-Type': 'text/xml' }); 13 | res.end(twiml.toString()); 14 | }, 15 | testInput: (query) => { 16 | const istString = moment.tz(new Date().toISOString(), "Asia/Kolkata").format().slice(0, 16) + ":00.000Z"; 17 | const currEpoch = Date.parse(istString); 18 | if (query[2].length !== 4) { // Checking if time is not in HHMM format 19 | return false; 20 | } 21 | if (query[3] && query[3] !== "today") { // Checking if date-month is not in DD/MM format 22 | if (query[3].split('/').length !== 2) { 23 | return false; 24 | } 25 | } 26 | const hour = query[2].slice(0, 2); 27 | const minutes = query[2].slice(2, 4); 28 | if (!query[3] || query[3] === "today") { 29 | const year = istString.slice(0, 4); 30 | const month = istString.slice(5, 7) - 1; 31 | const date = istString.slice(8, 10); 32 | const userString = new Date(year, month, date, hour, minutes, 0, 0).toISOString(); 33 | const userEpoch = Date.parse(userString); 34 | if (userEpoch > currEpoch) { // Checking if user input not in past 35 | return true; 36 | } 37 | } else { 38 | const year = istString.slice(0, 4); 39 | const month = query[3].split('/')[1] - 1; 40 | const date = query[3].split('/')[0]; 41 | const userString = new Date(year, month, date, hour, minutes, 0, 0).toISOString(); 42 | const userEpoch = Date.parse(userString); 43 | if (userEpoch > currEpoch) { // Checking if user input not in past 44 | return true; 45 | } 46 | } 47 | return false; 48 | } 49 | }; --------------------------------------------------------------------------------