banner_ad_service.py (3982B)
1 #Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\packages\evebannerads\banner_ad_service.py 2 import uthread2 3 from carbon.common.script.sys.service import Service 4 from evebannerads.banner_ad_retrieval import retrieve_adglare_ad 5 from evebannerads.const import AD_DEFAULT_ROTATION_INTERVAL 6 7 class BannerAdService(Service): 8 __guid__ = 'svc.BannerAdService' 9 serviceName = 'svc.bannerAdService' 10 __displayname__ = 'BannerAdService' 11 __servicename__ = 'BannerAdService' 12 13 def Run(self, *args, **kwargs): 14 self._ad_threads_by_owner = {} 15 self._ad_request_by_owner = {} 16 Service.Run(self, *args, **kwargs) 17 18 def request_single_ad(self, banner_ad_request): 19 ad_data = self._get_ad_to_display(banner_ad_request) 20 if ad_data: 21 banner_ad_request.load_ad(ad_data) 22 else: 23 self._notify_failed_request(banner_ad_request) 24 25 def request_rotating_ads(self, banner_ad_request): 26 if banner_ad_request.banner_owner in self._ad_threads_by_owner: 27 self._attach_to_existing_thread(banner_ad_request) 28 else: 29 self._start_new_ad_thread(banner_ad_request) 30 31 def remove_ad_rotation_request(self, banner_owner): 32 ad_thread = self._ad_threads_by_owner.get(banner_owner) 33 if ad_thread: 34 ad_thread.kill() 35 self._remove_thread_and_data_for_owner(banner_owner) 36 37 def pause_ad_rotation_request(self, banner_owner): 38 if banner_owner in self._ad_request_by_owner: 39 self._ad_request_by_owner[banner_owner].paused = True 40 41 def _notify_failed_request(self, banner_ad_request): 42 failure_callback = banner_ad_request.failure_callback 43 if failure_callback is not None: 44 failure_callback() 45 46 def _attach_to_existing_thread(self, banner_ad_request): 47 banner_owner = banner_ad_request.banner_owner 48 banner_ad_request.received_data = self._ad_request_by_owner[banner_owner].received_data 49 self._ad_request_by_owner[banner_owner] = banner_ad_request 50 if banner_ad_request.received_data: 51 banner_ad_request.load_ad(banner_ad_request.received_data) 52 53 def _remove_thread_and_data_for_owner(self, banner_owner): 54 self._ad_threads_by_owner.pop(banner_owner, None) 55 self._ad_request_by_owner.pop(banner_owner, None) 56 57 def _start_new_ad_thread(self, banner_ad_request): 58 banner_owner = banner_ad_request.banner_owner 59 self._ad_request_by_owner[banner_owner] = banner_ad_request 60 ad_thread = uthread2.start_tasklet(self._display_ad_thread, banner_owner) 61 self._ad_threads_by_owner[banner_owner] = ad_thread 62 63 def _display_ad_thread(self, banner_owner): 64 while True: 65 rotation_delay = AD_DEFAULT_ROTATION_INTERVAL 66 ad_request = self._ad_request_by_owner[banner_owner] 67 if ad_request.paused: 68 uthread2.sleep(rotation_delay) 69 continue 70 ad_data = self._get_ad_to_display(ad_request) 71 if ad_data is None: 72 break 73 try: 74 ad_request.load_ad(ad_data) 75 rotation_delay = ad_data.rotation_interval 76 ad_request.received_data = ad_data 77 except Exception: 78 break 79 80 uthread2.sleep(rotation_delay) 81 82 ad_request = self._ad_request_by_owner[banner_owner] 83 self._remove_thread_and_data_for_owner(banner_owner) 84 self._notify_failed_request(ad_request) 85 self.LogInfo('Banner ad rotation retrieval failed, thread aborted.') 86 87 def _get_ad_to_display(self, banner_ad_request): 88 try: 89 ad_data = retrieve_adglare_ad(banner_ad_request.banner_url, banner_ad_request.language_id, banner_ad_request.rotation_settings) 90 return ad_data 91 except Exception as exception: 92 self.LogInfo('Failed retrieving banner ad due to: %s' % getattr(exception, 'msg', str(exception)))