Merge branch 'master' into flask-develop

flask-develop
bobloy 6 years ago
commit d91db426da

@ -19,6 +19,7 @@ Cog Function
| lovecalculator | **Alpha** | <details><summary>Calculate the love between two users</summary>[Snap-Ons] Just updated to V3</details> |
| lseen | **Alpha** | <details><summary>Track when a member was last online</summary>Alpha release, please report bugs</details> |
| nudity | **Incomplete** | <details><summary>Checks for NSFW images posted in non-NSFW channels</summary>Library this is based on has a bug, waiting for author to merge my PR</details> |
| planttycoon | **Alpha** | <details><summary>Grow your own plants!</summary>[Snap-Ons] Updated to V3, likely to contain bugs</details> |
| qrinvite | **Alpha** | <details><summary>Create a QR code invite for the server</summary>Alpha release, please report any bugs</details> |
| reactrestrict | **Alpha** | <details><summary>Removes reactions by role per channel</summary>A bit clunky, but functional</details> |
| recyclingplant | **Alpha** | <details><summary>Work at a recycling plant</summary>[Snap-Ons] Just updated to V3</details> |

@ -1,6 +1,7 @@
import asyncio
import random
from datetime import datetime, timedelta
from typing import Any
import discord
from redbot.core import Config, checks, commands
@ -13,8 +14,10 @@ DEFAULT_MESSAGES = [
# "Example message 2. Each message is in quotes and separated by a comma"
]
Cog: Any = getattr(commands, "Cog", object)
class AnnounceDaily:
class AnnounceDaily(Cog):
"""
Send daily announcements
"""

