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: