home *** CD-ROM | disk | FTP | other *** search
- # Source Generated with Decompyle++
- # File: in.pyo (Python 2.6)
-
- import sys
- import traceback
- import wx
- import cgui
- import simplejson
- import random
- from time import time
- from gui.browser.webkit import WebKitWindow
- from common import pref, profile
- from util.primitives.funcs import Delegate
- from logging import getLogger
- log = getLogger('imwin_ads')
- from util.net import UrlQuery
- AD_COOKIE_CLEAR_MINS = 60
- IMFRAME_MINSIZE = (320, 220)
- IMFRAME_WITH_AD_MINSIZE_H = (490, 350)
- IMFRAME_WITH_AD_MINSIZE_V = (320, 397)
- SHOULD_ROTATE = True
- PREF_FLASH_DISABLED = 'imwin.ads_disable_flash'
- CAMPAIGNS = {
- 'rubicon': 'http://serve.digsby.com/rubicon.html',
- 'rubicon_vertical': 'http://serve.digsby.com/rubicon2.html' }
-
- def get_ad_campagin():
- if _adposition() in ('left', 'right'):
- return 'rubicon_vertical'
- return 'rubicon'
-
- PREF_AD_POSITION = 'imwin.ads_position'
-
- def _adposition():
- return pref(PREF_AD_POSITION, default = 'bottom')
-
- PREF_ADS_ENABLED = 'imwin.ads'
-
- def _adsenabled():
- return pref(PREF_ADS_ENABLED, default = False)
-
- AD_PANEL_MINSIZE_H = (466, 58)
- AD_PANEL_MINSIZE_V = (-1, -1)
- AD_PANEL_MAXSIZE_H = (728, 90)
- AD_PANEL_MAXSIZE_V = (160, 600)
- allowed_trigger_modes = ('focus', 'sendim')
- allowed_time_modes = ('real', 'engagement')
- ad_scenarios = [
- (120, 'real', 'focus')]
-
- def choose_ad_scenario():
- s = ad_scenarios[:]
- random.shuffle(s)
- return s[0]
-
-
- class AdRotater(object):
-
- def __repr__(self):
- ImFrame = ImFrame
- import gui.imwin.imtabs
- return '<AdRotater (secs=%s, time_mode=%s, trigger_mode=%s, has_focus=%r, idle=%r) (%.02f secs engagement)>' % (self.timer_secs, self.time_mode, self.trigger_mode, self.has_focus, ImFrame.engage_is_idle, self._engagement())
-
-
- def __init__(self, timer_secs, time_mode, trigger_mode, current_time_func = time):
- self.has_focus = False
- self.timer_secs = timer_secs
- self.time_mode = time_mode
- self.trigger_mode = trigger_mode
- self.scenario_identifier = '%s_%s_%s' % (timer_secs, time_mode, trigger_mode)
- self._get_time = current_time_func
- self._reset_time(start = False)
- self.on_reload = Delegate()
- if self.trigger_mode == 'focus':
- self.wx_timer = wx.PyTimer(self._on_wxtimer)
- self.wx_timer.StartRepeating(1000)
-
-
-
- def _on_wxtimer(self):
- if not self.has_focus:
- return None
- if self.time_mode == 'engagement' or not (self.timer.paused) or self.time_mode == 'real':
- self.trigger_event('focus')
-
-
-
- def trigger_event(self, event):
- if self.should_rotate(event):
- self.on_reload()
-
-
-
- def should_rotate(self, trigger_event):
- if not SHOULD_ROTATE:
- return False
- ImFrame = ImFrame
- import gui.imwin.imtabs
- if ImFrame.engage_is_idle:
- return False
- if self.trigger_mode != trigger_event:
- return False
- if not self._enough_time_elapsed():
- return False
- return True
-
-
- def pause(self):
- if self.time_mode == 'engagement':
- return self.timer.pause()
-
-
- def unpause(self):
- if self.time_mode == 'engagement':
- return self.timer.unpause()
-
-
- def _reset_time(self, start = True):
- self.timer = Timer(get_time_func = self._get_time)
- if start:
- self.timer.start()
-
-
-
- def _engagement(self):
- return self.timer.get_ticks()
-
-
- def _enough_time_elapsed(self):
- return self._engagement() >= self.timer_secs
-
-
- _ad_scenario = None
-
- def ad_scenario():
- global _ad_scenario
- if _ad_scenario is None:
- _ad_scenario = choose_ad_scenario()
-
- return _ad_scenario
-
-
- class AdPanel(WebKitWindow):
-
- def __init__(self, parent, rotater):
- self.rotater = rotater
- self.refresh_campaign()
- WebKitWindow.__init__(self, parent, simple_events = True)
- self._update_flash_enabled()
- profile.prefs.add_gui_observer(self._update_flash_enabled, PREF_FLASH_DISABLED)
- self.set_jsqueue_enabled(False)
- self.set_window_open_redirects_to_browser(self._url_callback)
- self.SetMinimumFontSize(10)
- self._navigated_to_base_url = False
- self.Bind(wx.webview.EVT_WEBVIEW_BEFORE_LOAD, self.OnBeforeLoad)
- self.Bind(wx.webview.EVT_WEBVIEW_LOAD, self.on_loading)
- self.update_minsize()
- setup_webview_logging = setup_webview_logging
- import gui.browser.webkit
- jslog = getLogger('imwin_ads_js')
- setup_webview_logging(self, jslog)
- self._did_notify_click = False
- self.SetFineGrainedResourceEvents(True)
-
-
- def update_minsize(self):
- if _adposition() in ('left', 'right'):
- self.SetMinSize(AD_PANEL_MINSIZE_V)
- self.SetMaxSize(AD_PANEL_MAXSIZE_V)
- else:
- self.SetMinSize(AD_PANEL_MINSIZE_H)
- self.SetMaxSize(AD_PANEL_MAXSIZE_H)
-
-
- def refresh_campaign(self):
- campaign = get_ad_campagin()
- self.ad_url_base = CAMPAIGNS[campaign]
- old_ad_url = getattr(self, 'ad_url', None)
- self.ad_url = UrlQuery(self.ad_url_base, utm_source = 'digsby_client', utm_medium = 'im_window', utm_content = self.rotater.scenario_identifier, utm_campaign = campaign)
- if old_ad_url is not None and old_ad_url != self.ad_url:
- self._reload_ad()
-
-
-
- def _update_flash_enabled(self, *a):
- if not wx.IsDestroyed(self):
- flash_enabled = not pref(PREF_FLASH_DISABLED, default = False)
- self.WebSettings.SetPluginsEnabled(flash_enabled)
-
-
-
- def URL(self):
- return self.RunScript('window.location.href')
-
- URL = property(URL)
-
- def on_loading(self, e):
-
- try:
- url = self.URL
- except wx.PyDeadObjectError:
- return e.Skip()
-
- if not url or e.State != wx.webview.WEBVIEW_LOAD_TRANSFERRING:
- return e.Skip()
- at_base = url.startswith(self.ad_url_base)
- if at_base:
- self._navigated_to_base_url = True
-
- hijacked_url = getattr(self, '_did_hijack_url', None)
- if not at_base and not (self._navigated_to_base_url):
- log.info('loading blank window b/c caught possible proxy block to url %r', self.ad_url)
- self.LoadURL('about:blank')
- elif not at_base and self._navigated_to_base_url:
- if hijacked_url is None or not urls_have_same_domain(url, hijacked_url):
- self._did_hijack_url = url
- log.warning('!!!! escaped from serve.digsby.com: %r', url)
- self._url_callback(url)
- self.RefreshAd()
-
-
-
- def _url_callback(self, url):
- wx.LaunchDefaultBrowser(url)
- self.notify_click(url)
-
-
- def _is_double_url_call(self, url):
- last = getattr(self, '_last_url_launched', None)
- new = (url, time())
- if last is not None and url == last[0]:
- if abs(new[1] - last[1]) < 200:
- return True
-
- self._last_url_launched = new
-
-
- def OnBeforeLoad(self, e):
- url = e.URL
- skip = True
- if e.NavigationType == wx.webview.WEBVIEW_NAV_LINK_CLICKED:
- e.Cancel()
- self._url_callback(url)
- skip = False
- elif e.NavigationType == wx.webview.WEBVIEW_NAV_OTHER:
- if not _debug_ads():
- self._log_ad_url(url)
-
- elif e.NavigationType == wx.webview.WEBVIEW_NAV_REQUEST:
- url = e.URL
- if self._should_blacklist_ad_url(url):
- log.info('ad URL BLACKLISTED, cancelling request %s', url)
- e.Cancel()
- skip = False
- elif _debug_ads():
- self._log_ad_url(url)
-
-
- e.Skip(skip)
-
-
- def _log_ad_url(self, url):
- last = getattr(self, '_last_logged_url', None)
- if last is not None and last == url:
- del self._last_logged_url
- else:
- log.info('ad URL %s', url)
- self._last_logged_url = url
-
- blacklisted_urls = set(('http://qnet.hit.gemius.pl/pp_gemius.js',))
-
- def _should_blacklist_ad_url(self, url):
- if url in self.blacklisted_urls:
- return True
- return False
-
-
- def _reload_ad(self):
- self._did_notify_click = False
- self.rotater._reset_time()
- log.info('Loading ad URL: %r', self.ad_url)
- self._navigated_to_base_url = False
- self.LoadURL(self.ad_url)
-
-
- def notify_click(self, url):
- if self._did_notify_click:
- return None
- self._did_notify_click = True
- log.info('notifying ad click: %r', url)
- self._track_analytics_event('click')
-
-
- def _track_analytics_event(self, action):
- script = '_gaq.push(%s);' % simplejson.dumps([
- '_trackEvent',
- self.rotater.scenario_identifier,
- action])
- print script
- result = self.RunScript(script)
- print 'RESULT', result
-
-
- GLASS_TRANSPARENT_COLOR = (0, 0, 0)
-
- glass = lambda : if cgui.isGlassEnabled():
- passpref('imwin.ads_glass', default = True)
-
- def construct_ad_panel(self, mainPanel, new_tab_cb, bind_pref = True):
- if bind_pref:
-
- def on_ad_pref(src, attr, old, new):
- ap = getattr(self, 'ad_panel', None)
-
- profile.prefs.add_gui_observer(on_ad_pref, PREF_ADS_ENABLED, obj = self)
-
- if not _adsenabled():
- return None
- should_clear_cookies = setup_cookie_timer(self)
- adpos = _adposition()
- borderSize = 1
- extra_top = 8
- rotater = AdRotater(*ad_scenario())
- self._ad_rotater = rotater
- self.on_engaged_start += rotater.unpause
- self.on_engaged_end += rotater.pause
-
- def on_message(mode, imwin_ctrl):
- if mode == 'im':
- rotater.trigger_event('sendim')
-
-
- self.on_sent_message += on_message
- self._did_show_ad = False
-
- def check_focus():
- if wx.IsDestroyed(self):
- return None
- if self.IsActive():
- pass
- rotater.has_focus = not self.IsIconized()
- if rotater.has_focus:
- if not self._did_show_ad:
- self._did_show_ad = True
- rotater.on_reload()
- else:
- rotater.trigger_event('focus')
-
-
- wx.CallLater(50, check_focus)
-
- def on_iconize(e):
- e.Skip()
- wx.CallAfter(check_focus)
-
-
- def on_activate(e):
- e.Skip()
- wx.CallAfter(check_focus)
- if not glass():
- self.Refresh()
-
-
- self.Bind(wx.EVT_ACTIVATE, on_activate)
- self.Bind(wx.EVT_ICONIZE, on_iconize)
- horiz_padding = 8
- extra_horizontal = 1
-
- def build_ad_sizer(adpos = None, layout_now = (None, None, None, None if should_clear_cookies else _adsenabled(), (self, (((self,), self),)), None, True)):
- if wx.IsDestroyed(self):
- return None
- enabled = _adsenabled()
- if adpos is None:
- adpos = _adposition()
-
- self.Frozen().__enter__()
-
- try:
- self.SetSizer(None)
- if not enabled:
- minsize = IMFRAME_MINSIZE
- elif adpos in ('left', 'right'):
- minsize = IMFRAME_WITH_AD_MINSIZE_V
- else:
- minsize = IMFRAME_WITH_AD_MINSIZE_H
- self.SetMinSize(minsize)
- if enabled:
- ad_panel.Show()
-
- if not enabled:
- ad_panel.Hide()
- sz = wx.BoxSizer(wx.VERTICAL)
- sz.Add(mainPanel, 1, wx.EXPAND)
- elif adpos == 'top':
- sz = wx.BoxSizer(wx.VERTICAL)
- sz.Add((borderSize, borderSize))
- sz.Add(ad_panel, 0, wx.ALIGN_CENTER_HORIZONTAL)
- sz.Add((borderSize, borderSize + extra_top))
- sz.Add(mainPanel, 1, wx.EXPAND)
- elif adpos == 'left':
- sz = wx.BoxSizer(wx.HORIZONTAL)
- sz.Add((extra_horizontal, 1))
- sz.Add(ad_panel, 0, wx.ALIGN_CENTER_VERTICAL)
- sz.Add((horiz_padding, 1))
- sz.Add(mainPanel, 1, wx.EXPAND)
- elif adpos == 'right':
- sz = wx.BoxSizer(wx.HORIZONTAL)
- sz.Add(mainPanel, 1, wx.EXPAND)
- sz.Add((horiz_padding, borderSize))
- sz.Add(ad_panel, 0, wx.ALIGN_CENTER_VERTICAL)
- sz.Add((extra_horizontal, 1))
- else:
- sz = wx.BoxSizer(wx.VERTICAL)
- sz.Add(mainPanel, 1, wx.EXPAND)
- sz.Add((borderSize, borderSize + extra_top))
- sz.Add(ad_panel, 0, wx.ALIGN_CENTER_HORIZONTAL)
- sz.Add((borderSize, borderSize))
- self.SetSizer(sz)
- if layout_now:
- self.Layout()
- finally:
- pass
-
-
- build_ad_sizer(adpos, layout_now = False)
- self.build_ad_sizer = build_ad_sizer
-
- def on_pref_change(src, attr, old, new):
- if wx.IsDestroyed(self):
- return None
- build_ad_sizer(_adposition())
- ad_panel.update_minsize()
- on_resize()
- ad_panel.refresh_campaign()
-
- profile.prefs.add_gui_observer(on_pref_change, PREF_AD_POSITION, obj = self)
- if 'wxMSW' in wx.PlatformInfo:
- get_frame_color = get_frame_color
- import gui.native.win.winutil
- else:
-
- get_frame_color = lambda active: wx.SystemSettings.GetColour(wx.SYS_COLOUR_WINDOW)
-
- def paint(e):
- r = mainPanel.Rect
- (x, y) = r.BottomLeft
- x += (r.Width - x) / 2 - ad_panel.Size.width / 2
- dc = wx.AutoBufferedPaintDC(self)
- dc.Pen = wx.TRANSPARENT_PEN
- if glass():
- dc.Brush = wx.Brush(wx.Color(*GLASS_TRANSPARENT_COLOR))
- else:
- dc.Brush = wx.Brush(get_frame_color(self.IsActive()))
- dc.DrawRectangleRect(self.ClientRect)
- if not _adsenabled():
- if glass():
- cgui.glassExtendInto(self, 0, 0, 0, 0)
-
- return None
-
- self.Bind(wx.EVT_PAINT, paint)
-
- def _ad_panel_shown():
- ad_panel = getattr(self, 'ad_panel', None)
- if ad_panel is not None:
- return ad_panel.IsShown()
-
-
- def on_resize(e = (None, ((None, None, None, None, None, None, None, None),), None)):
- if hasattr(e, 'Skip'):
- e.Skip()
-
- if wx.IsDestroyed(self) or not _ad_panel_shown():
- return None
- if _adposition() in ('left', 'right'):
- (maxw, maxh) = AD_PANEL_MAXSIZE_V
- cheight = self.ClientSize.height
- ad_h = min(maxh, cheight)
- if ad_h < maxh:
- ad_h -= 2
-
- zoom = float(ad_h) / maxh
- ad_w = zoom * maxw
- else:
- (maxw, maxh) = AD_PANEL_MAXSIZE_H
- cwidth = self.ClientSize.width
- ad_w = min(maxw, cwidth)
- if ad_w < maxw:
- ad_w -= 2
-
- zoom = float(ad_w) / maxw
- ad_h = zoom * maxh
- ad_panel.SetMinSize((ad_w, ad_h))
- ad_panel.SetPageZoom(zoom)
- ad_panel.Parent.Layout()
- ad_panel.Parent.Refresh()
-
- self.Bind(wx.EVT_SIZE, on_resize)
-
- def RefreshAd():
- if _ad_panel_shown():
- ad_panel._reload_ad()
- wx.CallLater(50, on_resize)
-
-
- rotater.on_reload += RefreshAd
- ad_panel.OnDoc += on_resize
- ad_panel.RefreshAd = RefreshAd
-
- def on_new_tab(*a):
- if not getattr(self, '_first_tab_opened', False):
- self._first_tab_opened = True
- return None
- ad_panel.RefreshAd()
-
- new_tab_cb += on_new_tab
- self.PushEventHandler(cgui.DragMixin(self))
-
- _cached_border_image = (None, None)
- _border_color = (93, 108, 122, 255)
-
- def _get_border_image(sz):
- global _cached_border_image
- (w, h) = sz
- sz = (w, h)
- if _cached_border_image[0] == sz:
- return _cached_border_image[1]
- import PIL
- img = PIL.Image.new('RGBA', (w, h), _border_color).WXB
- _cached_border_image = (sz, img)
- return img
-
-
- class Timer(object):
-
- def __init__(self, get_time_func = time):
- self._get_time = get_time_func
- self.start_ticks = 0
- self.paused_ticks = 0
- self.paused = False
- self.started = False
-
-
- def start(self):
- self.started = True
- self.paused = False
- self.start_ticks = self._get_time()
-
-
- def stop(self):
- self.started = False
- self.paused = False
-
-
- def pause(self):
- if not (self.started) or self.paused:
- return None
- self.paused = True
- self.paused_ticks = self._get_time() - self.start_ticks
-
-
- def unpause(self):
- if not (self.started) or not (self.paused):
- return None
- self.paused = False
- self.start_ticks = self._get_time() - self.paused_ticks
- self.paused_ticks = 0
-
-
- def get_ticks(self):
- if not self.started:
- return 0
- if self.paused:
- return self.paused_ticks
- return self._get_time() - self.start_ticks
-
-
-
- def _debug_ads():
- opts = getattr(sys, 'opts', None)
- return getattr(opts, 'debugads', False)
-
-
- def urls_have_same_domain(a, b):
-
- try:
- return UrlQuery.parse(a).netloc == UrlQuery.parse(b).netloc
- except Exception:
- traceback.print_exc_once()
- return a == b
-
-
-
- def find_instances(clz):
- return _[1]
-
- last_imframe_close = None
-
- def secs_since_last_close():
- if last_imframe_close is not None:
- return time() - last_imframe_close
-
-
- def should_clear_cookies():
- secs = secs_since_last_close()
- if secs is not None:
- pass
- return secs > 60 * AD_COOKIE_CLEAR_MINS
-
-
- def setup_cookie_timer(imframe):
- imclz = imframe.__class__
-
- def num_imframes():
- return len(find_instances(imclz))
-
-
- def on_close(e):
- global last_imframe_close
- e.Skip()
- if num_imframes() == 1:
- last_imframe_close = time()
-
-
- imframe.Bind(wx.EVT_CLOSE, on_close)
- if num_imframes() == 1:
- pass
- return should_clear_cookies()
-
-