@ -9,7 +9,7 @@
],
"description": "Send daily announcements to all servers at a specified times",
"hidden": true,
"install_msg": "Thank you for installing AnnounceDaily! Get started with `[p]help AnnounceDaily`",
"install_msg": "Thank you for installing AnnounceDaily! Get started with `[p]load announcedaily` and `[p]help AnnounceDaily`",
"requirements": [],
"short": "Send daily announcements",
"tags": [

@ -1,5 +1,13 @@
from redbot.core.bot import Red
from .audiotrivia import AudioTrivia
def setup(bot):
async def setup(bot: Red):
if bot.get_cog("Trivia"):
print("Trivia is already loaded, attempting to unload it first")
bot.remove_cog("Trivia")
await bot.remove_loaded_package("trivia")
bot.unload_extension("trivia")
bot.add_cog(AudioTrivia(bot))

@ -29,7 +29,7 @@ class AudioTrivia(Trivia):
self.audioconf.register_guild(
delay=30.0,
repeat=True
repeat=True,
)
@commands.group()
@ -90,6 +90,11 @@ class AudioTrivia(Trivia):
await ctx.send("There is already an ongoing trivia session in this channel.")
return
status = await self.audio.config.status()
if status:
await ctx.send("I recommend disabling audio status with `{}audioset status`".format(ctx.prefix))
if not self.audio._player_check(ctx):
try:
if not ctx.author.voice.channel.permissions_for(ctx.me).connect or self.audio._userlimit(

File diff suppressed because it is too large Load Diff

@ -6,6 +6,7 @@ https://www.youtube.com/watch?v=Fn0khIn2wfc:
https://www.youtube.com/watch?v=qkYSuWSPkHI:
- the legend of zelda
- legend of zelda
- zelda
https://www.youtube.com/watch?v=0hvlwLwxweI:
- dragon quest ix
- dragon quest 9
@ -47,10 +48,8 @@ https://www.youtube.com/watch?v=9wMjq58Fjvo:
https://www.youtube.com/watch?v=sr2nK06zZkg:
- shadow of the colossus
https://www.youtube.com/watch?v=6CMTXyExkeI:
- final fantasy v
- final fantasy 5
- final fantasy five
- ff5
- ffv
https://www.youtube.com/watch?v=nRbROTdOgj0:
- legend of zelda skyward sword
- skyward sword
@ -60,8 +59,6 @@ https://www.youtube.com/watch?v=VEIWhy-urqM:
- super mario galaxy
https://www.youtube.com/watch?v=IT12DW2Fm9M:
- final fantasy iv
- ff4
- ffiv
- final fantasy 4
https://www.youtube.com/watch?v=UZbqrZJ9VA4:
- mother3
@ -76,26 +73,20 @@ https://www.youtube.com/watch?v=eVVXNDv8rY0:
- skyrim
https://www.youtube.com/watch?v=kzvZE4BY0hY:
- fallout 4
- fallout four
https://www.youtube.com/watch?v=VTsD2FjmLsw:
- mass effect 2
- mass effect two
https://www.youtube.com/watch?v=800be1ZmGd0:
- world of warcraft
- wow
https://www.youtube.com/watch?v=SXKrsJZWqK0:
- batman arkham city
- arkham city
https://www.youtube.com/watch?v=BLEBtvOhGnM:
- god of war iii
- god of war 3
- god of war three
https://www.youtube.com/watch?v=rxgTlQLm4Xg:
- gears of war 3
- gears of war three
https://www.youtube.com/watch?v=QiPon8lr48U:
- metal gear solid 2
- metal gear solid two
https://www.youtube.com/watch?v=qDnaIfiH37w:
- super smash bros wii u
- super smash bros. wii u
@ -117,46 +108,31 @@ https://www.youtube.com/watch?v=01IEjvD5lss:
- guilty gear
https://www.youtube.com/watch?v=VXX4Ft1I0Dw:
- dynasty warriors 6
- dynasty warriors six
https://www.youtube.com/watch?v=liRMh4LzQQU:
- doom 2016
- doom
https://www.youtube.com/watch?v=ouw3jLAUXWE:
- devil may cry 3
- devil may cry three
https://www.youtube.com/watch?v=B_MW65XxS7s:
- final fantasy vii
- final fantasy 7
- ff7
- ffvii
https://www.youtube.com/watch?v=viM0-3PXef0:
- the witcher 3
- witcher 3
https://www.youtube.com/watch?v=WQYN2P3E06s:
- civilization vi
- civilization 6
- civ6
- civ vi
- civ 6
https://www.youtube.com/watch?v=qOMQxVtbkik:
- guild wars 2
- guild wars two
- gw2
- gw two
- gw 2
https://www.youtube.com/watch?v=WwHrQdC02FY:
- final fantasy vi
- final fantasy 6
- ff6
- ffvi
https://www.youtube.com/watch?v=2_wkJ377LzU:
- journey
https://www.youtube.com/watch?v=IJiHDmyhE1A:
- civilization iv
- civilization 4
- civ4
- civ iv
- civ 4
https://www.youtube.com/watch?v=kN_LvY97Rco:
- ori and the blind forest
https://www.youtube.com/watch?v=TO7UI0WIqVw:
@ -170,8 +146,6 @@ https://www.youtube.com/watch?v=xkolWbZdGbM:
https://www.youtube.com/watch?v=h-0G_FI61a8:
- final fantasy x
- final fantasy 10
- ff10
- ffx
https://www.youtube.com/watch?v=do5NTPLMqXQ:
- fire emblem fates
https://www.youtube.com/watch?v=eFVj0Z6ahcI:
@ -188,14 +162,11 @@ https://www.youtube.com/watch?v=wRWq53IFXVQ:
- the legend of zelda wind waker
- legend of zelda wind waker
- wind waker
- the wind waker
https://www.youtube.com/watch?v=nkPF5UiDi4g:
- uncharted 2
- uncharted two
https://www.youtube.com/watch?v=CdYen5UII0s:
- battlefield 1
- battlefield one
- bf1
https://www.youtube.com/watch?v=8yj-25MOgOM:
- star fox zero
- starfox zero
@ -208,9 +179,7 @@ https://www.youtube.com/watch?v=4EcgruWlXnQ:
- monty on the run
https://www.youtube.com/watch?v=oEf8gPFFZ58:
- mega man 3
- mega man three
- megaman 3
- megaman three
https://www.youtube.com/watch?v=ifbr2NQ3Js0:
- castlevania
https://www.youtube.com/watch?v=W7rhEKTX-sE:
@ -218,8 +187,6 @@ https://www.youtube.com/watch?v=W7rhEKTX-sE:
https://www.youtube.com/watch?v=as_ct9tgkZA:
- mega man 2
- megaman 2
- mega man two
- megaman two
https://www.youtube.com/watch?v=FB9Pym-sdbs:
- actraiser
https://www.youtube.com/watch?v=G3zhZHU6B2M:
@ -229,7 +196,6 @@ https://www.youtube.com/watch?v=hlrOAEr6dXc:
- zero mission
https://www.youtube.com/watch?v=jl6kjAkVw_s:
- sonic 2
- sonic two
https://www.youtube.com/watch?v=K8GRDNU50b8:
- the legend of zelda ocarina of time
- legend of zelda ocarina of time
@ -263,8 +229,6 @@ https://www.youtube.com/watch?v=FBLp-3Rw_u0:
https://www.youtube.com/watch?v=jqE8M2ZnFL8:
- grand theft auto 4
- grand theft auto four
- gta4
- gta 4
https://www.youtube.com/watch?v=GQZLEegUK74:
- goldeneye 007
- goldeneye
@ -291,13 +255,9 @@ https://www.youtube.com/watch?v=zz8m1oEkW5k:
- tetris blitz
https://www.youtube.com/watch?v=gMdX_Iloow8:
- ultimate marvel vs capcom 3
- ultimate marvel vs capcom three
- marvel vs capcom 3
- marvel vs capcom three
- ultimate marvel vs. capcom 3
- ultimate marvel vs. capcom three
- marvel vs. capcom 3
- marvel vs. capcom three
https://www.youtube.com/watch?v=vRe3h1iQ1Os:
- sonic the hedgehog 2006
- sonic the hegehog
@ -311,13 +271,9 @@ https://www.youtube.com/watch?v=wp6QpMWaKpE:
https://www.youtube.com/watch?v=R9XdMnsKvUs:
- call of duty 4 modern warfare
- call of duty 4
- call of duty four
- cod4
- cod 4
- modern warfare
https://www.youtube.com/watch?v=f-sQhBDsjgE:
- killzone 2
- killzone two
https://www.youtube.com/watch?v=-_O6F5FwQ0s:
- soul calibur v
- sould calibur 5
@ -331,7 +287,6 @@ https://www.youtube.com/watch?v=J46RY4PU8a8:
- chrono cross
https://www.youtube.com/watch?v=6LB7LZZGpkw:
- silent hill 2
- silent hill two
https://www.youtube.com/watch?v=ya3yxTbkh5s:
- Ōkami
- okami
@ -344,10 +299,6 @@ https://www.youtube.com/watch?v=KGidvt4NTPI:
https://www.youtube.com/watch?v=JbXVNKtmWnc:
- final fantasy vi
- final fantasy 6
- ff6
- ffvi
https://www.youtube.com/watch?v=-jMDutXA4-M:
- final fantasy iii
- final fantasy 3
- ff3
- ffiii

@ -9,7 +9,7 @@
],
"description": "Start an Audio Trivia game",
"hidden": false,
"install_msg": "Thank you for installing Audio trivia! Get started with `[p]help AudioTrivia`",
"install_msg": "Thank you for installing Audio trivia!\n You **MUST** unload trivia to use this (`[p]unload trivia`)\n Then you can get started with `[p]load audiotrivia` and `[p]help AudioTrivia`",
"requirements": [],
"short": "Start an Audio Trivia game",
"tags": [

@ -1,13 +1,16 @@
import asyncio
import re
from typing import Any
import discord
from redbot.core import Config, checks
from redbot.core import commands
from redbot.core.utils.chat_formatting import pagify, box
Cog: Any = getattr(commands, "Cog", object)
class CCRole:
class CCRole(Cog):
"""
Custom commands
Creates commands used to display text and adjust roles

@ -9,7 +9,7 @@
],
"description": "[Incomplete] Creates custom commands to adjust roles and send custom messages",
"hidden": false,
"install_msg": "Thank you for installing Custom Commands w/ Roles.",
"install_msg": "Thank you for installing Custom Commands w/ Roles. Get started with `[p]load ccrole` and `[p]help CCRole`",
"requirements": [],
"short": "[Incomplete] Creates commands that adjust roles",
"tags": [

@ -11,9 +11,12 @@ from chatter.chatterbot import ChatBot
from chatter.chatterbot.comparisons import levenshtein_distance
from chatter.chatterbot.response_selection import get_first_response
from chatter.chatterbot.trainers import ListTrainer
from typing import Any
Cog: Any = getattr(commands, "Cog", object)
class Chatter:
class Chatter(Cog):
"""
This cog trains a chatbot that will talk like members of your Guild
"""

@ -9,7 +9,7 @@
],
"description": "Create an offline chatbot that talks like your average member using Machine Learning",
"hidden": false,
"install_msg": "Thank you for installing Chatter!",
"install_msg": "Thank you for installing Chatter! Get started ith `[p]load chatter` and `[p]help Chatter`",
"requirements": [
"sqlalchemy<1.3,>=1.2",
"python-twitter<4.0,>=3.0",

@ -4,11 +4,14 @@ from redbot.core import Config
from redbot.core import commands
from redbot.core.bot import Red
from redbot.core.data_manager import cog_data_path
from typing import Any
Cog: Any = getattr(commands, "Cog", object)
class CogLint:
class CogLint(Cog):
"""
V3 Cog Template
Automatically lint code in python codeblocks
"""
def __init__(self, bot: Red):

@ -9,7 +9,7 @@
],
"description": "Lint python code posted in chat",
"hidden": true,
"install_msg": "Thank you for installing CogLint",
"install_msg": "Thank you for installing CogLint! Get started with `[p]load coglint` and `[p]help CogLint`",
"requirements": [],
"short": "Python cog linter",
"tags": [

@ -0,0 +1,5 @@
from .dad import Dad
def setup(bot):
bot.add_cog(Dad(bot))

@ -0,0 +1,112 @@
from collections import defaultdict
from datetime import datetime, timedelta
from typing import Any
import aiohttp
import discord
from redbot.core import Config, checks
from redbot.core import commands
from redbot.core.bot import Red
Cog: Any = getattr(commands, "Cog", object)
async def fetch_url(session, url):
async with session.get(url) as response:
assert response.status == 200
return await response.json()
class Dad(Cog):
"""
Dad jokes
Nicknaming user idea comes from https://github.com/Vexs/DadBot
"""
def __init__(self, bot: Red):
self.bot = bot
self.config = Config.get_conf(self, identifier=6897100, force_registration=True)
default_guild = {
"enabled": False,
"nickname": False,
"cooldown": 240
}
self.config.register_guild(**default_guild)
self.cooldown = defaultdict(datetime.now)
@commands.command()
async def dadjoke(self, ctx: commands.Context):
headers = {"User-Agent": "FoxV3 (https://github.com/bobloy/Fox-V3)",
"Accept": "application/json"}
async with aiohttp.ClientSession(headers=headers) as session:
joke = await fetch_url(session, 'https://icanhazdadjoke.com/')
em = discord.Embed()
em.set_image(url="https://icanhazdadjoke.com/j/{}.png".format(joke['id']))
await ctx.send(embed=em)
@commands.group()
@checks.admin()
async def dad(self, ctx: commands.Context):
"""Dad joke superhub"""
pass
@dad.command(name='toggle')
async def dad_toggle(self, ctx: commands.Context):
"""Toggle automatic dad jokes on or off"""
is_on = await self.config.guild(ctx.guild).enabled()
await self.config.guild(ctx.guild).enabled.set(not is_on)
await ctx.send("Auto dad jokes are now set to {}".format(not is_on))
@dad.command(name='nickname')
async def dad_nickname(self, ctx: commands.Context):
"""Toggle nicknaming"""
is_on = await self.config.guild(ctx.guild).nickname()
await self.config.guild(ctx.guild).nickname.set(not is_on)
await ctx.send("Nicknaming is now set to {}".format(not is_on))
@dad.command(name='cooldown')
async def dad_cooldown(self, ctx: commands.Context, cooldown: int):
"""Set the auto-joke cooldown"""
await self.config.guild(ctx.guild).cooldown.set(cooldown)
await ctx.send("Dad joke cooldown is now set to {}".format(cooldown))
async def on_message(self, message: discord.Message):
guild: discord.Guild = message.guild
if guild is None:
return
guild_config = self.config.guild(guild)
is_on = await guild_config.enabled()
if not is_on:
return
if self.cooldown[guild.id] > datetime.now():
return
lower = message.clean_content.lower()
lower_split = lower.split()
if len(lower_split)==0:
return
if lower_split[0] == "i'm" and len(lower_split) >= 2:
if await guild_config.nickname():
try:
await message.author.edit(nick=lower[4:])
except discord.Forbidden:
out = lower[4:]
else:
out = message.author.mention
else:
out = lower[4:]
await message.channel.send("Hi {}, I'm {}!".format(out, guild.me.display_name))
self.cooldown[guild.id] = datetime.now() + timedelta(seconds=(await guild_config.cooldown()))

@ -0,0 +1,20 @@
{
"author": [
"Bobloy"
],
"bot_version": [
3,
0,
0
],
"description": "Tell dad jokes and give out bad nicknames",
"hidden": true,
"install_msg": "Thank you for installing Dad. Get started with `[p]load dad`, then `[p]help Dad`",
"requirements": [],
"short": "Dad joke bot",
"tags": [
"bobloy",
"utils",
"tools"
]
}

@ -2,9 +2,12 @@ import asyncio
import discord
from redbot.core import Config, checks, commands
from typing import Any
Cog: Any = getattr(commands, "Cog", object)
class ExclusiveRole:
class ExclusiveRole(Cog):
"""
Custom commands
Creates commands used to display text and adjust roles

@ -9,7 +9,7 @@
],
"description": "Assign roles to be exclusive, preventing other roles from being added",
"hidden": false,
"install_msg": "Thank you for installing ExclusiveRole. Get started with `[p]help ExclusiveRole`",
"install_msg": "Thank you for installing ExclusiveRole. Get started with `[p]load exclusiverole` and `[p]help ExclusiveRole`",
"requirements": [],
"short": "Set roles to be exclusive",
"tags": [

@ -4,9 +4,12 @@ import discord
from redbot.core import Config, checks, commands
from redbot.core.bot import Red
from redbot.core.utils.chat_formatting import pagify
from typing import Any
Cog: Any = getattr(commands, "Cog", object)
class Flag:
class Flag(Cog):
"""
Set expiring flags on members
"""

@ -8,8 +8,8 @@
0
],
"description": "Add expiring flags on members to track warnings or incidents",
"hidden": true,
"install_msg": "Thank you for installing Flag! Get started with `[p]help Flag`",
"hidden": false,
"install_msg": "Thank you for installing Flag! Get started with `[p]load flag` and `[p]help Flag`",
"requirements": [],
"short": "Add expiring flags to members",
"tags": [

@ -3,9 +3,12 @@ from discord.utils import get
from redbot.core import Config, checks, commands
from redbot.core.bot import Red
from typing import Any
Cog: Any = getattr(commands, "Cog", object)
class ForceMention:
class ForceMention(Cog):
"""
Mention the unmentionables
"""

@ -9,7 +9,7 @@
],
"description": "Mentions roles that are unmentionable",
"hidden": false,
"install_msg": "Thank you for installing ForceMention! Get started with `[p]forcemention`",
"install_msg": "Thank you for installing ForceMention! Get started with `[p]load forcemention`, then `[p]forcemention`",
"requirements": [],
"short": "Mention unmentionables",
"tags": [

@ -4,9 +4,12 @@ from random import randint
import discord
from redbot.core import Config, checks, commands
from redbot.core.data_manager import cog_data_path
from typing import Any
Cog: Any = getattr(commands, "Cog", object)
class Hangman:
class Hangman(Cog):
"""Lets anyone play a game of hangman with custom phrases"""
navigate = "🔼🔽"
letters = "🇦🇧🇨🇩🇪🇫🇬🇭🇮🇯🇰🇱🇲🇳🇴🇵🇶🇷🇸🇹🇺🇻🇼🇽🇾🇿"

@ -9,7 +9,7 @@
],
"description": "Play Hangman with your friends",
"hidden": false,
"install_msg": "Thank you for installing Hangman!",
"install_msg": "Thank you for installing Hangman! Get started with `[p]load hangman`, then `[p]help Hangman`",
"requirements": [],
"short": "Play Hangman",
"tags": [

@ -9,7 +9,7 @@
],
"description": "Keeps track of when people leave the server, and posts a message notifying",
"hidden": false,
"install_msg": "Thank you for installing Leaver. Get started with `[p]help Leaver`",
"install_msg": "Thank you for installing Leaver. Get started with `[p]load leaver`, then `[p]help Leaver`",
"requirements": [],
"short": "Send message on leave",
"tags": [

@ -2,9 +2,12 @@ import discord
from redbot.core import Config, checks, commands
from redbot.core.commands import Context
from typing import Any
Cog: Any = getattr(commands, "Cog", object)
class Leaver:
class Leaver(Cog):
"""
Creates a goodbye message when people leave
"""

@ -10,7 +10,7 @@
],
"description": "Calculate the love percentage for two users",
"hidden": false,
"install_msg": "Thank you for installing LoveCalculator. Love is in the air.",
"install_msg": "Thank you for installing LoveCalculator. Love is in the air.\n Get started with `[p]load lovecalculator`, then `[p]help LoveCalculator`",
"requirements": [
"beautifulsoup4"
],

@ -2,9 +2,12 @@ import aiohttp
import discord
from bs4 import BeautifulSoup
from redbot.core import commands
from typing import Any
Cog: Any = getattr(commands, "Cog", object)
class LoveCalculator:
class LoveCalculator(Cog):
"""Calculate the love percentage for two users!"""
def __init__(self, bot):

@ -8,8 +8,8 @@
0
],
"description": "Keep track of when users were last seen online",
"hidden": true,
"install_msg": "Thank you for installing LastSeen. Get started with `[p]help LastSeen`",
"hidden": false,
"install_msg": "Thank you for installing LastSeen. Get started with `[p]load lseen`, then `[p]help LastSeen`",
"requirements": ["python-dateutil"],
"short": "Last seen tracker",
"tags": [

@ -6,9 +6,12 @@ import discord
from redbot.core import Config
from redbot.core.bot import Red
from redbot.core import commands
from typing import Any
Cog: Any = getattr(commands, "Cog", object)
class LastSeen:
class LastSeen(Cog):
"""
Report when a user was last seen online
"""

@ -9,7 +9,7 @@
],
"description": "Keep track of when users were last seen online",
"hidden": true,
"install_msg": "Thank you for installing LastSeen. Get started with `[p]help LastSeen`",
"install_msg": "Thank you for installing LastSeen. Get started with `[p]load nudity`, then `[p]help Nudity`",
"requirements": ["nudepy"],
"short": "Last seen tracker",
"tags": [

@ -0,0 +1,5 @@
from .planttycoon import PlantTycoon
def setup(bot):
bot.add_cog(PlantTycoon(bot))

@ -0,0 +1,11 @@
{
"badges": {
"Flower Power": {},
"Fruit Brute": {},
"Sporadic": {},
"Odd-pod": {},
"Greenfingers": {},
"Nobel Peas Prize": {},
"Annualsary": {}
}
}

@ -0,0 +1,22 @@
{
"points": {
"buy": 5,
"add_health": 5,
"fertilize": 10,
"pruning": 20,
"pesticide": 25,
"growing": 5,
"damage": 25
},
"timers": {
"degradation": 1,
"completion": 1,
"notification": 5
},
"degradation": {
"base_degradation": 1.5
},
"notification": {
"max_health": 50
}
}

@ -0,0 +1,7 @@
{
"messages": [
"The soil seems dry, maybe you could give your plant some water?",
"Your plant seems a bit droopy. I would give it some fertilizer if I were you.",
"Your plant seems a bit too overgrown. You should probably trim it a bit."
]
}

@ -0,0 +1,690 @@
{
"plants": [
{
"name": "Poppy",
"article": "a",
"time": 3600,
"rarity": "common",
"image": "http://i.imgur.com/S4hjyUX.jpg",
"health": 100,
"degradation": 0.625,
"threshold": 110,
"badge": "Flower Power",
"reward": 600
},
{
"name": "Dandelion",
"article": "a",
"time": 3600,
"rarity": "common",
"image": "http://i.imgur.com/emqnQP2.jpg",
"health": 100,
"degradation": 0.625,
"threshold": 110,
"badge": "Flower Power",
"reward": 600
},
{
"name": "Daisy",
"article": "a",
"time": 3600,
"rarity": "common",
"image": "http://i.imgur.com/lcFq4AB.jpg",
"health": 100,
"degradation": 0.625,
"threshold": 110,
"badge": "Flower Power",
"reward": 600
},
{
"name": "Chrysanthemum",
"article": "a",
"time": 3600,
"rarity": "common",
"image": "http://i.imgur.com/5jLtqWL.jpg",
"health": 100,
"degradation": 0.625,
"threshold": 110,
"badge": "Flower Power",
"reward": 600
},
{
"name": "Pansy",
"article": "a",
"time": 3600,
"rarity": "common",
"image": "http://i.imgur.com/f7TgD1b.jpg",
"health": 100,
"degradation": 0.625,
"threshold": 110,
"badge": "Flower Power",
"reward": 600
},
{
"name": "Lavender",
"article": "a",
"time": 3600,
"rarity": "common",
"image": "http://i.imgur.com/g3OmOSK.jpg",
"health": 100,
"degradation": 0.625,
"threshold": 110,
"badge": "Flower Power",
"reward": 600
},
{
"name": "Lily",
"article": "a",
"time": 3600,
"rarity": "common",
"image": "http://i.imgur.com/0hzy7lO.jpg",
"health": 100,
"degradation": 0.625,
"threshold": 110,
"badge": "Flower Power",
"reward": 600
},
{
"name": "Petunia",
"article": "a",
"time": 3600,
"rarity": "common",
"image": "http://i.imgur.com/rJm8ISv.jpg",
"health": 100,
"degradation": 0.625,
"threshold": 110,
"badge": "Flower Power",
"reward": 600
},
{
"name": "Sunflower",
"article": "a",
"time": 3600,
"rarity": "common",
"image": "http://i.imgur.com/AzgzQK9.jpg",
"health": 100,
"degradation": 0.625,
"threshold": 110,
"badge": "Flower Power",
"reward": 600
},
{
"name": "Daffodil",
"article": "a",
"time": 3600,
"rarity": "common",
"image": "http://i.imgur.com/pnCCRsH.jpg",
"health": 100,
"degradation": 0.625,
"threshold": 110,
"badge": "Flower Power",
"reward": 600
},
{
"name": "Clover",
"article": "a",
"time": 3600,
"rarity": "common",
"image": "http://i.imgur.com/jNTgirw.jpg",
"health": 100,
"degradation": 0.625,
"threshold": 110,
"badge": "Flower Power",
"reward": 600
},
{
"name": "Tulip",
"article": "a",
"time": 3600,
"rarity": "common",
"image": "http://i.imgur.com/kodIFjE.jpg",
"health": 100,
"degradation": 0.625,
"threshold": 110,
"badge": "Flower Power",
"reward": 600
},
{
"name": "Rose",
"article": "a",
"time": 3600,
"rarity": "common",
"image": "http://i.imgur.com/sdTNiOH.jpg",
"health": 100,
"degradation": 0.625,
"threshold": 110,
"badge": "Flower Power",
"reward": 600
},
{
"name": "Aster",
"article": "an",
"time": 3600,
"rarity": "common",
"image": "http://i.imgur.com/1tN04Hl.jpg",
"health": 100,
"degradation": 0.625,
"threshold": 110,
"badge": "Flower Power",
"reward": 600
},
{
"name": "Aloe Vera",
"article": "an",
"time": 3600,
"rarity": "common",
"image": "http://i.imgur.com/WFAYIpx.jpg",
"health": 100,
"degradation": 0.625,
"threshold": 110,
"badge": "Flower Power",
"reward": 600
},
{
"name": "Orchid",
"article": "an",
"time": 3600,
"rarity": "common",
"image": "http://i.imgur.com/IQrQYDC.jpg",
"health": 100,
"degradation": 0.625,
"threshold": 110,
"badge": "Flower Power",
"reward": 600
},
{
"name": "Dragon Fruit Plant",
"article": "a",
"time": 5400,
"rarity": "uncommon",
"image": "http://i.imgur.com/pfngpDS.jpg",
"health": 100,
"degradation": 0.75,
"threshold": 110,
"badge": "Fruit Brute",
"reward": 1200
},
{
"name": "Mango Tree",
"article": "a",
"time": 5400,
"rarity": "uncommon",
"image": "http://i.imgur.com/ybR78Oc.jpg",
"health": 100,
"degradation": 0.75,
"threshold": 110,
"badge": "Fruit Brute",
"reward": 1200
},
{
"name": "Lychee Tree",
"article": "a",
"time": 5400,
"rarity": "uncommon",
"image": "http://i.imgur.com/w9LkfhX.jpg",
"health": 100,
"degradation": 0.75,
"threshold": 110,
"badge": "Fruit Brute",
"reward": 1200
},
{
"name": "Durian Tree",
"article": "a",
"time": 5400,
"rarity": "uncommon",
"image": "http://i.imgur.com/jh249fz.jpg",
"health": 100,
"degradation": 0.75,
"threshold": 110,
"badge": "Fruit Brute",
"reward": 1200
},
{
"name": "Fig Tree",
"article": "a",
"time": 5400,
"rarity": "uncommon",
"image": "http://i.imgur.com/YkhnpEV.jpg",
"health": 100,
"degradation": 0.75,
"threshold": 110,
"badge": "Fruit Brute",
"reward": 1200
},
{
"name": "Jack Fruit Tree",
"article": "a",
"time": 5400,
"rarity": "uncommon",
"image": "http://i.imgur.com/2D79TlA.jpg",
"health": 100,
"degradation": 0.75,
"threshold": 110,
"badge": "Fruit Brute",
"reward": 1200
},
{
"name": "Prickly Pear Plant",
"article": "a",
"time": 5400,
"rarity": "uncommon",
"image": "http://i.imgur.com/GrcGAGj.jpg",
"health": 100,
"degradation": 0.75,
"threshold": 110,
"badge": "Fruit Brute",
"reward": 1200
},
{
"name": "Pineapple Plant",
"article": "a",
"time": 5400,
"rarity": "uncommon",
"image": "http://i.imgur.com/VopYQtr.jpg",
"health": 100,
"degradation": 0.75,
"threshold": 110,
"badge": "Fruit Brute",
"reward": 1200
},
{
"name": "Citron Tree",
"article": "a",
"time": 5400,
"rarity": "uncommon",
"image": "http://i.imgur.com/zh7Dr23.jpg",
"health": 100,
"degradation": 0.75,
"threshold": 110,
"badge": "Fruit Brute",
"reward": 1200
},
{
"name": "Cherimoya Tree",
"article": "a",
"time": 5400,
"rarity": "uncommon",
"image": "http://i.imgur.com/H62gQK6.jpg",
"health": 100,
"degradation": 0.75,
"threshold": 110,
"badge": "Fruit Brute",
"reward": 1200
},
{
"name": "Mangosteen Tree",
"article": "a",
"time": 5400,
"rarity": "uncommon",
"image": "http://i.imgur.com/McNnMqa.jpg",
"health": 100,
"degradation": 0.75,
"threshold": 110,
"badge": "Fruit Brute",
"reward": 1200
},
{
"name": "Guava Tree",
"article": "a",
"time": 5400,
"rarity": "uncommon",
"image": "http://i.imgur.com/iy8WgPt.jpg",
"health": 100,
"degradation": 0.75,
"threshold": 110,
"badge": "Fruit Brute",
"reward": 1200
},
{
"name": "Orange Tree",
"article": "an",
"time": 5400,
"rarity": "uncommon",
"image": "http://i.imgur.com/lwjEJTm.jpg",
"health": 100,
"degradation": 0.75,
"threshold": 110,
"badge": "Fruit Brute",
"reward": 1200
},
{
"name": "Apple Tree",
"article": "an",
"time": 5400,
"rarity": "uncommon",
"image": "http://i.imgur.com/QI3UTR3.jpg",
"health": 100,
"degradation": 0.75,
"threshold": 110,
"badge": "Fruit Brute",
"reward": 1200
},
{
"name": "Sapodilla Tree",
"article": "a",
"time": 5400,
"rarity": "uncommon",
"image": "http://i.imgur.com/6BvO5Fu.jpg",
"health": 100,
"degradation": 0.75,
"threshold": 110,
"badge": "Fruit Brute",
"reward": 1200
},
{
"name": "Franklin Tree",
"article": "a",
"time": 7200,
"rarity": "rare",
"image": "http://i.imgur.com/hoh17hp.jpg",
"health": 100,
"degradation": 1,
"threshold": 110,
"badge": "Sporadic",
"reward": 2400
},
{
"name": "Parrot's Beak",
"article": "a",
"time": 7200,
"rarity": "rare",
"image": "http://i.imgur.com/lhSjfQY.jpg",
"health": 100,
"degradation": 1,
"threshold": 110,
"badge": "Sporadic",
"reward": 2400
},
{
"name": "Koki'o",
"article": "a",
"time": 7200,
"rarity": "rare",
"image": "http://i.imgur.com/Dhw9ync.jpg",
"health": 100,
"degradation": 1,
"threshold": 110,
"badge": "Sporadic",
"reward": 2400
},
{
"name": "Jade Vine",
"article": "a",
"time": 7200,
"rarity": "rare",
"image": "http://i.imgur.com/h4fJo2R.jpg",
"health": 100,
"degradation": 1,
"threshold": 110,
"badge": "Sporadic",
"reward": 2400
},
{
"name": "Venus Fly Trap",
"article": "a",
"time": 7200,
"rarity": "rare",
"image": "http://i.imgur.com/NoSdxXh.jpg",
"health": 100,
"degradation": 1,
"threshold": 110,
"badge": "Sporadic",
"reward": 2400
},
{
"name": "Chocolate Cosmos",
"article": "a",
"time": 7200,
"rarity": "rare",
"image": "http://i.imgur.com/4ArSekX.jpg",
"health": 100,
"degradation": 1,
"threshold": 110,
"badge": "Sporadic",
"reward": 2400
},
{
"name": "Pizza Plant",
"article": "a",
"time": 9000,
"rarity": "super-rare",
"image": "http://i.imgur.com/ASZXr7C.png",
"health": 100,
"degradation": 1,
"threshold": 110,
"badge": "Odd-pod",
"reward": 3600
},
{
"name": "tba",
"article": "a",
"time": 9000,
"rarity": "super-rare",
"image": "tba",
"health": 100,
"degradation": 1.5,
"threshold": 110,
"badge": "Odd-pod",
"reward": 3600
},
{
"name": "Pirahna Plant",
"article": "a",
"time": 9000,
"rarity": "super-rare",
"image": "http://i.imgur.com/c03i9W7.jpg",
"health": 100,
"degradation": 1.5,
"threshold": 110,
"badge": "Odd-pod",
"reward": 3600
},
{
"name": "tba",
"article": "a",
"time": 9000,
"rarity": "super-rare",
"image": "tba",
"health": 100,
"degradation": 1.5,
"threshold": 110,
"badge": "Odd-pod",
"reward": 3600
},
{
"name": "Peashooter",
"article": "a",
"time": 9000,
"rarity": "super-rare",
"image": "https://i.imgur.com/Vo4v2Ry.png",
"health": 100,
"degradation": 1.5,
"threshold": 110,
"badge": "Odd-pod",
"reward": 3600
},
{
"name": "tba",
"article": "a",
"time": 10800,
"rarity": "epic",
"image": "tba",
"health": 100,
"degradation": 2,
"threshold": 110,
"badge": "Greenfingers",
"reward": 5400
},
{
"name": "Pikmin",
"article": "a",
"time": 10800,
"rarity": "epic",
"image": "http://i.imgur.com/sizf7hE.png",
"health": 100,
"degradation": 2,
"threshold": 110,
"badge": "Greenfingers",
"reward": 5400
},
{
"name": "Flora Colossus",
"article": "a",
"time": 10800,
"rarity": "epic",
"image": "http://i.imgur.com/9f5QzaW.jpg",
"health": 100,
"degradation": 2,
"threshold": 110,
"badge": "Greenfingers",
"reward": 5400
},
{
"name": "Plantera Bulb",
"article": "a",
"time": 10800,
"rarity": "epic",
"image": "https://i.imgur.com/ExqLLHO.png",
"health": 100,
"degradation": 2,
"threshold": 110,
"badge": "Greenfingers",
"reward": 5400
},
{
"name": "Chorus Tree",
"article": "an",
"time": 10800,
"rarity": "epic",
"image": "https://i.imgur.com/tv2B72j.png",
"health": 100,
"degradation": 2,
"threshold": 110,
"badge": "Greenfingers",
"reward": 5400
},
{
"name": "Money Tree",
"article": "a",
"time": 35400,
"rarity": "legendary",
"image": "http://i.imgur.com/MIJQDLL.jpg",
"health": 100,
"degradation": 3,
"threshold": 110,
"badge": "Nobel Peas Prize",
"reward": 10800
},
{
"name": "Truffula Tree",
"article": "a",
"time": 35400,
"rarity": "legendary",
"image": "http://i.imgur.com/cFSmaHH.png",
"health": 100,
"degradation": 3,
"threshold": 110,
"badge": "Nobel Peas Prize",
"reward": 10800
},
{
"name": "Whomping Willow",
"article": "a",
"time": 35400,
"rarity": "legendary",
"image": "http://i.imgur.com/Ibwm2xY.jpg",
"health": 100,
"degradation": 3,
"threshold": 110,
"badge": "Nobel Peas Prize",
"reward": 10800
}
],
"event": {
"January": {
"name": "Tanabata Tree",
"article": "a",
"time": 70800,
"rarity": "event",
"image": "http://i.imgur.com/FD38JJj.jpg",
"health": 100,
"degradation": 9,
"threshold": 110,
"badge": "Annualsary",
"reward": 21600
},
"February": {
"name": "Chocolate Rose",
"article": "a",
"time": 70800,
"rarity": "event",
"image": "http://i.imgur.com/Sqg6pcG.jpg",
"health": 100,
"degradation": 9,
"threshold": 110,
"badge": "Annualsary",
"reward": 21600
},
"March": {
"name": "Shamrock",
"article": "a",
"time": 70800,
"rarity": "event",
"image": "http://i.imgur.com/kVig04M.jpg",
"health": 100,
"degradation": 9,
"threshold": 110,
"badge": "Annualsary",
"reward": 21600
},
"April": {
"name": "Easter Egg Eggplant",
"article": "an",
"time": 70800,
"rarity": "event",
"image": "http://i.imgur.com/5jltGQa.jpg",
"health": 100,
"degradation": 9,
"threshold": 110,
"badge": "Annualsary",
"reward": 21600
},
"October": {
"name": "Jack O' Lantern",
"article": "a",
"time": 70800,
"rarity": "event",
"image": "http://i.imgur.com/efApsxG.jpg",
"health": 100,
"degradation": 9,
"threshold": 110,
"badge": "Annualsary",
"reward": 21600
},
"November": {
"name": "Mayflower",
"article": "a",
"time": 70800,
"rarity": "event",
"image": "http://i.imgur.com/nntNtoL.jpg",
"health": 100,
"degradation": 9,
"threshold": 110,
"badge": "Annualsary",
"reward": 21600
},
"December": {
"name": "Holly",
"article": "a",
"time": 70800,
"rarity": "event",
"image": "http://i.imgur.com/maDLmJC.jpg",
"health": 100,
"degradation": 9,
"threshold": 110,
"badge": "Annualsary",
"reward": 21600
}
}
}

@ -0,0 +1,42 @@
{
"water": {
"cost": 5,
"health": 10,
"damage": 45,
"modifier": 0,
"category": "water",
"uses": 1
},
"manure": {
"cost": 20,
"health": 20,
"damage": 55,
"modifier": -0.035,
"category": "fertilizer",
"uses": 1
},
"vermicompost": {
"cost": 35,
"health": 30,
"damage": 60,
"modifier": -0.5,
"category": "fertilizer",
"uses": 1
},
"nitrates": {
"cost": 70,
"health": 60,
"damage": 75,
"modifier": -0.08,
"category": "fertilizer",
"uses": 1
},
"pruner": {
"cost": 500,
"health": 40,
"damage": 90,
"modifier": -0.065,
"category": "tool",
"uses": 10
}
}

@ -0,0 +1,22 @@
{
"author": [
"Bobloy",
"SnappyDragon",
"PaddoInWonderland"
],
"bot_version": [
3,
0,
0
],
"description": "Grow your own plants! Be sure to take care of it. Do `[p]gardening` to get started",
"hidden": false,
"install_msg": "Thank you for installing PlantTycoon. Check out all the commands with `[p]help PlantTycoon`",
"requirements": [],
"short": "Grow your own plants! Do `[p]gardening` to get started.",
"tags": [
"bobloy",
"games",
"environment"
]
}

File diff suppressed because it is too large Load Diff

@ -8,8 +8,8 @@
0
],
"description": "Create a QR code invite for the server",
"hidden": true,
"install_msg": "Thank you for installing QRInvite! Get started with `[p]help QRInvite`",
"hidden": false,
"install_msg": "Thank you for installing QRInvite! Get started with `[p]load qrinvite`, then `[p]help QRInvite`",
"requirements": [
"MyQR"
],

