├── .gitignore ├── .github └── workflows │ └── npmpublish.yml ├── package.json ├── LICENSE ├── test └── test.js ├── README.md ├── request.js ├── examples └── METHODS.md └── sdc.js /.gitignore: -------------------------------------------------------------------------------- 1 | .idea -------------------------------------------------------------------------------- /.github/workflows/npmpublish.yml: -------------------------------------------------------------------------------- 1 | name: Node.js Package 2 | 3 | on: 4 | push: 5 | branches: 6 | - master 7 | 8 | jobs: 9 | publish-gpr: 10 | runs-on: ubuntu-latest 11 | steps: 12 | - uses: actions/checkout@v1 13 | - uses: actions/setup-node@v1 14 | with: 15 | node-version: 12 16 | registry-url: https://npm.pkg.github.com/ 17 | scope: '@megavasiliy007' 18 | - run: npm publish 19 | env: 20 | NODE_AUTH_TOKEN: ${{secrets.github}} 21 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@megavasiliy007/sdc-api", 3 | "version": "1.1.5", 4 | "description": "Простая и удобная библиотека для работы с API сайта server-discord.com", 5 | 6 | "main": "sdc.js", 7 | "license": "MIT", 8 | 9 | "author": { 10 | "name": "SD.C Community", 11 | "url": "https://server-discord.com/" 12 | }, 13 | 14 | "keywords": [ 15 | "sdc", 16 | "discord", 17 | "api", 18 | "server-discord", 19 | "sdc-api", 20 | "@megavasiliy007/sdc-api" 21 | ], 22 | 23 | "repository": { 24 | "type": "git", 25 | "url": "https://github.com/MegaVasiliy007/sdc-api.git" 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2019 Василий 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 | -------------------------------------------------------------------------------- /test/test.js: -------------------------------------------------------------------------------- 1 | function message(type, argone, argtwo, argthree) { 2 | console.log("============================================"); 3 | console.log(" "); 4 | if (type === "error") { 5 | console.log(`Ошибка: ${argone}`); 6 | console.log(`Код ошибки: ${argtwo}`); 7 | console.log(`Дополнительно: ${argthree}`); 8 | } 9 | if (type === "info") { 10 | console.log(`ID: ${argone}`); 11 | console.log(`Тип спамера: ${argtwo}`); 12 | console.log(`Предупреждений: ${argthree}`); 13 | } 14 | console.log(" "); 15 | console.log("============================================"); 16 | } 17 | 18 | let apiKey = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6IjU2MzIwMzA3Mjk5MDY0MjE4NiIsInBlcm1zIjowLCJpYXQiOjE1NzcxMjE4NDZ9.Y5qSkDQhOLsLbE6tcyp9e4ua0FtCrN1ykBBe0rJ9TXo"; 19 | // API ключ можно получить на странице редактирования вашего бота 20 | 21 | const SDC = require("../sdc"); 22 | const client = new SDC(apiKey); 23 | 24 | client.warns("178404926869733376").then((res) => { 25 | if (res.error) return message("error", res.error.type, res.error.code, res.error.message); 26 | else return message("info", res.id, res.type === "user" ? "Пользователь" : "Сервер", res.warns); 27 | }); 28 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # sdc-api 2 | Небольшой модуль-враппер который позволяет вам легко взаимодействовать с [Server-Discord API](https://docs.server-discord.com). 3 | 4 | ## Установка 5 | ```sh 6 | $ npm install github:MegaVasiliy007/sdc-api 7 | ``` 8 | После установки, враппер будет определяться как `@megavasiliy007/sdc-api` 9 | 10 | ## Инициализация враппера 11 | ```js 12 | let apiKey = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6IjU2MzIwMzA3Mjk5MDY0MjE4NiIsInBlcm1zIjowLCJpYXQiOjE1NzcxMjE4NDZ9.Y5qSkDQhOLsLbE6tcyp9e4ua0FtCrN1ykBBe0rJ9TXo"; 13 | // API ключ можно получить на странице редактирования вашего бота 14 | 15 | const SDC = require("@megavasiliy007/sdc-api"); 16 | const client = new SDC(apiKey); 17 | ``` 18 | 19 | ## Примеры кода 20 | ```js 21 | // Проверка на варны 22 | client.warns("178404926869733376") 23 | .then((data) => { 24 | console.info(data); 25 | /* { 26 | "id": "178404926869733376", 27 | "type": "user", 28 | "warns": 1 29 | } */ 30 | }); 31 | 32 | // Получить текущее место сервера на мониторинге 33 | client.guildPlace("577798137230655508") 34 | .then((data) => { 35 | console.info(data); 36 | /* { 37 | "place": 199 38 | } */ 39 | }); 40 | 41 | // Получить всех проголосовавших пользователей и их оценки 42 | client.guildRated("640586112624230450") 43 | .then((data) => { 44 | console.info(data); 45 | /* { 46 | "178404926869733376": 1, 47 | "279220345767198723": 1, 48 | "340938899285344258": 1, 49 | "368463408112205826": 1, 50 | "418712700848439318": 1, 51 | "533245137216864286": 1 52 | } */ 53 | }); 54 | 55 | // Отправлять статистику на мониторинг каждые 30 минут 56 | client.setAutoPost(bot); 57 | ``` 58 | 59 | Все методы враппера: **[клик](https://github.com/MegaVasiliy007/sdc-api/blob/master/examples/METHODS.md)**. 60 | -------------------------------------------------------------------------------- /request.js: -------------------------------------------------------------------------------- 1 | /* jshint esversion: 6 */ 2 | 3 | const botsPath = "https://bots.server-discord.com"; 4 | const { stringify } = require('querystring') 5 | , { request } = require('https') 6 | ; 7 | 8 | /** 9 | * @function 10 | * @param {Object} params 11 | * @param {string} [postData] 12 | * @returns {Promise} 13 | */ 14 | function send(params, postData) { 15 | return new Promise((resolve, reject) => { 16 | let req = request(params, (res) => { 17 | res.setEncoding('utf8'); 18 | res.on('data', (data) => resolve( JSON.parse(data) )); 19 | }); 20 | 21 | req.on('error', reject); 22 | 23 | if(postData) req.write(postData); 24 | req.end(); 25 | }); 26 | } 27 | 28 | module.exports = { 29 | /** 30 | * @function 31 | * @param {Object} params 32 | * @returns {Promise} 33 | */ 34 | request: (params) => { 35 | if(params.body) { 36 | let postData = stringify( params.body ); 37 | params.headers['Content-Type'] = 'application/x-www-form-urlencoded'; 38 | params.headers['Content-Length'] = Buffer.byteLength(postData); 39 | 40 | return send(params, postData); 41 | } else return send(params); 42 | }, 43 | 44 | /** 45 | * @function 46 | * @param client 47 | * @param {Object} opt 48 | */ 49 | sendStat: (client, opt) => { 50 | let data = { servers: 0, shards: 0 }; 51 | 52 | if (client.shard && client.shard.count !== 1) data.shards = client.shard.count; 53 | else if (client.shards && client.shards.size !== 1) data.shards = client.shards.size; 54 | 55 | if (client.guilds.cache) data.servers = client.guilds.cache.size; 56 | else data.servers = client.guilds.size; 57 | 58 | opt.body = data; 59 | module.exports.request(opt) 60 | .then((r) => { 61 | if(r.error) return console.error("[sdc-api | Авто-пост] Ошибка в работе\n" + r.error.message); 62 | else return console.info("[sdc-api | Авто-пост] Статистика для " + client.user.tag + " опубликована на мониторинг.\n" + encodeURI(botsPath + "/" + client.user.id)); 63 | }, (e) => console.error("[sdc-api | Авто-пост] Ошибка в работе | ", e)); 64 | } 65 | }; -------------------------------------------------------------------------------- /examples/METHODS.md: -------------------------------------------------------------------------------- 1 | # Предупреждение [Сервер] 2 | - Методы будут работать в том случае, если сервер присутствует на мониторинге. 3 | 4 | ## Методы враппера 5 | ```js 6 | let apiKey = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6IjU2MzIwMzA3Mjk5MDY0MjE4NiIsInBlcm1zIjowLCJpYXQiOjE1NzcxMjE4NDZ9.Y5qSkDQhOLsLbE6tcyp9e4ua0FtCrN1ykBBe0rJ9TXo"; 7 | // API ключ можно получить на странице редактирования вашего бота 8 | 9 | const SDC = require("@megavasiliy007/sdc-api"); 10 | const client = new SDC(apiKey); 11 | 12 | /* Категория "Сервер": 13 | - guild | Получить информацию о сервере 14 | - guildPlace | Получить текущее место сервера на мониторинге 15 | - guildRated | Получить ID всех проголосовавших пользователей и их оценки 16 | [!] Для отправки запроса, укажите ID сервера для проверки 17 | */ 18 | 19 | client.guild("669961614434500620") 20 | .then((data) => { 21 | console.info(data); 22 | /* { 23 | "avatar": "a_8f05534e4f750cf535988ae8a91fe9ad", 24 | "lang": "ru", 25 | "name": "SD.Community", 26 | "desc": "Официальный сервер тех. поддержки проектов SD.C!", 27 | "invite": "https://discord.gg/8KKVhTU", 28 | "owner": "Dellyare#0720", 29 | "online": 135, 30 | "members": 1000, 31 | "bot": 1, 32 | "boost": 3, 33 | "status": 8, 34 | "upCount": 299, 35 | "tags": "communication, programming, community" 36 | } */ 37 | }); 38 | 39 | client.guildPlace("669961614434500620") 40 | .then((data) => { 41 | console.info(data); 42 | /* { 43 | "place": 1 44 | } */ 45 | }); 46 | 47 | client.guildRated("669961614434500620") 48 | .then((data) => { 49 | console.info(data); 50 | /* { 51 | "166610390581641217": 1, 52 | "178404926869733376": 1, 53 | "239387797457207297": -1, 54 | "271461767014645772": 1, 55 | "321705723216134154": 1 56 | } */ 57 | }); 58 | 59 | /* Категория "Пользователь": 60 | - userRated | Получить ID всех серверов за которые проголосовал пользователь 61 | [!] Для отправки запроса, укажите ID пользователя для проверки 62 | */ 63 | 64 | client.userRated("178404926869733376") 65 | .then((data) => { 66 | console.log(data); 67 | /* { 68 | "312941937240047631": -1, 69 | "669961614434500620": 1, 70 | "640586112624230450": 1, 71 | } */ 72 | }); 73 | 74 | /* Категория "Чёрный список": 75 | - warns | Проверить количество предупреждений у пользователя 76 | [!] Для отправки запроса, укажите ID пользователя для проверки 77 | */ 78 | 79 | client.warns("178404926869733376") 80 | .then((data) => { 81 | console.info(data); 82 | /* { 83 | "id": "178404926869733376", 84 | "type": "user", 85 | "warns": 2 86 | } */ 87 | }); 88 | 89 | /* Категория "Боты": 90 | - setAutoPost | Автоматическая отправка статистики бота 91 | [!] Для отправки запроса, укажите клиент бота и интервал обновления в миллисекундах (по умолчанию стоит 30 минут) 92 | 93 | Пример использования метода находится ниже. 94 | */ 95 | 96 | const { Client } = require('discord.js'); 97 | const bot = new Client(); 98 | 99 | bot.once('ready', () => { 100 | client.setAutoPost(bot); 101 | }); 102 | 103 | bot.login('токен-бота'); 104 | ``` 105 | -------------------------------------------------------------------------------- /sdc.js: -------------------------------------------------------------------------------- 1 | /* jshint esversion: 6 */ 2 | 3 | const { version } = require('./package') 4 | , { request, sendStat } = require('./request') 5 | , isLib = (library, client) => {try {const lib = require.cache[require.resolve(library)];return lib && client instanceof lib.exports.Client;} catch (e) {return false;}} 6 | , isSupported = client => isLib('discord.js', client) || isLib('eris', client) 7 | , paths = { 8 | hostname: "api.server-discord.com", 9 | botsPath: "https://bots.server-discord.com", 10 | github: "https://github.com/MegaVasiliy007/sdc-api" 11 | } 12 | ; 13 | 14 | /** 15 | * @author SDC 16 | * @module 17 | * @param {string} token 18 | */ 19 | module.exports = function (token) { 20 | if(!token) return console.error("[sdc-api] Ошибка аргументов | Не указан API ключ!"); 21 | 22 | /** 23 | * @function 24 | * @param {string} uri 25 | * @param {string} method 26 | * @returns {{path: string, headers: {Authorization: string, 'User-Agent': string}, hostname: string, method: string}|void} 27 | */ 28 | let options = (uri, method = "GET") => { 29 | if (!uri) return console.error("[sdc-api] Ошибка в работе модуля | Не указан адрес метода."); 30 | 31 | return { 32 | method: method, 33 | hostname: paths.hostname, 34 | path: "/v2" + uri, 35 | headers: { 36 | 'User-Agent': `sdc-api/${version} (${uri})`, 37 | 'Authorization': 'SDC ' + token 38 | } 39 | }; 40 | }; 41 | 42 | /** 43 | * @function 44 | * @param {string} guildID 45 | * @returns {PromiseLike|Promise|void} 46 | */ 47 | this.guild = (guildID) => { 48 | if(!guildID) return console.error("[sdc-api] Ошибка аргументов | Не указан ID сервера!"); 49 | 50 | return request(options(`/guild/${guildID}`)) 51 | .then((r) => r, (e) => console.error("[sdc-api] Ошибка в работе | ", e)); 52 | }; 53 | 54 | /** 55 | * @function 56 | * @param {string} guildID 57 | * @returns {PromiseLike|Promise|void} 58 | */ 59 | this.guildPlace = (guildID) => { 60 | if(!guildID) return console.error("[sdc-api] Ошибка аргументов | Не указан ID сервера!"); 61 | 62 | return request(options(`/guild/${guildID}/place`)) 63 | .then((r) => r, (e) => console.error("[sdc-api] Ошибка в работе | ", e)); 64 | }; 65 | 66 | /** 67 | * @function 68 | * @param {string} guildID 69 | * @returns {PromiseLike|Promise|void} 70 | */ 71 | this.guildRated = (guildID) => { 72 | if(!guildID) return console.error("[sdc-api] Ошибка аргументов | Не указан ID сервера!"); 73 | 74 | return request(options(`/guild/${guildID}/rated`)) 75 | .then((r) => r, (e) => console.error("[sdc-api] Ошибка в работе | ", e)); 76 | }; 77 | 78 | /** 79 | * @function 80 | * @param {string} userID 81 | * @returns {PromiseLike|Promise|void} 82 | */ 83 | this.userRated = (userID) => { 84 | if(!userID) return console.error("[sdc-api] Ошибка аргументов | Не указан ID пользователя!"); 85 | 86 | return request(options(`/user/${userID}/rated`)) 87 | .then((r) => r, (e) => console.error("[sdc-api] Ошибка в работе | ", e)); 88 | }; 89 | 90 | /** 91 | * @function 92 | * @param {string} userID 93 | * @returns {PromiseLike|Promise|void} 94 | */ 95 | this.warns = (userID) => { 96 | if(!userID) return console.error("[sdc-api] Ошибка аргументов | Не указан ID пользователя!"); 97 | 98 | return request(options(`/warns/${userID}`)) 99 | .then((r) => r, (e) => console.error("[sdc-api] Ошибка в работе | ", e)); 100 | }; 101 | 102 | /** 103 | * @function 104 | * @param client 105 | * @param {number} interval 106 | * @returns {number|void} 107 | */ 108 | this.setAutoPost = (client, interval = 1800000) => { 109 | if(!client) return console.error("[sdc-api] Ошибка аргументов | Не указан клиент бота!"); 110 | if(!isSupported(client)) return console.error('[sdc-api] Ошибка аргументов | Библиотека бота не поддерживается! Пожалуйста, сообщите нам на GitHub:\n' + encodeURI(`${paths.github}/issues`)); 111 | 112 | if(interval && interval < 900000) return console.error("[sdc-api] Ошибка аргументов | Отправка статистики возможна не менее одного раза в 15 минут!"); 113 | 114 | sendStat(client, options(`/bots/${client.user.id}/stats`, 'POST')); 115 | return setInterval(() => sendStat(client, options(`/bots/${client.user.id}/stats`, 'POST')), interval); 116 | }; 117 | }; --------------------------------------------------------------------------------