Вам потребуется создать фоновую задачу, которая будет запускаться каждый установленный промежуток времени, выбирая случайного пользователя, который еще не участвовал в опросе.Вам также необходимо сохранить ответы на диск, либо в файл, либо в базу данных.
Ниже приведен высокоуровневый пример того, как добиться чего-то подобного.В этом примере все ответы будут сохранены в файл, который будет проверен при запуске бота, чтобы убедиться, что никакие данные не будут перезаписаны.В приведенном ниже коде используется ветвь async
discord.py
.
import discord
import asyncio
import os
import pickle
import random
client = discord.Client()
def check_members(member_responses):
for member in client.get_all_members():
if member.id not in member_responses:
member_responses[member.id] = {'participate': '', 'answer_1': '', 'answer_2': ''}
return member_responses
async def my_background_task():
await client.wait_until_ready()
if os.path.isfile('member_responses.txt'):
member_responses = pickle.load(open('member_responses.txt', 'rb'))
else:
member_responses = check_members({})
pickle.dump(member_responses, open('member_responses.txt', 'wb'))
while not client.is_closed:
non_surveyed_members = []
for member_id in member_responses:
if member_responses[member_id]['participate'] == '':
non_surveyed_members.append(member_id)
if len(non_surveyed_members) != 0:
survey_member = await client.get_user_info(random.choice(non_surveyed_members))
await client.send_message(survey_member, 'Do you wish to participate?')
participate_answer = False
while not participate_answer:
response = await client.wait_for_message(author=survey_member)
if response.content in ['Yes', 'No']:
participate_answer = True
member_responses[survey_member.id]['participate'] = response.content
else:
await client.send_message(survey_member, 'Please answer Yes or No')
if response.content == 'Yes':
await client.send_message(survey_member, 'Question 1')
response = await client.wait_for_message(author=survey_member)
member_responses[survey_member.id]['answer_1'] = response.content
await client.send_message(survey_member, 'Question 2')
response = await client.wait_for_message(author=survey_member)
member_responses[survey_member.id]['answer_2'] = response.content
member_responses = check_members(member_responses)
pickle.dump(member_responses, open('member_responses.txt', 'wb'))
await asyncio.sleep(300) # task runs every 5 minutes
client.loop.create_task(my_background_task())
client.run('token')