Events
This is an example of a basic events setup.
1import asyncio
2import logging
3import os
4
5import coc
6from coc import utils
7
8clan_tags = ["#P222C9Y", "#9VPR98RG", "#9G2QU8YG", "#80Y8L0QY", "#2Y28CGP8"]
9
10"""Clan Events"""
11
12
13@coc.ClanEvents.member_donations()
14async def on_clan_member_donation(old_member, new_member):
15 final_donated_troops = new_member.donations - old_member.donations
16 log.info(
17 f"{new_member} of {new_member.clan} just donated {final_donated_troops} troops.")
18
19
20@coc.ClanEvents.member_received()
21async def on_clan_member_donation_receive(old_member, new_member):
22 final_received_troops = new_member.received - old_member.received
23 log.info(
24 f"{new_member} of {new_member.clan} just received {final_received_troops} troops.")
25
26
27@coc.ClanEvents.member_join()
28async def on_clan_member_join(member, clan):
29 log.info(f"{member.name} has joined {clan.name}")
30
31
32@coc.ClanEvents.member_leave()
33async def on_clan_member_leave(member, clan):
34 log.info(f"{member.name} has left {clan.name}")
35
36
37@coc.ClanEvents.points()
38async def on_clan_trophy_change(old_clan, new_clan):
39 log.info(
40 f"{new_clan.name} total trophies changed from {old_clan.points} to {new_clan.points}")
41
42
43@coc.ClanEvents.member_builder_base_trophies()
44async def clan_member_builder_base_trophies_changed(old_member, new_member):
45 log.info(
46 f"{new_member} builder_base trophies changed from {old_member.builder_base_trophies} to"
47 f" {new_member.builder_base_trophies}")
48
49
50"""War Events"""
51
52
53@coc.WarEvents.war_attack()
54async def current_war_stats(attack, war):
55 log.info(
56 f"Attack number {attack.order}\n({attack.attacker.map_position}).{attack.attacker} of {attack.attacker.clan} "
57 f"attacked ({attack.defender.map_position}).{attack.defender} of {attack.defender.clan}")
58
59
60@coc.WarEvents.new_war()
61async def new_war(war):
62 log.info(f"New war against {war.opponent.name} detected.")
63
64
65"""Player Events"""
66
67
68@coc.PlayerEvents.donations()
69async def on_player_donation(old_player, new_player):
70 final_donated_troops = new_player.donations - old_player.donations
71 log.info(
72 f"{new_player} of {new_player.clan} just donated {final_donated_troops} troops.")
73
74
75@coc.PlayerEvents.received()
76async def on_player_donation_receive(old_player, new_player):
77 final_received_troops = new_player.received - old_player.received
78 log.info(
79 f"{new_player} of {new_player.clan} just received {final_received_troops} troops.")
80
81
82@coc.PlayerEvents.trophies()
83async def on_player_trophy_change(old_player, new_player):
84 log.info(
85 f"{new_player} trophies changed from {old_player.trophies} to {new_player.trophies}")
86
87
88@coc.PlayerEvents.builder_base_trophies()
89async def on_player_builder_base_trophy_change(old_player, new_player):
90 log.info(
91 f"{new_player} builder_base trophies changed from {old_player.builder_base_trophies} to {new_player.builder_base_trophies}")
92
93
94"""Client Events"""
95
96
97@coc.ClientEvents.maintenance_start()
98async def on_maintenance():
99 log.info("Maintenace Started")
100
101
102@coc.ClientEvents.maintenance_completion()
103async def on_maintenance_completion(time_started):
104 log.info(f"Maintenace Ended; started at {time_started}")
105
106
107@coc.ClientEvents.new_season_start()
108async def season_started():
109 log.info(f"New season started, and will finish at {str(utils.get_season_end())}")
110
111
112@coc.ClientEvents.clan_games_end()
113async def clan_games_ended():
114 log.info(f"Clan games have ended. The next ones will start at {str(utils.get_clan_games_start())}")
115
116
117@coc.ClientEvents.raid_weekend_start()
118async def raid_weekend_started():
119 log.info(f"A new Raid Weekend started. It will last until {str(utils.get_raid_weekend_end())}")
120
121
122async def main() -> None:
123 coc_client = coc.EventsClient()
124
125 # Attempt to log into CoC API using your credentials. You must use the
126 # coc.EventsClient to enable event listening
127 coc_client.add_player_updates(*[member.tag for member in clan.members])
128
129 # Register all the callback functions that are triggered when a
130 # event if fired.
131 coc_client.add_events(
132 on_clan_member_donation,
133 on_clan_member_donation_receive,
134 on_clan_member_join,
135 on_clan_member_leave,
136 on_clan_trophy_change,
137 clan_member_builder_base_trophies_changed,
138 current_war_stats,
139 on_player_donation,
140 on_player_donation_receive,
141 on_player_trophy_change,
142 on_player_builder_base_trophy_change,
143 on_maintenance,
144 on_maintenance_completion,
145 season_started
146 )
147
148 if os.environ.get("RUNNING_TESTS"):
149 # ignore this; it's just for running github action tests.
150 import sys
151
152 class Handler(logging.Handler):
153 def emit(self, record) -> None:
154 sys.exit(0)
155
156 log.addHandler(Handler())
157 # we don't want to wait forever for an event, so if
158 # it sets up OK lets call it quits.
159 await asyncio.sleep(20)
160 _loop = asyncio.get_event_loop()
161 _loop.stop()
162
163
164if __name__ == "__main__":
165 logging.basicConfig(level=logging.INFO)
166 log = logging.getLogger()
167
168 # Unlike the other examples that use `asyncio.run()`, in order to run
169 # events forever you must set the event loop to run forever so we will use
170 # the lower level function calls to handle this.
171 loop = asyncio.get_event_loop()
172
173 try:
174 # Using the loop context, run the main function then set the loop
175 # to run forever so that it continuously monitors for events
176 loop.run_until_complete(main())
177 loop.run_forever()
178 except KeyboardInterrupt:
179 pass