@ -7,9 +7,12 @@ from PIL import Image
from redbot.core import Config, commands
from redbot.core.bot import Red
from redbot.core.data_manager import cog_data_path
from typing import Any
Cog: Any = getattr(commands, "Cog", object)
class QRInvite:
class QRInvite(Cog):
"""
V3 Cog Template
"""

@ -2,7 +2,7 @@
"author" : ["Bobloy"],
"bot_version" : [3,0,0],
"description" : "Cog to prevent reactions on specific messages from certain users",
"hidden" : false,
"hidden" : true,
"install_msg" : "Thank you for installing ReactRestrict.",
"requirements" : [],
"short" : "[Incomplete] Prevent reactions",

@ -4,6 +4,9 @@ import discord
from redbot.core import Config
from redbot.core import commands
from redbot.core.bot import Red
from typing import Any
Cog: Any = getattr(commands, "Cog", object)
class ReactRestrictCombo:
@ -31,7 +34,7 @@ class ReactRestrictCombo:
)
class ReactRestrict:
class ReactRestrict(Cog):
"""
Prevent specific roles from reacting to specific messages
"""

@ -10,7 +10,7 @@
],
"description": "Apply for a job at the recycling plant! Sort out the garbage!",
"hidden": false,
"install_msg": "Thank you for installing RecyclingPlant. Start recycling today with `[p]recyclingplant`",
"install_msg": "Thank you for installing RecyclingPlant. Start recycling today with `[p]load recyclingplant`, then `[p]recyclingplant`",
"requirements": [],
"short": "Apply for a job at the recycling plant!",
"tags": [

@ -5,9 +5,12 @@ import random
from redbot.core import bank
from redbot.core import commands
from redbot.core.data_manager import cog_data_path
from typing import Any
Cog: Any = getattr(commands, "Cog", object)
class RecyclingPlant:
class RecyclingPlant(Cog):
"""Apply for a job at the recycling plant!"""
def __init__(self, bot):

@ -10,7 +10,7 @@
],
"description": "Play Rock Papers Scissor Lizard Spock by Sam Kass in Discord!",
"hidden": false,
"install_msg": "Thank you for installing RPSLP. Get started with `[p]rpsls`",
"install_msg": "Thank you for installing RPSLP. Get started with `[p]load rpsls`, then `[p]rpsls`",
"requirements": [],
"short": "Play Rock Papers Scissor Lizard Spock in Discord!",
"tags": [

@ -3,9 +3,12 @@ import random
import discord
from redbot.core import commands
from typing import Any
Cog: Any = getattr(commands, "Cog", object)
class RPSLS:
class RPSLS(Cog):
"""Play Rock Paper Scissors Lizard Spock."""
weaknesses = {

@ -9,7 +9,7 @@
],
"description": "Convert any website into text and post it in chat",
"hidden": true,
"install_msg": "Thank you for installing SayUrl",
"install_msg": "Thank you for installing SayUrl! Get started with `[p]load forcemention`, then `[p]help SayUrl",
"requirements": ["html2text"],
"short": "Convert URL to text",
"tags": [

@ -4,16 +4,18 @@ import html2text
from redbot.core import Config, commands
from redbot.core.bot import Red
from redbot.core.utils.chat_formatting import pagify
from typing import Any
Cog: Any = getattr(commands, "Cog", object)
async def fetch_url(session, url):
with aiohttp.Timeout(20):
async with session.get(url) as response:
assert response.status == 200
return await response.text()
class SayUrl:
class SayUrl(Cog):
"""
V3 Cog Template
"""

@ -10,7 +10,7 @@
],
"description": "Look up SCP articles. Warning: Some of them may be too creepy or gruesome.",
"hidden": false,
"install_msg": "You are now connected to the SCP database. You may now proceed to access the data using `[p]help SCP`",
"install_msg": "You are now connected to the SCP database. You may now proceed to access the data using `[p]load scp`, then `[p]help SCP`",
"requirements": [],
"short": "Look up SCP articles.",
"tags": [

@ -1,8 +1,11 @@
import discord
from redbot.core import commands
from typing import Any
Cog: Any = getattr(commands, "Cog", object)
class SCP:
class SCP(Cog):
"""Look up SCP articles. Warning: Some of them may be too creepy or gruesome."""
def __init__(self, bot):

@ -4,6 +4,9 @@ import discord
from redbot.core import Config, commands
from redbot.core.bot import Red
from typing import Any
Cog: Any = getattr(commands, "Cog", object)
async def fetch_img(session, url):
@ -13,7 +16,7 @@ async def fetch_img(session, url):
return await response.read()
class StealEmoji:
class StealEmoji(Cog):
"""
This cog steals emojis and creates servers for them
"""

@ -9,7 +9,7 @@
],
"description": "Apply roles based on the # of days on server",
"hidden": false,
"install_msg": "Thank you for installing timerole. Configure with [p]timerole",
"install_msg": "Thank you for installing timerole.\nGet started with `[p]load timerole`. Configure with [p]timerole",
"requirements": [],
"short": "Apply roles after # of days",
"tags": [

@ -5,9 +5,12 @@ import discord
from redbot.core import Config, checks, commands
from redbot.core.bot import Red
from redbot.core.utils.chat_formatting import pagify
from typing import Any
Cog: Any = getattr(commands, "Cog", object)
class Timerole:
class Timerole(Cog):
"""Add roles to users based on time on server"""
def __init__(self, bot: Red):

@ -9,7 +9,7 @@
],
"description": "Send Text2Speech messages as an uploaded mp3",
"hidden": true,
"install_msg": "Thank you for installing TTS. Get started with `[p]tts`",
"install_msg": "Thank you for installing TTS. Get started with `[p]load tts`, then `[p]help TTS`",
"requirements": [
"gTTS"
],

@ -4,11 +4,14 @@ import discord
from gtts import gTTS
from redbot.core import Config, commands
from redbot.core.bot import Red
from typing import Any
Cog: Any = getattr(commands, "Cog", object)
class TTS:
class TTS(Cog):
"""
V3 Cog Template
Send Text-to-Speech messages
"""
def __init__(self, bot: Red):
@ -24,9 +27,7 @@ class TTS:
@commands.command(aliases=["t2s", "text2"])
async def tts(self, ctx: commands.Context, *, text: str):
"""
My custom cog
Extra information goes here
Send Text to speech messages as an mp3
"""
mp3_fp = io.BytesIO()
tts = gTTS(text, 'en')

@ -2,9 +2,12 @@ import codecs as c
import discord
from redbot.core import commands
from typing import Any
Cog: Any = getattr(commands, "Cog", object)
class Unicode:
class Unicode(Cog):
"""Encode/Decode Unicode characters!"""
def __init__(self, bot):

@ -1,17 +1,23 @@
import asyncio
import random
from typing import List, Any, Dict, Set, Union
import discord
from redbot.core import commands
from werewolf.builder import parse_code
from werewolf.player import Player
from werewolf.role import Role
from werewolf.votegroup import VoteGroup
class Game:
"""
Base class to run a single game of Werewolf
"""
vote_groups: Dict[str, VoteGroup]
roles: List[Role]
players: List[Player]
default_secret_channel = {
"channel": None,

@ -9,7 +9,7 @@
],
"description": "Customizable Werewolf Game",
"hidden": false,
"install_msg": "Thank you for installing Werewolf! Use [p]wwset to run inital setup",
"install_msg": "Thank you for installing Werewolf! Get started with `[p]load werewolf`\n Use `[p]wwset` to run inital setup",
"requirements": [],
"short": "Werewolf Game",
"tags": [

@ -3,3 +3,21 @@ from werewolf.role import Role
def night_immune(role: Role):
role.player.alive = True
async def pick_target(role: Role, ctx, data):
if not role.player.alive: # FixMe: Game handles this?
await role.player.send_dm("You're already dead!")
return None
target_id = int(data)
try:
target = role.game.players[target_id]
except IndexError:
target = None
if target is None:
await ctx.send("Not a valid ID")
return None
return target_id, target

@ -1,3 +1,4 @@
from werewolf.night_powers import pick_target
from werewolf.role import Role
@ -61,7 +62,7 @@ class Seer(Role):
return
self.see_target = None
await self.game.generate_targets(self.player.member)
await self.player.send_dm("**Pick a target to see tonight**\n")
await self.player.send_dm("**Pick a target to see tonight**")
async def _at_night_end(self, data=None):
if self.see_target is None:
@ -83,19 +84,7 @@ class Seer(Role):
async def choose(self, ctx, data):
"""Handle night actions"""
if not self.player.alive: # FixMe: Game handles this?
await self.player.send_dm("You're already dead!")
return
target_id = int(data)
try:
target = self.game.players[target_id]
except IndexError:
target = None
if target is None:
await ctx.send("Not a valid ID")
return
await super().choose(ctx, data)
self.see_target = target_id
self.see_target, target = await pick_target(self, ctx, data)
await ctx.send("**You will attempt to see the role of {} tonight...**".format(target.member.display_name))

@ -1,3 +1,4 @@
from werewolf.night_powers import pick_target
from werewolf.role import Role
@ -59,6 +60,7 @@ class Shifter(Role):
def __init__(self, game):
super().__init__(game)
self.shift_target = None
self.action_list = [
(self._at_game_start, 1), # (Action, Priority)
(self._at_day_start, 0),
@ -74,7 +76,7 @@ class Shifter(Role):
async def see_alignment(self, source=None):
"""
Interaction for investigative roles attempting
to see alignment (Village, Werewolf Other)
to see alignment (Village, Werewolf, Other)
"""
return "Other"
@ -90,14 +92,38 @@ class Shifter(Role):
Interaction for investigative roles.
More common to be able to deceive this action
"""
return "MyRole"
return "Shifter"
async def _at_night_start(self, data=None):
await super()._at_night_start(data)
self.shift_target = None
await self.game.generate_targets(self.player.member)
await self.player.send_dm("**Pick a target to shift into**")
async def _at_night_end(self, data=None):
await super()._at_night_end(data)
if self.shift_target is None:
if self.player.alive:
await self.player.send_dm("You will not use your powers tonight...")
return
target = await self.game.visit(self.shift_target, self.player)
if target and target.player.alive:
await target.role.assign_player(self.player)
await self.assign_player(target)
# Roles have now been swapped
await self.player.send_dm("Your role has been stolen...\n"
"You are now a **Shifter**.")
await self.player.send_dm(self.game_start_message)
await target.send_dm(target.role.game_start_message)
else:
await self.player.send_dm("**Your shift failed...**")
async def choose(self, ctx, data):
"""Handle night actions"""
await super().choose(ctx, data)
self.shift_target, target = await pick_target(self, ctx, data)
await ctx.send("**You will attempt to see the role of {} tonight...**".format(target.member.display_name))

@ -8,9 +8,12 @@ from redbot.core import commands
from werewolf.builder import GameBuilder, role_from_name, role_from_alignment, role_from_category, role_from_id
from werewolf.game import Game
from redbot.core.utils.menus import menu, DEFAULT_CONTROLS
from typing import Any
Cog: Any = getattr(commands, "Cog", object)
class Werewolf:
class Werewolf(Cog):
"""
Base to host werewolf on a guild
"""
@ -389,4 +392,3 @@ class Werewolf:
return False, None, None, None, None
return True, role, category, channel, log_channel

Loading…
Cancel
Save