juftin/camply

Going-to-camp provider campground listing not working

cpwang96 opened this issue ยท 5 comments

Describe the bug
Receiving bad data from GoingtoCamp API

Original Camply Command (with --debug)

camply campgrounds --debug --provider goingtocamp --rec-area 3

Expected behavior
< A clear and concise description of what you expected to happen. >

Console Output (with --debug)

chuping@Chupings-Air ~ % camply campgrounds --debug --provider goingtocamp --rec-area 3
[2023-04-04 11:46:58] CAMPLY   camply, the campsite finder โ›บ๏ธ                                                                                                                                               
[2023-04-04 11:46:58] INFO     Using Camply Provider: "GoingToCamp"                                                                                                                                         
[2023-04-04 11:46:58] DEBUG    Setting up camply debugging                                                                                                                                                  
[2023-04-04 11:46:58] DEBUG    Camply Version: 0.16.0                                                                                                                                                       
[2023-04-04 11:46:58] DEBUG    Python Version: 3.9.6                                                                                                                                                        
[2023-04-04 11:46:58] DEBUG    Platform: darwin                                                                                                                                                             
[2023-04-04 11:46:58] INFO     Retrieving Facility Information for Recreation Area ID: `3`.                                                                                                                 
[2023-04-04 11:46:58] DEBUG    Starting new HTTPS connection (1): washington.goingtocamp.com:443                                                                                                            
[2023-04-04 11:46:58] DEBUG    https://washington.goingtocamp.com:443 "GET /api/resourcelocation/rootmaps HTTP/1.1" 404 0                                                                                   
[2023-04-04 11:46:58] ERROR    Receiving bad data from GoingToCamp API: status_code:                                                                                                                        
[2023-04-04 11:46:58] CAMPLY   Exiting camply ๐Ÿ‘‹                                                                                                                                                            
โ•ญโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ Traceback (most recent call last) โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฎ
โ”‚ /Users/chuping/Library/Python/3.9/bin/camply:8 in <module>                                       โ”‚
โ”‚                                                                                                  โ”‚
โ”‚   5 from camply.cli import cli                                                                   โ”‚
โ”‚   6 if __name__ == '__main__':                                                                   โ”‚
โ”‚   7 โ”‚   sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0])                         โ”‚
โ”‚ โฑ 8 โ”‚   sys.exit(cli())                                                                          โ”‚
โ”‚   9                                                                                              โ”‚
โ”‚                                                                                                  โ”‚
โ”‚ โ•ญโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ locals โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฎ โ”‚
โ”‚ โ”‚ cli = <function cli at 0x1289f98b0>                                                          โ”‚ โ”‚
โ”‚ โ”‚  re = <module 're' from                                                                      โ”‚ โ”‚
โ”‚ โ”‚       '/Library/Developer/CommandLineTools/Library/Frameworks/Python3.framework/Versions/3.โ€ฆ โ”‚ โ”‚
โ”‚ โ”‚ sys = <module 'sys' (built-in)>                                                              โ”‚ โ”‚
โ”‚ โ•ฐโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฏ โ”‚
โ”‚                                                                                                  โ”‚
โ”‚ /Users/chuping/Library/Python/3.9/lib/python/site-packages/camply/cli.py:750 in cli              โ”‚
โ”‚                                                                                                  โ”‚
โ”‚   747 โ”‚   Camply Command Line Utility Wrapper                                                    โ”‚
โ”‚   748 โ”‚   """                                                                                    โ”‚
โ”‚   749 โ”‚   try:                                                                                   โ”‚
โ”‚ โฑ 750 โ”‚   โ”‚   camply_command_line()                                                              โ”‚
โ”‚   751 โ”‚   except KeyboardInterrupt:                                                              โ”‚
โ”‚   752 โ”‚   โ”‚   logger.debug("Handling Exit Request")                                              โ”‚
โ”‚   753 โ”‚   finally:                                                                               โ”‚
โ”‚                                                                                                  โ”‚
โ”‚ /Users/chuping/Library/Python/3.9/lib/python/site-packages/click/core.py:1130 in __call__        โ”‚
โ”‚                                                                                                  โ”‚
โ”‚ /Users/chuping/Library/Python/3.9/lib/python/site-packages/rich_click/rich_group.py:21 in main   โ”‚
โ”‚                                                                                                  โ”‚
โ”‚ /Users/chuping/Library/Python/3.9/lib/python/site-packages/click/core.py:1055 in main            โ”‚
โ”‚                                                                                                  โ”‚
โ”‚ /Users/chuping/Library/Python/3.9/lib/python/site-packages/click/core.py:1657 in invoke          โ”‚
โ”‚                                                                                                  โ”‚
โ”‚ /Users/chuping/Library/Python/3.9/lib/python/site-packages/click/core.py:1404 in invoke          โ”‚
โ”‚                                                                                                  โ”‚
โ”‚ /Users/chuping/Library/Python/3.9/lib/python/site-packages/click/core.py:760 in invoke           โ”‚
โ”‚                                                                                                  โ”‚
โ”‚ /Users/chuping/Library/Python/3.9/lib/python/site-packages/click/decorators.py:38 in new_func    โ”‚
โ”‚                                                                                                  โ”‚
โ”‚ /Users/chuping/Library/Python/3.9/lib/python/site-packages/camply/cli.py:311 in campgrounds      โ”‚
โ”‚                                                                                                  โ”‚
โ”‚   308 โ”‚   params = {}                                                                            โ”‚
โ”‚   309 โ”‚   if state is not None:                                                                  โ”‚
โ”‚   310 โ”‚   โ”‚   params.update({"state": state})                                                    โ”‚
โ”‚ โฑ 311 โ”‚   camp_finder.find_campgrounds(                                                          โ”‚
โ”‚   312 โ”‚   โ”‚   search_string=search,                                                              โ”‚
โ”‚   313 โ”‚   โ”‚   rec_area_id=make_list(rec_area, coerce=int),                                       โ”‚
โ”‚   314 โ”‚   โ”‚   campground_id=make_list(campground, coerce=int),                                   โ”‚
โ”‚                                                                                                  โ”‚
โ”‚ โ•ญโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ locals โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฎ       โ”‚
โ”‚ โ”‚           camp_finder = <GoingToCampProvider>                                          โ”‚       โ”‚
โ”‚ โ”‚            campground = ()                                                             โ”‚       โ”‚
โ”‚ โ”‚              campsite = ()                                                             โ”‚       โ”‚
โ”‚ โ”‚               context = CamplyContext(debug=True, provider=None)                       โ”‚       โ”‚
โ”‚ โ”‚                 debug = True                                                           โ”‚       โ”‚
โ”‚ โ”‚                params = {}                                                             โ”‚       โ”‚
โ”‚ โ”‚              provider = 'GoingToCamp'                                                  โ”‚       โ”‚
โ”‚ โ”‚              rec_area = ('3',)                                                         โ”‚       โ”‚
โ”‚ โ”‚                search = None                                                           โ”‚       โ”‚
โ”‚ โ”‚ search_provider_class = <class 'camply.search.search_going_to_camp.SearchGoingToCamp'> โ”‚       โ”‚
โ”‚ โ”‚                 state = None                                                           โ”‚       โ”‚
โ”‚ โ•ฐโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฏ       โ”‚
โ”‚                                                                                                  โ”‚
โ”‚ /Users/chuping/Library/Python/3.9/lib/python/site-packages/camply/providers/going_to_camp/going_ โ”‚
โ”‚ to_camp_provider.py:208 in find_campgrounds                                                      โ”‚
โ”‚                                                                                                  โ”‚
โ”‚   205 โ”‚   โ”‚   โ”‚   )                                                                              โ”‚
โ”‚   206 โ”‚   โ”‚   โ”‚   sys.exit(1)                                                                    โ”‚
โ”‚   207 โ”‚   โ”‚                                                                                      โ”‚
โ”‚ โฑ 208 โ”‚   โ”‚   return self.find_facilities_per_recreation_area(                                   โ”‚
โ”‚   209 โ”‚   โ”‚   โ”‚   rec_area_id=rec_area_id,                                                       โ”‚
โ”‚   210 โ”‚   โ”‚   โ”‚   campground_id=campground_id,                                                   โ”‚
โ”‚   211 โ”‚   โ”‚   โ”‚   searching_string=search_string,                                                โ”‚
โ”‚                                                                                                  โ”‚
โ”‚ โ•ญโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ locals โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฎ                                                        โ”‚
โ”‚ โ”‚ campground_id = []                    โ”‚                                                        โ”‚
โ”‚ โ”‚   campsite_id = []                    โ”‚                                                        โ”‚
โ”‚ โ”‚        kwargs = {}                    โ”‚                                                        โ”‚
โ”‚ โ”‚   rec_area_id = ['3']                 โ”‚                                                        โ”‚
โ”‚ โ”‚ search_string = None                  โ”‚                                                        โ”‚
โ”‚ โ”‚          self = <GoingToCampProvider> โ”‚                                                        โ”‚
โ”‚ โ•ฐโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฏ                                                        โ”‚
โ”‚                                                                                                  โ”‚
โ”‚ /Users/chuping/Library/Python/3.9/lib/python/site-packages/camply/providers/going_to_camp/going_ โ”‚
โ”‚ to_camp_provider.py:355 in find_facilities_per_recreation_area                                   โ”‚
โ”‚                                                                                                  โ”‚
โ”‚   352 โ”‚   โ”‚   โ”‚   sys.exit(1)                                                                    โ”‚
โ”‚   353 โ”‚   โ”‚                                                                                      โ”‚
โ”‚   354 โ”‚   โ”‚   self.campground_details = {}                                                       โ”‚
โ”‚ โฑ 355 โ”‚   โ”‚   api_response = self._api_request(rec_area_id, "LIST_CAMPGROUNDS")                  โ”‚
โ”‚   356 โ”‚   โ”‚                                                                                      โ”‚
โ”‚   357 โ”‚   โ”‚   filtered_facilities = self._filter_facilities_responses(                           โ”‚
โ”‚   358 โ”‚   โ”‚   โ”‚   rec_area_id, facilities=api_response                                           โ”‚
โ”‚                                                                                                  โ”‚
โ”‚ โ•ญโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ locals โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฎ                         โ”‚
โ”‚ โ”‚             _ = 'camping.bcparks.ca'                                 โ”‚                         โ”‚
โ”‚ โ”‚ campground_id = []                                                   โ”‚                         โ”‚
โ”‚ โ”‚        kwargs = {'searching_string': None}                           โ”‚                         โ”‚
โ”‚ โ”‚            ra = RecreationArea(                                      โ”‚                         โ”‚
โ”‚ โ”‚                 โ”‚   recreation_area='BC Parks',                      โ”‚                         โ”‚
โ”‚ โ”‚                 โ”‚   recreation_area_id=12,                           โ”‚                         โ”‚
โ”‚ โ”‚                 โ”‚   recreation_area_location='British Columbia, CA', โ”‚                         โ”‚
โ”‚ โ”‚                 โ”‚   coordinates=None,                                โ”‚                         โ”‚
โ”‚ โ”‚                 โ”‚   description=None                                 โ”‚                         โ”‚
โ”‚ โ”‚                 )                                                    โ”‚                         โ”‚
โ”‚ โ”‚      rec_area = RecreationArea(                                      โ”‚                         โ”‚
โ”‚ โ”‚                 โ”‚   recreation_area='Washington State Parks',        โ”‚                         โ”‚
โ”‚ โ”‚                 โ”‚   recreation_area_id=3,                            โ”‚                         โ”‚
โ”‚ โ”‚                 โ”‚   recreation_area_location='Washington, USA',      โ”‚                         โ”‚
โ”‚ โ”‚                 โ”‚   coordinates=None,                                โ”‚                         โ”‚
โ”‚ โ”‚                 โ”‚   description=None                                 โ”‚                         โ”‚
โ”‚ โ”‚                 )                                                    โ”‚                         โ”‚
โ”‚ โ”‚   rec_area_id = '3'                                                  โ”‚                         โ”‚
โ”‚ โ”‚ search_string = None                                                 โ”‚                         โ”‚
โ”‚ โ”‚          self = <GoingToCampProvider>                                โ”‚                         โ”‚
โ”‚ โ•ฐโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฏ                         โ”‚
โ”‚                                                                                                  โ”‚
โ”‚ /Users/chuping/Library/Python/3.9/lib/python/site-packages/camply/providers/going_to_camp/going_ โ”‚
โ”‚ to_camp_provider.py:418 in _api_request                                                          โ”‚
โ”‚                                                                                                  โ”‚
โ”‚   415 โ”‚   โ”‚   โ”‚   error_message = "Receiving bad data from GoingToCamp API: status_code: "       โ”‚
โ”‚   416 โ”‚   โ”‚   โ”‚   f"{response.status_code}: {response.text}"                                     โ”‚
โ”‚   417 โ”‚   โ”‚   โ”‚   logger.error(error_message)                                                    โ”‚
โ”‚ โฑ 418 โ”‚   โ”‚   โ”‚   raise ConnectionError(error_message)                                           โ”‚
โ”‚   419 โ”‚   โ”‚                                                                                      โ”‚
โ”‚   420 โ”‚   โ”‚   return json.loads(response.content)                                                โ”‚
โ”‚   421                                                                                            โ”‚
โ”‚                                                                                                  โ”‚
โ”‚ โ•ญโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ locals โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฎ โ”‚
โ”‚ โ”‚      endpoint = 'https://{}/api/resourcelocation/rootmaps'                                   โ”‚ โ”‚
โ”‚ โ”‚ endpoint_name = 'LIST_CAMPGROUNDS'                                                           โ”‚ โ”‚
โ”‚ โ”‚ error_message = 'Receiving bad data from GoingToCamp API: status_code: '                     โ”‚ โ”‚
โ”‚ โ”‚      hostname = 'washington.goingtocamp.com'                                                 โ”‚ โ”‚
โ”‚ โ”‚        params = {}                                                                           โ”‚ โ”‚
โ”‚ โ”‚   rec_area_id = '3'                                                                          โ”‚ โ”‚
โ”‚ โ”‚      response = <Response [404]>                                                             โ”‚ โ”‚
โ”‚ โ”‚          self = <GoingToCampProvider>                                                        โ”‚ โ”‚
โ”‚ โ”‚           url = 'https://washington.goingtocamp.com/api/resourcelocation/rootmaps'           โ”‚ โ”‚
โ”‚ โ”‚    user_agent = {                                                                            โ”‚ โ”‚
โ”‚ โ”‚                 โ”‚   'User-Agent': 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/534.24 (KHTML,   โ”‚ โ”‚
โ”‚ โ”‚                 like Gecko) Chrome/12.0.'+19                                                 โ”‚ โ”‚
โ”‚ โ”‚                 }                                                                            โ”‚ โ”‚
โ”‚ โ•ฐโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฏ โ”‚
โ•ฐโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฏ
ConnectionError: Receiving bad data from GoingToCamp API: status_code: 

Additional context

< Add any other context about the problem here. >

I'm getting errors trying to create a booking in the browser as well. It appears as though they're having an outage.

E.g. this URL is generated by their web application, and I see a 404 in the javascript console of my browser during page load: https://washington.goingtocamp.com/create-booking/results?resourceLocationId=-2147483593&mapId=-2147483561&searchTabGroupId=0&bookingCategoryId=0&startDate=2023-05-01&endDate=2023-05-08&nights=7&isReserving=true&equipmentId=-32768&subEquipmentId=-32764&partySize=1&filterData=%7B%22-32759%22:%22%5B%5B1%5D,0,0,0%5D%22,%22-32708%22:%22%5B%5B1%5D,0,0,0%5D%22%7D&searchTime=2023-04-04T12:06:18.134

After selecting a site and clicking "Reserve" also results in an infinite spinner with a "Securing your site" message.

GTC actually did remove the rootmaps endpoint. I refactored to use a different endpoint that seems to be doing the trick, but I'll need to do a bit more testing before I'm confident.

@cpwang96 There's a fix for this that should be ready soon, once I get some input from @juftin on the pull request.

juftin commented

๐ŸŽ‰ This issue has been resolved in version 0.16.1 ๐ŸŽ‰

The release is available on GitHub release

Your semantic-release bot ๐Ÿ“ฆ๐Ÿš€