Discord BotΒΆ

This is an example of a basic discord bot and some commands.

  1# this example assumes you have discord.py > v1.5
  2# installed via `python -m pip install -U discord.py`
  3# for more info on using discord.py, see the docs at:
  4# https://discordpy.readthedocs.io/en/latest
  5
  6import logging
  7import os
  8import traceback
  9
 10import coc
 11import discord
 12
 13from coc import utils
 14from discord.ext import commands
 15
 16INFO_CHANNEL_ID = 761848043242127370  # some discord channel ID
 17clan_tags = ["#20090C9PR", "#202GG92Q", "#20C8G0RPL"]
 18
 19bot = commands.Bot(command_prefix="?", intents=discord.Intents.all())
 20coc_client = coc.login(
 21    os.environ["DEV_SITE_EMAIL"],
 22    os.environ["DEV_SITE_PASSWORD"],
 23    key_names="coc.py tests",
 24    client=coc.EventsClient,
 25)
 26logging.basicConfig(level=logging.ERROR)
 27
 28
 29@bot.event
 30async def on_ready():
 31    print("Logged in!!")
 32
 33
 34@coc_client.event
 35@coc.ClanEvents.member_join(tags=clan_tags)
 36async def on_clan_member_join(member, clan):
 37    await bot.get_channel(INFO_CHANNEL_ID).send(
 38        "{0.name} ({0.tag}) just " "joined our clan {1.name} ({1.tag})!".format(
 39            member, clan)
 40    )
 41
 42
 43@coc_client.event
 44@coc.ClanEvents.member_name(tags=clan_tags)
 45async def member_name_change(old_player, new_player):
 46    await bot.get_channel(INFO_CHANNEL_ID).send(
 47        "Name Change! {0.name} is now called {1.name} (his tag is {1.tag})".format(
 48            old_player, new_player)
 49    )
 50
 51
 52@coc_client.event
 53@coc.ClientEvents.event_error()
 54async def on_event_error(exception):
 55    if isinstance(exception, coc.PrivateWarLog):
 56        return  # lets ignore private war log errors
 57    print("Uh oh! Something went wrong in coc.py events... printing traceback for you.")
 58    traceback.print_exc()
 59
 60
 61@bot.command()
 62async def player_heroes(ctx, player_tag):
 63    if not utils.is_valid_tag(player_tag):
 64        await ctx.send("You didn't give me a proper tag!")
 65        return
 66
 67    try:
 68        player = await coc_client.get_player(player_tag)
 69    except coc.NotFound:
 70        await ctx.send("This player doesn't exist!")
 71        return
 72
 73    to_send = ""
 74    for hero in player.heroes:
 75        to_send += "{}: Lv{}/{}\n".format(str(hero),
 76                                          hero.level, hero.max_level)
 77
 78    await ctx.send(to_send)
 79
 80
 81@bot.command()
 82async def parse_army(ctx, army_link: str):
 83    troops, spells = coc_client.parse_army_link(army_link)
 84    print(troops, spells)
 85    parsed_link_output = ''
 86    if troops or spells:  # checking if troops or spells is present in link
 87
 88        for troop, quantity in troops:
 89            parsed_link_output += "The user wants {} {}s. They each have {} DPS.\n".format(
 90                quantity, troop.name, troop.dps)
 91
 92        for spell, quantity in spells:
 93            parsed_link_output += "The user wants {} {}s.\n".format(
 94                quantity, spell.name)
 95    else:
 96        parsed_link_output += "Invalid Link!"
 97    await ctx.send(parsed_link_output)
 98
 99@bot.command()
100async def create_army(ctx):
101    link = coc_client.create_army_link(
102        barbarian=10,
103        archer=20,
104        hog_rider=30,
105        healing_spell=3,
106        poison_spell=2,
107        rage_spell=2
108    )
109    await ctx.send(link)
110
111@bot.command()
112async def clan_info(ctx, clan_tag):
113    if not utils.is_valid_tag(clan_tag):
114        await ctx.send("You didn't give me a proper tag!")
115        return
116
117    try:
118        clan = await coc_client.get_clan(clan_tag)
119    except coc.NotFound:
120        await ctx.send("This clan doesn't exist!")
121        return
122
123    if clan.public_war_log is False:
124        log = "Private"
125    else:
126        log = "Public"
127
128    e = discord.Embed(colour=discord.Colour.green())
129    e.set_thumbnail(url=clan.badge.url)
130    e.add_field(name="Clan Name",
131                value=f"{clan.name}({clan.tag})\n[Open in game]({clan.share_link})", inline=False)
132    e.add_field(name="Clan Level", value=clan.level, inline=False)
133    e.add_field(name="Description", value=clan.description, inline=False)
134    e.add_field(name="Leader", value=clan.get_member_by(
135        role=coc.Role.leader), inline=False)
136    e.add_field(name="Clan Type", value=clan.type, inline=False)
137    e.add_field(name="Location", value=clan.location, inline=False)
138    e.add_field(name="Total Clan Trophies", value=clan.points, inline=False)
139    e.add_field(name="Total Clan Versus Trophies",
140                value=clan.versus_points, inline=False)
141    e.add_field(name="WarLog Type", value=log, inline=False)
142    e.add_field(name="Required Trophies",
143                value=clan.required_trophies, inline=False)
144    e.add_field(name="War Win Streak", value=clan.war_win_streak, inline=False)
145    e.add_field(name="War Frequency", value=clan.war_frequency, inline=False)
146    e.add_field(name="Clan War League Rank",
147                value=clan.war_league, inline=False)
148    e.add_field(name="Clan Labels", value="\n".join(
149        label.name for label in clan.labels), inline=False)
150    e.add_field(name="Member Count",
151                value=f"{clan.member_count}/50", inline=False)
152    e.add_field(
153        name="Clan Record",
154        value=f"Won - {clan.war_wins}\nLost - {clan.war_losses}\n Draw - {clan.war_ties}",
155        inline=False
156    )
157    await ctx.send(embed=e)
158
159
160@bot.command()
161async def clan_member(ctx, clan_tag):
162    if not utils.is_valid_tag(clan_tag):
163        await ctx.send("You didn't give me a proper tag!")
164        return
165    try: