Discord python Случайный опрос / викторина - PullRequest
0 голосов
/ 18 ноября 2018

Как я могу заставить своего бота выбрать случайного пользователя с сервера и сделать простой опрос или опрос?

def survey(self, ctx):
        await self.bot.say('CyberLife, the compàny that manufactured me, is conducting a users survey.')
        await self.bot.say('Would you like to participate?')
        #If user says no...
        await self.bot.say("Ok, i'll remind you later.")
        #If user says yes...
        await self.bot.say("Great. Let's start")
        await self.bot.say("Would you consider having a relationship with an android that looks like a human?")
        #If user answers anything...
        await self.bot.say("Do you think technology could become a threat to mankind?")
        #If user answers anything...
        await self.bot.say("IF you had to live on a deserted island and could only bring one object,")
        await self.bot.say("what would it be?")
        #If user answers anything...
        await self.bot.say("Do you consider yourself dependent on technology")
        #If user answers anything...
        await self.bot.say("What technology do you most anticipate?")
        #If user answers anything...
        await self.bot.say("Do you believe in god?")
        #If user answers anything...
        await self.bot.say("Would you let an android take care of your children?")
        #If user answers anything...
        await self.bot.say("How much time per day would you say you spend on an electronic device?")
        #If user answers anything...
        await self.bot.say("If you needed emergency surgery,")
        await self.bot.say("would you agree to be operated on by a machine?")
        #If user answers anything...
        await self.bot.say("Do you think think one day machines could develop consciousness?")
        #If user answers anything...
         #End of survey

Будет запускаться случайным образом (каждые 1-2 часа), опрос будет задавать вопросы, пользователь может ответить на все вопросы (кроме первого), он перейдет к следующему, пока не достигнет конца. Заранее спасибо и прошу прощения за мои нубские вопросы!

1 Ответ

0 голосов
/ 18 ноября 2018

Вам потребуется создать фоновую задачу, которая будет запускаться каждый установленный промежуток времени, выбирая случайного пользователя, который еще не участвовал в опросе.Вам также необходимо сохранить ответы на диск, либо в файл, либо в базу данных.

Ниже приведен высокоуровневый пример того, как добиться чего-то подобного.В этом примере все ответы будут сохранены в файл, который будет проверен при запуске бота, чтобы убедиться, что никакие данные не будут перезаписаны.В приведенном ниже коде используется ветвь 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')
...