node-vkcoinapi
Advanced tools
Comparing version 1.5.4 to 1.6.0
64
index.js
@@ -5,2 +5,3 @@ const WebSocket = require('ws'); | ||
const koaBody = require('koa-body'); | ||
const koaRoute = require('koa-route'); | ||
@@ -54,2 +55,4 @@ const { APIError, ParameterError } = require('./utils/errors'); | ||
async startPolling(callback) { | ||
if (!this.token) throw new ParameterError('token'); | ||
if (callback) { | ||
@@ -72,6 +75,9 @@ this.hasCallback = true; | ||
this.ws.on('error', (data) => { | ||
console.error( | ||
`На стороне VK Coin возникла ошибка: ${data.message}\n\nПереподключение совершится через ${Math.round(this.reconnectTimeout / 1000)} сек...` | ||
); | ||
const message = `На стороне VK Coin возникла ошибка: ${data.message}\n\nПереподключение совершится через ${Math.round(this.reconnectTimeout / 1000)} сек...`; | ||
callback | ||
? callback(message) | ||
: console.error(message) | ||
; | ||
setTimeout(() => { | ||
@@ -96,11 +102,11 @@ this.reconnect(); | ||
if (/^(?:TR)/i.test(message)) { | ||
let { amount, fromId, id } = message.match(/^(?:TR)\s(?<amount>.*)\s(?<fromId>.*)\s(?<id>.*)/i).groups; | ||
amount = Number(amount); | ||
fromId = Number(fromId); | ||
id = Number(id); | ||
const { amount, fromId, id } = message.match( | ||
/^(?:TR)\s(?<amount>.*)\s(?<fromId>.*)\s(?<id>.*)/i | ||
).groups; | ||
const event = { amount, fromId, id }; | ||
this.transferHandler(event); | ||
this.transferHandler({ | ||
id: Number(id), | ||
amount: Number(amount), | ||
fromId: Number(fromId) | ||
}); | ||
} | ||
@@ -111,3 +117,3 @@ | ||
callback( | ||
`Вы зашли в VK Coin, переподключение совершится через ${Math.round(this.reconnectTimeout / 1000)} сек...` | ||
'Вы зашли в VK Coin' | ||
); | ||
@@ -120,3 +126,3 @@ } | ||
if (callback) { | ||
callback('Соединение разорвано'); | ||
callback('Соединение разорвано, переподключение совершится через ${Math.round(this.reconnectTimeout / 1000)} сек...'); | ||
} | ||
@@ -150,5 +156,5 @@ | ||
let { url, port, path } = options; | ||
if (!url) { | ||
return new ParameterError('url'); | ||
throw new ParameterError('url'); | ||
} | ||
@@ -159,3 +165,3 @@ if (!path) { | ||
if (!port) options.port = 8181; | ||
if (!port) port = 8181; | ||
@@ -171,2 +177,6 @@ this.app = new koa(); | ||
if (!path.startsWith('/')) { | ||
path = `/${path}`; | ||
} | ||
const result = await request( | ||
@@ -180,10 +190,15 @@ 'https://coin-without-bugs.vkforms.ru/merchant/set/', | ||
); | ||
if (result.response === 'ON') { | ||
this.app.use((ctx) => { | ||
ctx.status = 200; | ||
this.app.use( | ||
koaRoute.post( | ||
path, | ||
(ctx) => { | ||
ctx.status = 200; | ||
this.transferHandler(ctx.request.body); | ||
} | ||
) | ||
); | ||
this.transferHandler(ctx.request.body); | ||
}); | ||
return true; | ||
@@ -437,8 +452,9 @@ } | ||
* @param {String} options.key - API-ключ | ||
* @param {String} options.token - Токен пользователя | ||
* @param {String} [options.token] - Токен пользователя | ||
* @param {Number} options.userId - ID пользователя | ||
*/ | ||
constructor(options) { | ||
if (!options.token) options.token = null; | ||
if (!options.key) throw new ParameterError('key'); | ||
if (!options.token) throw new ParameterError('token'); | ||
if (!options.userId) throw new ParameterError('userId'); | ||
@@ -445,0 +461,0 @@ |
{ | ||
"name": "node-vkcoinapi", | ||
"version": "1.5.4", | ||
"version": "1.6.0", | ||
"description": "Работа с API VK Coin", | ||
@@ -8,4 +8,5 @@ "main": "index.js", | ||
"request-promise": "^4.2.2", | ||
"koa-route": "^3.2.0", | ||
"koa-body": "^4.1.0", | ||
"request": "^2.88.0", | ||
"koa-body": "^4.1.0", | ||
"url": "^0.11.0", | ||
@@ -12,0 +13,0 @@ "koa": "^2.7.0", |
125
README.md
@@ -42,3 +42,3 @@ # node-vkcoinapi | ||
const vkcoin = new VKCOINAPI(options = {}); | ||
const vkcoin = new VKCOINAPI(options); | ||
``` | ||
@@ -48,5 +48,6 @@ | ||
|-|-|-| | ||
|key|String|Ключ для взаимодействия с API| | ||
|userId|Number|Ваш айди ВК| | ||
|token|String|Ваш токен| | ||
|options|Object|Опции конструктора| | ||
|options.key|String|Ключ для взаимодействия с API| | ||
|options.userId|Number|Ваш айди ВК| | ||
|options.token|String|Ваш токен| | ||
@@ -68,2 +69,4 @@ ### Где взять эти значения | ||
Токеном будет являться строка от **access_token** до **&expires**. В этом случае **xxxxxxxxxxxx** | ||
Токен нужен для получения событий через WebSocket (Моментальное получение платежей) | ||
# API | ||
@@ -114,3 +117,3 @@ call - Вызывает апи-метод по его названию (Нужен, если я не успел обновить модуль) | ||
|-|-|-| | ||
|tx|Array<Number>|Массив айди переводов для получения ИЛИ [1] - последняя 1000 транзакций, [2] - 100| | ||
|tx|Number[]|Массив айди переводов для получения ИЛИ [1] - последняя 1000 транзакций, [2] - 100| | ||
# | ||
@@ -121,3 +124,3 @@ sendPayment - Делает перевод другому пользователю (в десятичных долях) | ||
async function run() { | ||
const result = await vkcoin.api.sendPayment(toId, amount); // 1 коин = 1000 ед. | ||
const result = await vkcoin.api.sendPayment(toId, amount, fromShop); // 1 коин = 1000 ед. | ||
@@ -195,3 +198,3 @@ console.log(result); | ||
|-|-|-| | ||
|userIds|Array<Number>|Массив айди пользователей| | ||
|userIds|Number|Number[]|Массив айди пользователей| | ||
# | ||
@@ -221,9 +224,5 @@ setShopName - Меняет название магазина | ||
```js | ||
async function run() { | ||
await vkcoin.updates.startPolling(callback); | ||
vkcoin.updates.startPolling(callback); | ||
/* Тут ваши действия со слушателем */ | ||
} | ||
run().catch(console.error); | ||
/* Тут ваши действия со слушателем */ | ||
``` | ||
@@ -254,4 +253,4 @@ | ||
> Подключено | ||
> Вы зашли в VK Coin, переподключение совершится через 5 сек... | ||
> Соединение разорвано | ||
> Вы зашли в VK Coin | ||
> Соединение разорвано, переподключение совершится через 5 сек... | ||
> Подключено | ||
@@ -263,3 +262,3 @@ ``` | ||
```js | ||
vkcoin.updates.startWebHook(options = {}); | ||
vkcoin.updates.startWebHook(options); | ||
@@ -271,5 +270,6 @@ /* Тут ваши действия со слушателем */ | ||
|-|-|-| | ||
|url|String|Адрес вашего сервера для получения событий| | ||
|port|Number|Порт для запуска сервера (8181 - по умолчанию)| | ||
|path|String|Путь вашего хука (/ - по умолчанию)| | ||
|options|Object|Опции вебхука| | ||
|options.url|String|Адрес вашего сервера для получения событий| | ||
|options.port|Number|Порт для запуска сервера (8181 - по умолчанию)| | ||
|options.path|String|Путь вашего хука (/ - по умолчанию)| | ||
@@ -280,12 +280,10 @@ При использовании startWebHook, вы лишаетесь многого: получение топов, места, онлайна и информации об объёме рынка. Всё это можно получить при использовании startPolling | ||
**Метод ```updates.onTransfer``` нужно писать после ```updates.startPolling``` или ```updates.startWebHook```, иначе у вас ничего не сработает** | ||
```js | ||
async function run() { | ||
await vkcoin.updates.startPolling(); | ||
vkcoin.updates.startPolling(); | ||
vkcoin.updates.onTransfer((event) => { | ||
console.log(event); | ||
}); | ||
} | ||
run().catch(console.error); | ||
vkcoin.updates.onTransfer((event) => { | ||
console.log(event); | ||
}); | ||
``` | ||
@@ -296,5 +294,3 @@ | ||
```js | ||
vkcoin.updates.startPolling(async(data) => { | ||
console.log(data); | ||
vkcoin.updates.startPolling(console.log).then(() => { | ||
vkcoin.updates.onTransfer((event) => { | ||
@@ -310,3 +306,5 @@ console.log(event); | ||
vkcoin.updates.startWebHook({ | ||
url: 'fakeman-cat.tk', // Тут ваша ссылка | ||
url: '123.123.123.123', // Тут ваша ссылка или IP-адрес сервера | ||
path: '/webhook', | ||
port: 1337 | ||
}); | ||
@@ -323,5 +321,5 @@ | ||
|-|-|-| | ||
|amount|Number|Количество коинов, которые послупили на счёт| | ||
|fromId|Number|Айди плательщика| | ||
|id|Number|Айди платежа| | ||
|event.amount|Number|Количество коинов, которые послупили на счёт| | ||
|event.fromId|Number|Айди плательщика| | ||
|event.id|Number|Айди платежа| | ||
@@ -384,40 +382,25 @@ Стоит отметить, что startWebHook получает только платежи по ссылке. | ||
|online|Number|Онлайн пользователей в данный момент| | ||
|digits|Array<Object>|Информация о рынке и сумме переводов. Подробнее: см. ниже| | ||
|userTop|Array<Object>|Топ пользователей. Подробнее: см. ниже| | ||
|groupTop|Array<Object>|Топ сообществ. Подробнее: см. ниже| | ||
|digits|Object[]|Информация о рынке и сумме переводов| | ||
|digits.description|String|Описание дигита| | ||
|digits.value|Number|Значение дигита| | ||
|digits.trend|Number|На сколько изменилось значение переводов за 5 минут| | ||
|userTop|Object[]|Топ пользователей| | ||
|userTop.id|Number|ID Пользователя| | ||
|userTop.score|Number|Баланс| | ||
|userTop.first_name|String|Имя| | ||
|userTop.last_name|String|Фамилия| | ||
|userTop.is_closed|Boolean|Закрыт ли аккаунт| | ||
|userTop.can_access_closed|Boolean|Может ли текущий пользователь видеть профиль при is_closed = true| | ||
|userTop.photo_200|String<URI>|Ссылка на аватарку| | ||
|userTop.link|String<URI>|Ссылка на профиль| | ||
|groupTop|Object[]|Топ сообществ. Подробнее: см. ниже| | ||
|groupTop.id|Number|ID сообщества| | ||
|groupTop.score|Number|Баланс| | ||
|groupTop.name|String|Имя сообщества| | ||
|groupTop.screen_name|String|Короткий адрес| | ||
|groupTop.is_closed|Number|Закрыта ли группа| | ||
|groupTop.type|String|Тип сообщества (паблик, страница, группа)| | ||
|groupTop.photo_200|String|Аватарка сообщества| | ||
|groupTop.link|String|Ссылка на сообщество| | ||
```digits```: | ||
|Параметр|Тип|Описание| | ||
|-|-|-| | ||
|description|String|Описание дигита| | ||
|value|Number|Значение дигита| | ||
|trend|Number|На сколько изменилось значение переводов за 5 минут| | ||
```userTop```: | ||
|Параметр|Тип|Описание| | ||
|-|-|-| | ||
|id|Number|ID Пользователя| | ||
|score|Number|Баланс| | ||
|first_name|String|Имя| | ||
|last_name|String|Фамилия| | ||
|is_closed|Boolean|Закрыт ли аккаунт| | ||
|can_access_closed|Boolean|Может ли текущий пользователь видеть профиль при is_closed = true| | ||
|photo_200|String<URI>|Ссылка на аватарку| | ||
|link|String<URI>|Ссылка на профиль| | ||
```groupTop```: | ||
|Параметр|Тип|Описание| | ||
|-|-|-| | ||
|id|Number|ID сообщества| | ||
|score|Number|Баланс| | ||
|name|String|Имя сообщества| | ||
|screen_name|String|Короткий адрес| | ||
|is_closed|Number|Закрыта ли группа| | ||
|type|String|Тип сообщества (паблик, страница, группа)| | ||
|photo_200|String<URI>|Аватарка сообщества| | ||
|link|String<URI>|Ссылка на сообщество| | ||
Так же скорее всего, все значения будут равны ```null```, потому что клиент **ws** не успевает подключиться. Для решения этой проблемы могу посоветовать сделать ```delay``` функцию и интегрировать в метод: | ||
@@ -424,0 +407,0 @@ |
@@ -11,2 +11,7 @@ import * as Responses from './responses'; | ||
constructor(key: string, token: string, userId: number); | ||
/** | ||
* Время переподключения к серверу ws | ||
* @default 5000 | ||
*/ | ||
reconnectTimeout: number; | ||
@@ -28,3 +33,9 @@ /** | ||
*/ | ||
async startWebhook(options: Params.WebhookParams); | ||
async startWebHook(options: Params.WebhookParams); | ||
/** | ||
* | ||
* @param callback Функция, принимающая данные перевода | ||
*/ | ||
onTransfer(event: Function); | ||
} | ||
@@ -31,0 +42,0 @@ |
@@ -22,3 +22,3 @@ export interface WebhookParams { | ||
*/ | ||
token: string; | ||
token?: string; | ||
@@ -25,0 +25,0 @@ /** |
@@ -66,2 +66,2 @@ export interface TransactionResponse { | ||
} | ||
} | ||
} |
@@ -7,3 +7,5 @@ const request = require('./request'); | ||
if (result.error) { | ||
throw new Error('Не удалось получить ссылку на приложение. Попробуйте переполучить токен'); | ||
throw new Error( | ||
'Не удалось получить ссылку на приложение. Попробуйте переполучить токен' | ||
); | ||
} | ||
@@ -13,3 +15,9 @@ | ||
if (!mobile_iframe_url) { | ||
throw new Error( | ||
'Токен нужно получить от приложения "Клевер"' | ||
); | ||
} | ||
return mobile_iframe_url; | ||
}; |
module.exports = (min, max) => { | ||
console.log(this); | ||
const rand = Math.round( | ||
@@ -4,0 +3,0 @@ min - 0.5 + Math.random() * (max - min + 1) |
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
50439
20
802
7
410
+ Addedkoa-route@^3.2.0
+ Addedisarray@0.0.1(transitive)
+ Addedkoa-route@3.2.0(transitive)
+ Addedmethods@1.1.2(transitive)
+ Addedpath-to-regexp@1.9.0(transitive)