commit f1a42db8c3626a4d764500bb074186267483a1c0 Author: Robert Date: Sun Jun 18 20:28:32 2023 +0200 initial commit diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..16d8d68 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +build/ +node_modules/ \ No newline at end of file diff --git a/config.json b/config.json new file mode 100644 index 0000000..45a57cc --- /dev/null +++ b/config.json @@ -0,0 +1,9 @@ +{ + "instance": "", + "username": "", + "password": "", + + "instances": [ + + ] +} \ No newline at end of file diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..2c6993c --- /dev/null +++ b/package-lock.json @@ -0,0 +1,145 @@ +{ + "name": "lemmy_federator", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "dependencies": { + "lemmy-js-client": "^0.18.0-rc.1", + "typescript": "^5.1.3" + }, + "devDependencies": { + "@types/node": "^20.3.1" + } + }, + "node_modules/@types/node": { + "version": "20.3.1", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.3.1.tgz", + "integrity": "sha512-EhcH/wvidPy1WeML3TtYFGR83UzjxeWRen9V402T8aUGYsCHOmfoisV3ZSg03gAFIbLq8TnWOJ0f4cALtnSEUg==", + "dev": true + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/cross-fetch": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.6.tgz", + "integrity": "sha512-riRvo06crlE8HiqOwIpQhxwdOk4fOeR7FVM/wXoxchFEqMNUjvbs3bfo4OTgMEMHzppd4DxFBDbyySj8Cv781g==", + "dependencies": { + "node-fetch": "^2.6.11" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/lemmy-js-client": { + "version": "0.18.0-rc.1", + "resolved": "https://registry.npmjs.org/lemmy-js-client/-/lemmy-js-client-0.18.0-rc.1.tgz", + "integrity": "sha512-lQe443Nr5UCSoY+IxmT7mBe0IRF6EAZ/4PJSRoPSL+U8A+egMMBPbuxnisHzLsC+eDOWRUIgOqZlwlaRnbmuig==", + "dependencies": { + "cross-fetch": "^3.1.5", + "form-data": "^4.0.0" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/node-fetch": { + "version": "2.6.11", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.11.tgz", + "integrity": "sha512-4I6pdBY1EthSqDmJkiNk3JIT8cswwR9nfeW/cPdUagJYEQG7R95WRH74wpz7ma8Gh/9dI9FP+OU+0E4FvtA55w==", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" + }, + "node_modules/typescript": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.1.3.tgz", + "integrity": "sha512-XH627E9vkeqhlZFQuL+UsyAXEnibT0kWR2FWONlr4sTjvxyJYnyefgrkyECLzM5NenmKzRAy2rR/OlYLA1HkZw==", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" + }, + "node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..e867a55 --- /dev/null +++ b/package.json @@ -0,0 +1,10 @@ +{ + "type": "module", + "dependencies": { + "lemmy-js-client": "^0.18.0-rc.1", + "typescript": "^5.1.3" + }, + "devDependencies": { + "@types/node": "^20.3.1" + } +} diff --git a/src/bot.ts b/src/bot.ts new file mode 100644 index 0000000..17ad95f --- /dev/null +++ b/src/bot.ts @@ -0,0 +1,50 @@ +import { Login, LemmyHttp } from 'lemmy-js-client'; +import { exit } from 'process'; +import { readFile } from 'fs'; + +readFile("config.json", async (err, data) => { + if (err || !data) { + console.error("Failed to load config.json") + console.error("Make sure it is located in the directory you execute the bot from") + exit(1); + } + + let config = JSON.parse(data.toString()); + + let baseUrl = config.instance; + let client: LemmyHttp = new LemmyHttp(baseUrl); + let form: Login = { + username_or_email: config.username, + password: config.password + }; + + let jwt; + try { + jwt = await client.login(form) + } catch { + console.error(`Account ${config.username} doesn't exist on that instance yet.`); + console.error("Please register an account with that name on that instance before trying again"); + exit(1); + } + + config.instances.forEach(async (instance) => { + let page = 0; + + while (true) { + let communities = (await client.listCommunities({ + auth: jwt.jwt, + page: page, + })).communities; + + if (communities.length === 0) { + break; + } + + console.log(communities); + + page += 1; + } + + + }); +}); diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..1fdd5e6 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,12 @@ +{ + "compilerOptions": { + "module": "ESNext", + "moduleResolution": "node", + "outDir": "build", + "rootDir": "src", + "target": "ES2017" + }, + "exclude": [ + "node_modules" + ] +} \ No newline at end of file