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