FloydReme
@FloydReme
Пишу музыку и программирую

Как посчитать количество постов за сутки у отдельного человека?

Есть некая команда, по которой человек может узнать, сколько постов за сутки он сделал в некотором списке групп. Проблема в том, что на каждый вызов команды максимум можно получить 100 постов (этого мало, записи появляются каждую секунду). В итоге, если человек сделал условно 20 постов, эта сотня набралась, прошло какое-то время, человек решает проверить количество сделанных постов и увидит 0, так как вышла новая сотня, а старая исчезла. Как сделать так, чтобы статистика сохранялась? Я понимаю, что при вызове команды все обнуляется, но все же.Вариант с БД не предлагать, пожалуйста.
Заранее спасибо

Вот код:
var allUsers = []
var userInfo = []

updates.hear('/имя_команды', async(context) => {
//Узнаем имя человека, который обратился к команде
const [userName] = await api.users.get({
	user_ids: context.senderId,
	name_case: 'nom'
});
const Groups = new Array(8)
Groups[0] = await api.wall.get({
	domain: `1`,
	count: 100,
	extended: true,
	filter: 'others'
})
Groups[1] = await api.wall.get({
	domain: `2`,
	count: 100,
	extended: true,
	filter: 'others'
})
Groups[2] = await api.wall.get({
	domain: `3`,
	count: 100,
	extended: true,
	filter: 'others'
})
Groups[3] = await api.wall.get({
	owner_id: 4,
	count: 100,
	extended: true,
	filter: 'others'
}) 
Groups[4] = await api.wall.get({
	owner_id: 5,
	count: 100,
	extended: true,
	filter: 'others'
})
Groups[5] = await api.wall.get({
	owner_id: 6,
	count: 100,
	extended: true,
	filter: 'others'
})
Groups[6] = await api.wall.get({
	domain: `7`,
	count: 100,
	extended: true,
	filter: 'others'
})
Groups[7] = await api.wall.get({
	domain: `8`,
	count: 100,
	extended: true,
	filter: 'others'
})

var k = 0
for(var i = 0; i < Groups.length; i++)
{
	for(var j = 0; j < Groups[i].items.length; j++)
	{
		userInfo[k] = Groups[i].items[j].from_id
		k++
	}	
}
allUsers.push(userInfo)
console.log(userInfo)
console.log(allUsers)
for(var i = 0; i < userInfo.length; i++)
{
	if(userInfo[i] === context.senderId)
	{
		count++
	}	
}
  • Вопрос задан
  • 695 просмотров
Решения вопроса 2
sergiks
@sergiks Куратор тега JavaScript
♬♬
при вызове команды все обнуляется, но все же

Но что же? По какой причине не хотите использовать БД или иное хранилище?

Так или иначе надо сохранять id самого свежего проверенного поста на каждой из стен. Чтобы потом проверять до него, при необходимости проверив глубже, чем на 100 постов.

  • можно проверять глубже, чем последние 100 постов, указав параметр offset
  • можно «упаковать» до 25 вызовов к API ВК в один запрос execute(), тогда в секунду можно выполнить не 3 а 75 запросов
  • в качестве хранилища можно использовать не локальную БД а ВКонтактовский storage.
Ответ написан
Комментировать
Negezor
@Negezor
Senior Shaurma Developer
В библиотеке есть работа с коллекциями, с помощью них можно получить хоть все посты группы, но возможны дубликаты из-за появления новых записей. Ещё можно использовать LRU кэш для создания сессий. Ещё в библиотеке есть режимы работы, а так же вместо последовательного await лучше использовать Promise.all() для распараллеливания.
const groupsList = Array(8).fill().map((_, i) => i + 1);

const groups = await Promise.all(groupsList.map(id => (
    api.wall.get({
        domain: id,
        count: 100,
        extended: true,
        filter: 'others'
    })
)));
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы