NovaBryan/EVE_Dump
Log | Files | 📦 下载最新源码 (.zip) | Refs | README

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)))