home *** CD-ROM | disk | FTP | other *** search
- # Source Generated with Decompyle++
- # File: in.pyo (Python 2.6)
-
- import wx
- import cgui
- import simplejson
- import random
- from time import time
- from gui.browser.webkit import WebKitWindow
- from common import pref
- from util.primitives.funcs import Delegate
- from logging import getLogger
- log = getLogger('imwin_ads')
- from util.net import UrlQuery
- IMFRAME_WITH_AD_MINSIZE = (490, 350)
- SHOULD_ROTATE = True
- CAMPAIGNS = {
- 'rubicon': 'http://serve.digsby.com/rubicon.html' }
- AD_PANEL_MINSIZE = (466, 58)
- AD_PANEL_MAXSIZE = (728, 90)
- allowed_trigger_modes = ('focus', 'sendim')
- allowed_time_modes = ('real', 'engagement')
- ad_scenarios = [
- (120, 'real', 'focus'),
- (180, 'real', 'focus'),
- (240, 'real', 'focus'),
- (60, 'engagement', 'focus'),
- (90, 'engagement', 'focus'),
- (120, 'engagement', 'focus'),
- (180, 'engagement', 'focus'),
- (120, 'real', 'sendim'),
- (180, 'real', 'sendim'),
- (240, 'real', 'sendim'),
- (60, 'engagement', 'sendim'),
- (90, 'engagement', 'sendim'),
- (120, 'engagement', 'sendim'),
- (180, 'engagement', 'sendim')]
-
- def choose_ad_scenario():
- s = ad_scenarios[:]
- random.shuffle(s)
- return s[0]
-
-
- class AdRotater(object):
-
- def __repr__(self):
- return '<AdRotater (secs=%s, time_mode=%s, trigger_mode=%s) (%.02f secs engagement)>' % (self.timer_secs, self.time_mode, self.trigger_mode, 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()
- self.on_reload = Delegate()
- if self.time_mode == 'engagement' and self.trigger_mode == 'focus':
- self.wx_timer = wx.PyTimer(self._on_wxtimer)
- self.wx_timer.StartRepeating(1000)
-
-
-
- def _on_wxtimer(self):
- if not (self.timer.paused) and self.has_focus:
- 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
- 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):
- self.timer = Timer(get_time_func = self._get_time)
- 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):
- campaign = 'rubicon'
- self.ad_url = UrlQuery(CAMPAIGNS[campaign], utm_source = 'digsby_client', utm_medium = 'im_window', utm_content = rotater.scenario_identifier, utm_campaign = campaign)
- WebKitWindow.__init__(self, parent, url = self.ad_url, simple_events = True)
- self.set_jsqueue_enabled(False)
- self.set_window_open_redirects_to_browser(self._url_callback)
- self.SetMinimumFontSize(10)
- self.Bind(wx.webview.EVT_WEBVIEW_BEFORE_LOAD, self.OnBeforeLoad)
- self.Bind(wx.webview.EVT_WEBVIEW_LOAD, self.on_loading)
- self.SetMinSize(AD_PANEL_MINSIZE)
- self.SetMaxSize(AD_PANEL_MAXSIZE)
- self.rotater = rotater
- 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
-
-
- def URL(self):
- return self.RunScript('window.location.href')
-
- URL = property(URL)
-
- def on_loading(self, e):
- if e.State != wx.webview.WEBVIEW_LOAD_TRANSFERRING:
- return e.Skip()
- url = self.URL
- if url and not url.startswith('http://serve.digsby.com') and url != getattr(self, '_did_hijack_url', None):
- 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 OnBeforeLoad(self, e):
- if e.NavigationType == wx.webview.WEBVIEW_NAV_LINK_CLICKED:
- e.Cancel()
- self._url_callback(e.URL)
- else:
- e.Skip()
-
-
- def _reload_ad(self):
- self._did_notify_click = False
- self.rotater._reset_time()
- log.info('Loading ad URL: %r', self.ad_url)
- 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):
- self.SetMinSize(IMFRAME_WITH_AD_MINSIZE)
- borderSize = 1
- sz = self.Sizer = wx.BoxSizer(wx.VERTICAL)
- sz.Add(mainPanel, 1, wx.EXPAND)
- extra_top = 8
- sz.Add((borderSize, borderSize + extra_top))
- rotater = AdRotater(*ad_scenario())
- ad_panel = AdPanel(self, rotater)
- 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
-
- def on_activate(e):
- e.Skip()
- rotater.has_focus = e.Active
- if e.Active:
- rotater.trigger_event('focus')
-
- if not glass():
- self.Refresh()
-
-
- self.Bind(wx.EVT_ACTIVATE, on_activate)
- sz.Add(ad_panel, 0, wx.ALIGN_CENTER_HORIZONTAL)
- sz.Add((borderSize, borderSize))
-
- def paint(e):
- r = mainPanel.Rect
- (x, y) = r.BottomLeft
- x += (r.Width - x) / 2 - ad_panel.Size.width / 2
- dc = wx.AutoBufferedPaintDC(self)
- if glass():
- dc.Brush = wx.Brush(wx.Color(*GLASS_TRANSPARENT_COLOR))
- dc.DrawRectangleRect(self.ClientRect)
- else:
- dc.Brush = wx.Brush(get_frame_color(self.IsActive()))
- dc.Pen = wx.TRANSPARENT_PEN
- dc.DrawRectangleRect(wx.RectPS(r.BottomLeft, (r.Width, (self.ClientRect.height - r.Height) + 1)))
- if not getattr(self, '_did_glass', False) and glass():
- bottom = r if borderSize else r + borderSize * 2 + extra_top if not glass() else 0 + ad_panel.Size.height
- cgui.glassExtendInto(self, 0, 0, 0, bottom)
-
-
- self.Bind(wx.EVT_PAINT, paint)
- (maxw, maxh) = AD_PANEL_MAXSIZE
-
- def on_resize(e = (None, (None, None, None, None, None, None if 'wxMSW' in wx.PlatformInfo else self), None)):
- if hasattr(e, 'Skip'):
- e.Skip()
-
- if wx.IsDestroyed(self):
- return None
- (w, h) = AD_PANEL_MAXSIZE
- cwidth = self.ClientSize.width
- ad_w = min(w, cwidth)
- if ad_w < w:
- ad_w -= 2
-
- zoom = float(ad_w) / w
- ad_h = zoom * h
- ad_s = (ad_w, ad_h)
- position = mainPanel.Rect.BottomLeft + wx.Point((cwidth / 2 - ad_w / 2) + 1, 8)
- r = wx.RectPS(position, ad_s)
- ad_panel.SetMinSize(ad_s)
- ad_panel.SetPageZoom(zoom)
- ad_panel.Parent.Layout()
- ad_panel.Parent.Refresh()
-
- self.Bind(wx.EVT_SIZE, on_resize)
-
- def RefreshAd():
- ad_panel._reload_ad()
- wx.CallLater(50, on_resize)
-
- rotater.on_reload += RefreshAd
- ad_panel.OnDoc += on_resize
- ad_panel.RefreshAd = RefreshAd
- self.PushEventHandler(cgui.DragMixin(self))
- return ad_panel
-
- _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
-
-
-