Мое намерение

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

Сейчас я надеюсь разработать чат-бота для сервера Discord сообщества /r/WarcraftLore. Я модератор этого раздела и просто большой знаток истории Warcraft. У нас уже есть бот для помощи в модерировании, так что этот бот заменит некоторые развлечения, которыми мы наслаждались от снятого с производства викторинного бота. Я надеюсь, что викторина:

  • Установите необязательные ограничения на частоту запуска викторины: ежечасно, ежедневно или еженедельно.
  • Установите необязательные ограничения на то, какие роли пользователей могут запускать тест.
  • Установите необязательные ограничения на то, на каких каналах может быть запущена викторина, назначенная командой разработчиков. Так, например, модераторы могут создать свой собственный канал с викторинами, чтобы сконцентрировать спам с викторин только в одном месте.

Имя бота в настоящее время Норганнон, отсылка к Титану Небесной Магии и Знаний в знаниях Warcraft. Вы также можете проверить мой прогресс на странице github: https://github.com/Battlenub89/Norgannon

Я использую возможности ChatGPT для помощи в кодировании, отладке и планировании проектов. Как человек с СДВГ, я часто сталкиваюсь с определенными аспектами, которые усложняют творческие проекты.

  • Во-первых, инициирование новой задачи не является моей сильной стороной. Инструменты искусственного интеллекта, такие как ChatGPT, помогают мне преодолеть это препятствие, предоставляя отправную точку в виде блока кода, который я затем могу адаптировать к своим требованиям, а не начинать с нуля.
  • Во-вторых, планирование — кажущаяся непреодолимой задача для многих с СДВГ и, по общему признанию, мой личный враг. Хотя это и не невозможно, планирование может быть невероятно утомительным для меня. Тем не менее, это важный аспект, если я хочу использовать эффективную стратегию производительности и решения проблем: разбивая большие задачи на более мелкие, более управляемые. Такой подход значительно снижает воспринимаемую грандиозность каждого шага, но иногда усилия, необходимые для определения этих задач и подзадач, оказываются для меня слишком непосильными.

Настройка моей среды

Прежде чем приступить к этому проекту, мне нужно было подготовить Python и pip (установщик пакетов Python) на моей машине. Мне также понадобилось несколько библиотек: discord.py для подключения к Discord, python-dotenv для безопасного управления токеном моего бота и random для перетасовки вопросов викторины.

Настройка моей среды разработки имела решающее значение. Я создал виртуальную среду Python, чтобы изолировать зависимости моего проекта, гарантируя, что установка или обновление пакета для этого проекта не повлияет на другие мои проекты Python.

Пример Discord.py: https://discordpy.readthedocs.io/en/stable/intro.html?highlight=env#virtual-environments

Заставить бота ответить

Как только моя среда была настроена, я начал с создания ответа бота на простые команды. Это было достигнуто с помощью декоратора @bot.command(), предоставленного . Изначально мой бот не реагировал на команды, но после консультации с ChatGPT, языковой моделью OpenAI, я понял, что мне не хватает аргумента «намерения» при инициализации моего бота. После исправления мой бот начал подтверждать команду «!hello», что было небольшой, но приятной победой.

Защита токена бота

Боты Discord требуют включения токена бота в программу для идентификации. Однако этот токен потенциально может быть использован злоумышленниками, чтобы захватить вашего бота и использовать его не по назначению. Несмотря на это, я хотел делиться исходным кодом на GitHub на протяжении всего процесса разработки. Чтобы решить эту дилемму, я нашел решение в виде python-dotenv. Это позволяет мне хранить токен в файле .env, который не фиксируется на GitHub. Для дополнительной безопасности я также включил .env в свой файл .gitignore, гарантируя, что я никогда не преднамеренно не зафиксирую его.

Объяснительная статья Моники Пауэлл

Создание викторины

Я создал словарь вопросов и ответов и использовал функцию random.choice(), чтобы каждый раз выбирать случайный вопрос. Чтобы один и тот же вопрос не задавался дважды, я преобразовал свой словарь в список и каждый раз выталкивал (удалял) случайный вопрос.

В этот момент я столкнулся с интересной проблемой: некоторые вопросы могли иметь несколько правильных ответов или разные варианты написания. Чтобы решить эту проблему, я изменил свою функцию check(), чтобы она принимала любой ответ из списка правильных ответов. Благодаря встроенной в Python функции lower() бот мог принимать ответы независимо от их написания заглавными буквами. Вот пример этого метода, предоставленный мне ChatGPT:

import discord from discord.ext 
import commands 
import random 

# Initialize bot with command prefix '!' 
bot = commands.Bot(command_prefix='!') 

# Quiz dictionary with questions as keys and answers as values 
quiz = { 
  'What is the capital of France?': ['Paris'], 
  'Who wrote the book "1984"?': ['George Orwell', 'Orwell'],
  'In what year did the first man land on the moon?': ['1969']
} 

# Start quiz command 
@bot.command() 
async def start_quiz(ctx): 
# Copy the quiz dict to a local dict 
  local_quiz = quiz.copy() 
  for _ in range(5): 
    if local_quiz: # Check if there are still questions left in the quiz 
      question, answers = random.choice(list(local_quiz.items()))
      await ctx.send(question) 

  def check(m): 
    return m.content.lower() in [answer.lower() for answer in answers] and m.channel == ctx.channel 

  msg = await bot.wait_for('message', check=check)
  await ctx.send(f'{msg.author} got it right!') 

  # remove the question from the local quiz dictionary 
  local_quiz.pop(question) 
  else: 
    await ctx.send("No more questions left!")
    break 

bot.run('your-token-here')

Тестирование бота

Запустив бота на сервере Discord, я обнаружил ошибку: когда я правильно отвечал на вопрос викторины, бот не отвечал, а мой терминал показывал AttributeError. ChatGPT объяснил, что проблема возникла из-за моей попытки вызвать lower() для объекта списка. Ошибка была устранена путем изменения моей функции check() для сравнения ответа пользователя с каждым ответом в списке после преобразования всех их в нижний регистр.

Со всеми этими функциями бот был готов. Это был увлекательный проект с большим количеством обучающих моментов, и я благодарен ChatGPT за то, что он был моим компаньоном по программированию на протяжении всего времени. Я надеюсь, что мой опыт вдохновит вас на создание собственного бота в Discord. Удачного кодирования!

Поделитесь своими мыслями

Есть ли у вас опыт, которым вы хотели бы поделиться? Ваши идеи могут быть большим подспорьем для других и меня!

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

Первоначально опубликовано на https://battlenubsbytesizedblog.com 31 мая 2023 г.