## www.pubnub.com - PubNub Real-time push service in the cloud.
# coding=utf8

## PubNub Real-time Push APIs and Notifications Framework
## Copyright (c) 2010 Stephen Blum
## http://www.pubnub.com/

## -----------------------------------
## PubNub 3.1 Real-time Push Cloud API
## -----------------------------------

import sys
import datetime
from Pubnub import PubnubTwisted as Pubnub
from functools import partial
from threading import current_thread
import threading
publish_key = len(sys.argv) > 1 and sys.argv[1] or 'demo'
subscribe_key = len(sys.argv) > 2 and sys.argv[2] or 'demo'
secret_key = len(sys.argv) > 3 and sys.argv[3] or 'demo'
cipher_key = len(sys.argv) > 4 and sys.argv[4] or None
ssl_on = len(sys.argv) > 5 and bool(sys.argv[5]) or False

## -----------------------------------------------------------------------
## Initiate Pubnub State
## -----------------------------------------------------------------------
#pubnub = Pubnub( publish_key, subscribe_key, secret_key, cipher_key, ssl_on )
pubnub = Pubnub(publish_key, subscribe_key, secret_key, ssl_on)
crazy = 'hello_world'

current = -1

errors = 0
received = 0

## -----------------------------------------------------------------------
## Subscribe Example
## -----------------------------------------------------------------------


def message_received(message):
    print message


def check_received(message):
    global current
    global errors
    global received
    print message
    print current
    if message <= current:
        print 'ERROR'
        #sys.exit()
        errors += 1
    else:
        received += 1
    print 'active thread count : ', threading.activeCount()
    print 'errors = ', errors
    print current_thread().getName(), ' , ', 'received = ', received

    if received != message:
        print '********** MISSED **************** ', message - received
    current = message


def connected_test(ch):
    print 'Connected', ch


def connected(ch):
    pass


'''
pubnub.subscribe({
    'channel'  : 'abcd1',
    'connect'  : connected,
    'callback' : message_received
})
'''


def cb1():
    pubnub.subscribe({
        'channel': 'efgh1',
        'connect': connected,
        'callback': message_received
    })


def cb2():
    pubnub.subscribe({
        'channel': 'dsm-test',
        'connect': connected_test,
        'callback': check_received
    })


def cb3():
    pubnub.unsubscribe({'channel': 'efgh1'})


def cb4():
    pubnub.unsubscribe({'channel': 'abcd1'})


def subscribe(channel):
    pubnub.subscribe({
        'channel': channel,
        'connect': connected,
        'callback': message_received
    })


print threading.activeCount()


pubnub.timeout(15, cb1)

pubnub.timeout(30, cb2)


pubnub.timeout(45, cb3)

pubnub.timeout(60, cb4)

#'''
for x in range(1, 1000):
    #print x
    def y(t):
        subscribe('channel-' + str(t))

    def z(t):
        pubnub.unsubscribe({'channel': 'channel-' + str(t)})

    pubnub.timeout(x + 5, partial(y, x))
    pubnub.timeout(x + 25, partial(z, x))
    x += 10
#'''

'''
for x in range(1,1000):
    def cb(r): print r , ' : ', threading.activeCount()
    def y(t):
        pubnub.publish({
            'message' : t,
            'callback' : cb,
            'channel' : 'dsm-test'
        })


    pubnub.timeout(x + 1, partial(y,x))
    x += 1
'''


pubnub.start()
