Exemple #1
0
    def __init__(self, evManager, objects, container=None):
        WidgetAndContainer.__init__(self, evManager, container)
        EventManager.__init__(self)

        self.image = pygame.Surface((400, 130), SRCALPHA)
        self.image.fill((90, 90, 90))
        self.rect = self.image.get_rect()
        #copy the rect
        self.scrollState = self.rect.move(0, 0)

        leftEvent = GUIScrollRequest(self, -5)
        rightEvent = GUIScrollRequest(self, 5)
        self.leftButton = ScrollButton(self, self, leftEvent)
        self.widgets.append(self.leftButton)
        self.rightButton = ScrollButton(self, self, rightEvent)
        self.widgets.append(self.rightButton)

        self.xPadding = 4

        maxWidth = len(objects) * (IconSprite.maxWidth + self.xPadding)
        maxHeight = IconSprite.maxHeight
        self.scrollSurface = pygame.Surface((maxWidth, maxHeight), SRCALPHA)
        for obj in objects:
            newSprite = IconSprite(self, obj, self)
            self.widgets.append(newSprite)

        self.ArrangeWidgets()
        self.update()
Exemple #2
0
def main():
 
    # create the managers
    eMngr = EventManager()
    gMngr = GraphicManager(eMngr)
    iMngr = InputManager(eMngr, gMngr)
    uMngr = UpdateManager(eMngr)
    sMngr = SoundManager(eMngr)
    nMngr = NetworkManager(eMngr)

    print "starting game"
    # create file with input
    playFile = open(sys.argv[1], 'r')
    # start the managers
    eMngr.start()
    gMngr.start()
    iMngr.start()
    uMngr.start()
    sMngr.start()
    nMngr.start()

    # create game and start it
    # FIXME playfile should be passed to the updateManager
    game = Game(iMngr, uMngr, gMngr, sMngr, nMngr, playFile)
    game.run()

    # close the managers
    eMngr.stop()
    uMngr.stop()
    iMngr.stop()
    gMngr.stop()
    sMngr.stop()
    nMngr.stop()
Exemple #3
0
    def test_listen(self):
        listen_port = 8000
        test_message = pickle.dumps('test_message')
        event_manager = EventManager([], listen_port);

        # Wait for thread to be ready
        while not event_manager.is_listening():
            time.sleep(0)

        # Mock the event_received method
        m = mox.Mox()
        mock_event_received = m.CreateMockAnything()
        event_manager.event_received = new.instancemethod(mock_event_received,
                                                          event_manager)
        mock_event_received(event_manager, 'test_message')
        m.ReplayAll()

        s = socket.create_connection((socket.gethostname(), listen_port))
        s.sendall(test_message)
        s.shutdown(socket.SHUT_RDWR)
        s.close()

        event_manager.shutdown()
        
        # Make sure event_received was called on the EventManager
        m.VerifyAll()
Exemple #4
0
 def __init__(self):
     Thread.__init__(self)
     self.daemon = True
     self.runthread = True
     self.idlesleep = 0.01
     self.eventpipe = deque()
     self.em = EventManager()
Exemple #5
0
    def test_subscribe_same(self):
        event_type = 'test_event_type'
        controller = 'dummy_controller'

        event_manager = EventManager([]);
        event_manager.subscribe(event_type, controller)
        event_manager.subscribe(event_type, controller)
        self.assertEqual(len(event_manager.subscriptions[event_type]), 1)
Exemple #6
0
    def __init__(self):
        self.clock = pygame.time.Clock()
        self.screen = pygame.display.set_mode((SCREEN_WIDTH, SCREEN_HEIGHT))
        self.event_manager = EventManager()
        self.current_page = Page(pygame.Surface((0, 0)), BLACK,
                                 self.event_manager)

        self.name_1 = "Batman"
        self.name_2 = "Superman"
Exemple #7
0
 def __init__(self, port=None, address=None):
     Thread.__init__(self)
     self.daemon = True
     self.runthread = True
     self.port = port
     self.address = address
     self.pluginlist = None
     self.clients = {}
     self.event_subscriptions = {}
     self.em = EventManager()
Exemple #8
0
def Main():

    # Sample usage used in a demo... ----
    em = EventManager()

    recordedEvents = em.Record(10)

    em.WriteToFile()

    em.Play()
Exemple #9
0
 def __init__(self):
     Thread.__init__(self)
     self.daemon = True
     self.host = None
     self.port = None
     self.user = None
     self.password = None
     self.runthread = True
     self.sendlock = False
     self.pluginlist = None
     self.em = EventManager()
Exemple #10
0
    def test_serialize_deserialize_event(self):
        event_type = EventType.DOOR_SENSOR_EVENT
        timestamp = datetime.utcnow()
        event = Event(event_type, timestamp)
        
        event_manager = EventManager([]);
        serialized = event_manager.serialize_event(event)
        deserialized = event_manager.deserialize_event(serialized)

        self.assertIsInstance(deserialized, Event)
        self.assertEqual(deserialized.get_event_type(), event_type)
        self.assertEqual(deserialized.get_timestamp(), timestamp)
Exemple #11
0
 def __init__(self):
     Thread.__init__(self)
     self.daemon = True
     self.runthread = True
     self.idlesleep = 0.01
     self.eventpipe = deque()
     self.em = EventManager()
     self.ami = None
     self.queuereadflag = False
     self.queuestats = {}
     self.extstates = {}
     self.channels = {}
     self.status_expire = 60
     self.status_timeout = 1
Exemple #12
0
    def test_broadcast_event(self):
        test_message = 'test_message'
        peers = [('localhost', 8000)]
        event_manager = EventManager(peers);
        event = 'test_event'

        # Create a mock EventManager to verify it receives the test event
        mock_event_manager = mox.MockObject(EventManager)
        thread = ListenerThread(mock_event_manager, 8000)
        thread.start()

        event_manager.broadcast_event(event)

        thread.stop()
        thread.join()
Exemple #13
0
def main():
    """..."""
    evManager = EventManager()
    sharedObjectRegistry = {}

    #import random
    #rng = random.Random()
    #clientID = rng.randrange( 1, 10000 )
    #playerName = str( rng.randrange(1,100) )
    #player = Player( evManager )

    from sjbeasts import AnimationTimerController
    keybd = PygameMasterController(evManager)
    spinner = CPUSpinnerController(evManager)
    animationSpinner = AnimationTimerController(evManager)
    pygameView = PygameMasterView(evManager)

    phonyModel = PhonyModel(evManager, sharedObjectRegistry)

    import gui
    gui.playerRef = gui.GlobalPlayer(evManager)
    print gui.playerRef

    #from twisted.spread.jelly import globalSecurity
    #globalSecurity.allowModules( network )

    from twisted.internet import reactor
    serverController = NetworkServerController(evManager, reactor)
    serverView = NetworkServerView(evManager, sharedObjectRegistry,
                                   serverController)

    spinner.Run()
Exemple #14
0
    def __init__(self):
        logutils.setup_logging("mustikkabot")
        self.log = logging.getLogger("mustikkabot")

        self.basepath = tools.find_basepath()
        self.confdir = os.path.join(self.basepath, "config")
        self.datadir = os.path.join(self.basepath, "data")
        self.srcdir = os.path.join(self.basepath, "src")

        setup.setup(self)
        setup.do_migrations(self)

        self.ircsock = None
        self.lastReceived = None

        self.user = None
        self.channel = None

        self.eventmanager = EventManager()
        """ :type: EventManager"""
        self.modulemanager = ModuleManager()
        """ :type: ModuleManager"""
        self.accessmanager = AccessManager()
        """ :type: AccessManager"""
        self.timemanager = TimeManager()
        """ :type: TimeManager"""

        self.run = True
Exemple #15
0
	def __init__(self):
		Thread.__init__(self)
		self.daemon = True
		self.runthread = True
		self.idlesleep = 0.01
		self.eventpipe = deque()
		self.em = EventManager()
	def __init__(self, port=None, address=None):
		Thread.__init__(self)
		self.daemon = True
		self.runthread = True
		self.port = port
		self.address = address
		self.pluginlist = None
		self.clients = {}
		self.event_subscriptions = {}
		self.em = EventManager()
Exemple #17
0
	def __init__(self):
		Thread.__init__(self)
		self.daemon = True
		self.host = None
		self.port = None
		self.user = None
		self.password = None
		self.runthread = True
		self.sendlock = False
		self.pluginlist = None 
		self.em = EventManager()
Exemple #18
0
class ChannelEventLogger(Thread):

	def __init__(self):
		Thread.__init__(self)
		self.daemon = True
		self.runthread = True
		self.idlesleep = 0.01
		self.eventpipe = deque()
		self.em = EventManager()

	def config(self, conf):
		return True

	def plugins(self, plugins):
		self.pluginlist = plugins
		self.em.plugins(plugins)

	def add_event(self, event):
		self.eventpipe.appendleft(event)

	def send(self, send_string):
		return True

	def run(self):
		ret = self.em.add_event_handler('ChannelEventLogger', 1)
		ldebug('starting CEL thread')
		while self.runthread:
			if (self.eventpipe):
				event = self.eventpipe.pop()

			else:
				event = False
				sleep(self.idlesleep)
				continue

			ldebug('CEL: %s' % event)

		ldebug('closing CEL thread')

	def stop(self):
		self.runthread = False
Exemple #19
0
def main():

    # create the managers
    eMngr = EventManager()
    gMngr = GraphicManager(eMngr)
    iMngr = InputManager(eMngr, gMngr)
    uMngr = UpdateManager(eMngr)
    sMngr = SoundManager(eMngr)
    nMngr = NetworkManager(eMngr)

    print "starting game"
    # create file with input
    playFile = open(sys.argv[1], 'r')
    # start the managers
    eMngr.start()
    gMngr.start()
    iMngr.start()
    uMngr.start()
    sMngr.start()
    nMngr.start()

    # create game and start it
    # FIXME playfile should be passed to the updateManager
    game = Game(iMngr, uMngr, gMngr, sMngr, nMngr, playFile)
    game.run()

    # close the managers
    eMngr.stop()
    uMngr.stop()
    iMngr.stop()
    gMngr.stop()
    sMngr.stop()
    nMngr.stop()
Exemple #20
0
class ChannelEventLogger(Thread):
    def __init__(self):
        Thread.__init__(self)
        self.daemon = True
        self.runthread = True
        self.idlesleep = 0.01
        self.eventpipe = deque()
        self.em = EventManager()

    def config(self, conf):
        return True

    def plugins(self, plugins):
        self.pluginlist = plugins
        self.em.plugins(plugins)

    def add_event(self, event):
        self.eventpipe.appendleft(event)

    def send(self, send_string):
        return True

    def run(self):
        ret = self.em.add_event_handler('ChannelEventLogger', 1)
        ldebug('starting CEL thread')
        while self.runthread:
            if (self.eventpipe):
                event = self.eventpipe.pop()

            else:
                event = False
                sleep(self.idlesleep)
                continue

            ldebug('CEL: %s' % event)

        ldebug('closing CEL thread')

    def stop(self):
        self.runthread = False
Exemple #21
0
class Browser(object):
    def __init__(self):
        self.clock = pygame.time.Clock()
        self.screen = pygame.display.set_mode((SCREEN_WIDTH, SCREEN_HEIGHT))
        self.event_manager = EventManager()
        self.current_page = Page(pygame.Surface((0, 0)), BLACK,
                                 self.event_manager)

        self.name_1 = "Batman"
        self.name_2 = "Superman"

    def get_shower(self, klass, *args):
        def shower():
            self.current_page.clean()
            self.current_page = klass(self.screen, self.event_manager, *args)
            self.current_page.display()

        return shower

    def run(self):
        self.get_shower(SplashScreen)()

        def cb1(value):
            self.name_1 = value
            self.get_shower(TextInput, "Enter Player 2's name", cb2)()

        def finish_cb():
            self.get_shower(LeaderBoardPage)()

        def cb2(value):
            self.name_2 = value
            self.get_shower(BoardPage, (self.name_1, self.name_2), finish_cb)()

        self.event_manager.add_timer(
            2, self.get_shower(TextInput, "Enter Player 1's name", cb1))

        while True:
            self.event_manager.run()
            self.clock.tick(FPS)
    def Notify(self, event):
        HomeButton.Notify(self, event)

        if isinstance(event, PlayerExplorationEvent):
            print "SWITCHING TO EXPLORE"
            from screen_explore import ExploreScreen, \
                                       ExploreScreenController
            from eventmanager import EventManager
            dummyEvManager = EventManager()
            view = ExploreScreen(dummyEvManager, event.player, event.turns)
            cont = ExploreScreenController(self.evManager)
            ev = GUIChangeScreenRequest(([view], [cont]))
            self.evManager.Post(ev)
Exemple #23
0
def main():
	"""..."""
	evManager = EventManager()

	spinner = CPUSpinnerController( evManager )
	animationSpinner = AnimationTimerController( evManager )
	pygameView = PygameMasterView( evManager )
	pygameCont = PygameMasterController( evManager )
	game = Game( evManager )

	import gui
	gui.playerRef = gui.GlobalPlayer( evManager )
	print gui.playerRef
	
	while 1:
		try:
			spinner.Run()
		except NotImplementedError, msg:
			text = "Not Implemented: "+ str(msg)
			ev = ExceptionEvent( text )
			evManager.Post( ev )
		else:
			break;
Exemple #24
0
	def __init__(self):
		Thread.__init__(self)
		self.daemon = True
		self.runthread = True
		self.idlesleep = 0.01
		self.eventpipe = deque()
		self.em = EventManager()
		self.ami = None
		self.queuereadflag = False
		self.queuestats = {}
		self.extstates = {}
		self.channels = {}
		self.status_expire = 60
		self.status_timeout = 1
Exemple #25
0
    def Notify(self, event):
        WidgetAndContainer.Notify(self, event)

        if isinstance( event, GUIScrollRequest ) \
          and event.target is self:
            self.Scroll(event.amount)

        #determine what icons are accessible, and send events through
        #to them.
        if isinstance( event, GUIClickEvent ) \
          or isinstance( event, GUIMouseMoveEvent ):
            if self.rect.collidepoint(event.pos):
                from copy import copy
                modifiedEvent = copy(event)
                pos = list(event.pos)
                pos[0] = pos[0] - self.rect.x
                pos[1] = pos[1] - self.rect.y
                if pos[1] < self.leftButton.rect.top:
                    pos[0] = pos[0] + self.scrollState.x
                    pos[1] = pos[1] + self.scrollState.y
                modifiedEvent.pos = (pos)
                EventManager.Post(self, modifiedEvent)
        else:
            EventManager.Post(self, event)
    def Notify(self, event):
        HomeButton.Notify(self, event)

        if isinstance(event, GoToStoreEvent):
            print "SWITCHING TO STORE"
            from screen_store import StoreScreen, \
                                       StoreScreenController
            from eventmanager import EventManager
            # we don't want the new Gui reacting to events before
            # it is active, so give it a dummy event manager that
            # won't send it anything
            dummyEvManager = EventManager()
            view = StoreScreen(dummyEvManager, event.player)
            cont = StoreScreenController(self.evManager)
            ev = GUIChangeScreenRequest(([view], [cont]))
            self.evManager.Post(ev)
Exemple #27
0
    def test_event_received_multiple_events(self):
        door_event = Event(EventType.DOOR_SENSOR_EVENT)
        window_event = Event(EventType.WINDOW_SENSOR_EVENT)

        # Set up controller mocks
        door_controller = mox.MockObject(Controller)
        door_controller.handle_event(door_event)
        mox.Replay(door_controller)

        window_controller = mox.MockObject(Controller)
        mox.Replay(window_controller)

        event_manager = EventManager([]);
        event_manager.subscribe(EventType.DOOR_SENSOR_EVENT, door_controller)
        event_manager.subscribe(EventType.WINDOW_SENSOR_EVENT, window_controller)

        # Send event
        event_manager.event_received(door_event)
        event_manager.process_events()

        mox.Verify(door_controller)
        mox.Verify(window_controller)
Exemple #28
0
    def test_event_received(self):
        event_type = EventType.DOOR_SENSOR_EVENT
        event = Event(event_type)

        # Set up controller mock
        controller = mox.MockObject(Controller)
        controller.handle_event(event)
        mox.Replay(controller)

        event_manager = EventManager([]);
        event_manager.subscribe(event_type, controller)
        event_manager.event_received(event)
        event_manager.process_events()

        mox.Verify(controller)
Exemple #29
0
def main(srvHost, srvPort):
    w = dict()
    em = EventManager()
    nm = NetworkManager(em, w)
    FRAME_TIME = 0.2  # 200 ms
    c = Clock(FRAME_TIME)
    c.start()
    slept_time = 0.0
    nm.start(srvHost, srvPort)
    counter = 100
    exit = False
    while not exit:
        nm.update(slept_time + c.time_passed())
        counter -= 1
        if counter <= 0:
            exit = True
        slept_time = c.time_left()
        c.sleep()
        print "%s" % (counter * FRAME_TIME)
Exemple #30
0
def main():
    """..."""
    from twisted.spread import pb
    from twisted.application import service
    from twisted.cred.authorizer import DefaultAuthorizer
    from twisted.internet import reactor, app

    evManager = EventManager()
    sharedObjectRegistry = {}

    log = TextLogView(evManager)
    timer = TimerController(evManager, reactor)
    #clientContr = NetworkClientController( evManager, sharedObjectRegistry )
    clientView = NetworkClientView(evManager, sharedObjectRegistry)
    game = Game(evManager)

    #from twisted.spread.jelly import globalSecurity
    #globalSecurity.allowModules( network )

    application = app.Application("myServer")
    auth = DefaultAuthorizer(application)

    #create a service, tell it to generate NetworkClientControllers
    serv = pb.Service("myService", application, auth)
    serv.perspectiveClass = NetworkClientController

    #create a Perspective
    per1 = serv.createPerspective("perspective1")
    per1.PostInit(evManager, sharedObjectRegistry)

    #create an Identity
    iden1 = auth.createIdentity("user1")
    iden1.setPassword("asdf")
    #allow it access to the perspective named perspective1
    iden1.addKeyByString("myService", "perspective1")
    auth.addIdentity(iden1)

    #application.listenTCP(8000, pb.BrokerFactory(clientContr) )
    application.listenTCP(8000, pb.PBServerFactory(pb.AuthRoot(auth)))

    application.run(save=0)
Exemple #31
0
    def __init__(self, app, parent=None, background_color=(0, 0, 0)):
        MediaNavNode.__init__(self)
        self.screen = app.screen  #: The screen surface to draw to
        self.screen_width = self.screen.get_width()
        self.screen_height = self.screen.get_height()
        self.background_color = background_color  #: The background color to fill the screen with
        self.background_image = None
        self.parent = parent  #: The parent page, used for navigation
        self.widgets = []  #: A list of widgets in this page
        self.app = app  #: The app object under which this page runs

        # Load the background
        # TODO: Remove hardcoding of background

        # Make the page an event dispatcher
        self.set_event_manager(EventManager())
        self.is_event_dispatcher = True

        # Make the page an event listener
        self.event_manager.register_listener(self)
        self.is_event_listener = True
Exemple #32
0
def process_events(cfg_csv_path, cfg_csv_parsing, cfg_open_edx_spec, timestamp_format):
    print('****** Processing events *******')

    events_processing_duration = time.time()

    # MOOCdb storage interface
    moocdb = MOOCdb(cfg_csv_path['moocdb_csv_dir'])

    # Instanciating the piping architecture
    event_formatter = EventFormatter(moocdb, TIMESTAMP_FORMAT=timestamp_format)
    resource_manager = ResourceManager(moocdb, HIERARCHY_ROOT='https://')
    event_manager = EventManager(moocdb)
    submission_manager = SubmissionManager(moocdb)
    curation_helper = CurationHelper(cfg_csv_path['moocdb_csv_dir'])
    clickevents_manager = ClickEventsManager(moocdb)

    print("Processing %s" % cfg_csv_path['edx_track_event_path'])
    extract = extractor.CSVExtractor(cfg_csv_path, cfg_csv_parsing)

    num_rows = int(
        check_output(["wc", "-l", cfg_csv_path['edx_track_event_path']]).split(" ")[0])
    event_count = 0

    for raw_event in extract:
        event_count += 1
        if event_count % 500 == 0:
            progress = 'Progress: %0.4f%%' % (100.0 * float(event_count) /
                                                    float(num_rows))
            # A print statement is not used here because
            # a newline is automatically appended on each print, whereas
            # we want to use the CR character to move the terminal
            # pointer back to the beginning of the same line.
            print(progress)
            sys.stdout.write("\033[F")

        # Skip events explicitly not handled by qpipe
        if event_formatter.pass_filter(raw_event) is False:
            continue

        event = event_formatter.polish(raw_event)

        resource_id = resource_manager.create_resource(event)

        event.set_data_attr('resource_id', resource_id)
        submission_manager.update_submission_tables(event)
        curation_helper.record_curation_hints(event)
        clickevents_manager.record(event, cfg_open_edx_spec)
        event_manager.store_event(event)

    print('* All events processed')
    print('* Writing CSV output to : %s' % cfg_csv_path['moocdb_csv_dir'])

    event_formatter.serialize()
    event_manager.serialize()
    resource_manager.serialize(pretty_print_to=cfg_csv_path['resource_hierarchy_path'])
    submission_manager.serialize(pretty_print_to=cfg_csv_path['problem_hierarchy_path'])
    curation_helper.serialize()

    print('* Writing resource hierarchy to : %s' % cfg_csv_path['resource_hierarchy_path'])
    print('* Writing problem hierarchy to : %s' % cfg_csv_path['problem_hierarchy_path'])

    metadata_file_path = os.path.join(cfg_csv_path['moocdb_csv_dir'], 'metadata.csv')
    try:
        os.remove(metadata_file_path)
        print('* Removed old metadata file at %s' % metadata_file_path)
    except OSError:
        pass
    print('* Writing metadata row to : %s' % metadata_file_path)

    try:
        with open(metadata_file_path, 'w') as metafile:
            process = Popen(['git', 'describe', '--always'], stdout=PIPE)
            commit_hash, err = process.communicate()
            commit_hash = commit_hash.rstrip() if err is None else ''
            events_processing_duration = (
                int(time.time() - events_processing_duration)) / 60  # minutes
            metafile.write('%s,%s\n' %
                           (commit_hash, events_processing_duration))
    except OSError:
        pass
    moocdb.close()
Exemple #33
0
#
# Results generators and caching
#

import json
import gevent
import Database
import Options
import RHUtils
import logging
from monotonic import monotonic
from Language import __
from eventmanager import Evt, EventManager
from RHRace import WinCondition

Events = EventManager()

logger = logging.getLogger(__name__)

class CacheStatus:
    INVALID = 'invalid'
    VALID = 'valid'

def invalidate_all_caches(DB):
    ''' Check all caches and invalidate any paused builds '''
    for race in Database.SavedRaceMeta.query.all():
        race.cacheStatus = CacheStatus.INVALID

    for heat in Database.Heat.query.all():
        heat.cacheStatus = CacheStatus.INVALID
Exemple #34
0
class SpatialLlama(sc2.BotAI):
    def __init__(self):
        self.verbose = False
        self.visual_debug = False

        # Llama Stuff
        self.llama_controller = LlamaControler()

        # Control Stuff
        self.want_to_expand = False
        self.researched_warpgate = False

        # Attack stuff
        self.army_manager = ArmyManager(bot=self)
        self.attack_target = None
        self.units_available_for_attack = {
            ZEALOT: 'ZEALOT',
            STALKER: 'STALKER'
        }
        self.minimum_army_size = 15

        # Defense stuff
        self.threat_proximity = 20
        self.defending_units = {}
        self.defend_around = [PYLON, NEXUS]

        # Threat stuff stuff
        self.defending_from = {}

        # Scout stuff
        self.scouting_units = set()
        self.number_of_scouting_units = 3
        self.scout_interval = 30  # Seconds
        self.scout_timer = 0
        self.map_size = None

        # Expansion and macro stuff
        self.auto_expand_after = 300  # 5 Minutes
        self.auto_expand_mineral_threshold = 22  # Should be 2.5 ~ 3 fully saturated bases
        self.maximum_workers = 80
        self.gateways_per_nexus = 2

        # Research stuff
        self.start_forge_after = 180  # seconds - 4min
        self.forge_research_priority = ['ground_weapons', 'shield']

        self.event_manager = EventManager()

        self.upgrades = {
            'ground_weapons': [
                FORGERESEARCH_PROTOSSGROUNDWEAPONSLEVEL1,
                FORGERESEARCH_PROTOSSGROUNDWEAPONSLEVEL2,
                FORGERESEARCH_PROTOSSGROUNDWEAPONSLEVEL3
            ],
            'ground_armor': [
                FORGERESEARCH_PROTOSSGROUNDARMORLEVEL1,
                FORGERESEARCH_PROTOSSGROUNDARMORLEVEL2,
                FORGERESEARCH_PROTOSSGROUNDARMORLEVEL3
            ],
            'shield': [
                FORGERESEARCH_PROTOSSSHIELDSLEVEL1,
                FORGERESEARCH_PROTOSSSHIELDSLEVEL2,
                FORGERESEARCH_PROTOSSSHIELDSLEVEL3
            ]
        }

        self.upgrade_names = {
            FORGERESEARCH_PROTOSSGROUNDWEAPONSLEVEL1: 'GROUND WEAPONS 1',
            FORGERESEARCH_PROTOSSGROUNDWEAPONSLEVEL2: 'GROUND WEAPONS 2',
            FORGERESEARCH_PROTOSSGROUNDWEAPONSLEVEL3: 'GROUND WEAPONS 2',
            FORGERESEARCH_PROTOSSGROUNDARMORLEVEL1: 'GROUND ARMOR 2',
            FORGERESEARCH_PROTOSSGROUNDARMORLEVEL2: 'GROUND ARMOR 2',
            FORGERESEARCH_PROTOSSGROUNDARMORLEVEL3: 'GROUND ARMOR 2',
            FORGERESEARCH_PROTOSSSHIELDSLEVEL1: 'SHIELDS 1',
            FORGERESEARCH_PROTOSSSHIELDSLEVEL2: 'SHIELDS 2',
            FORGERESEARCH_PROTOSSSHIELDSLEVEL3: 'SHIELDS 3'
        }

    def on_start(self):
        if self.verbose:
            print('%6.2f Rise and shine' % (0))

        self.map_size = self.game_info.map_size

        self.army_manager.init()

        # TODO Tweak these values
        self.event_manager.add_event(self.distribute_workers, 10)
        self.event_manager.add_event(self.manage_upgrades, 5.3)
        self.event_manager.add_event(self.build_workers, 2.25)
        self.event_manager.add_event(self.manage_supply, 1)
        self.event_manager.add_event(self.build_assimilator, 2.5)
        self.event_manager.add_event(self.build_structures, 2.4)
        self.event_manager.add_event(self.build_nexus, 5)
        self.event_manager.add_event(self.build_army, 0.9)
        self.event_manager.add_event(self.scout_controller, 7)
        self.event_manager.add_event(self.army_controller, 1.1)
        self.event_manager.add_event(self.defend, 2)
        self.event_manager.add_event(self.attack, 3)
        self.event_manager.add_event(self.expansion_controller, 5)

    async def on_step(self, iteration):
        sys.stdout.flush()

        if iteration == 0:  # Do nothing on the first iteration to avoid
            # everything being done at the same time
            await self.chat_send(self.llama_controller.get_random_llama_fact())
            return

        events = self.event_manager.get_current_events(self.time)
        for event in events:
            await event()

        await self.debug()

    async def expansion_controller(self):
        if self.time > self.auto_expand_after:
            number_of_minerals = sum([
                self.state.mineral_field.closer_than(10, x).amount
                for x in self.townhalls
            ])

            if number_of_minerals <= self.auto_expand_mineral_threshold:
                self.want_to_expand = True

    async def army_controller(self):
        await self.army_manager.step()

    async def scout_controller(self):
        current_time = self.time
        if current_time - self.scout_timer > self.scout_interval:
            self.scout_timer = self.time

            n_scouting_units_assigned = len(self.scouting_units)
            missing_scouting_units = self.number_of_scouting_units - n_scouting_units_assigned

            # Uses the previous assigned scouting units to keep scouting
            for scouting_unit_tag in list(self.scouting_units):
                unit = self.units.find_by_tag(scouting_unit_tag)

                if unit.exists:
                    target = random.sample(list(self.expansion_locations),
                                           k=1)[0]
                    await self.do(unit.attack(target))
                else:
                    # If a scouting unit isnt found then it is (most likely) dead
                    # and we need another to replace it
                    self.scouting_units.remove(unit)
                    missing_scouting_units += 1

            if missing_scouting_units > 0:
                idle_stalkers = self.units(STALKER).idle

                if idle_stalkers.exists:
                    if self.verbose:
                        print('%6.2f Scouting' % (self.time))

                    # If there is no unit assigned to scouting
                    # the the idle unit furthest from the base
                    for i in range(missing_scouting_units):
                        stalker = idle_stalkers.furthest_to(
                            self.units(NEXUS).first)

                        if stalker:
                            target = random.sample(list(
                                self.expansion_locations),
                                                   k=1)[0]
                            await self.do(stalker.attack(target))
                            self.scouting_units

                        idle_stalkers = self.units(STALKER).idle
                        if not idle_stalkers.exists:
                            break
                else:
                    pass
                    #print('     - no units to scout')

    async def defend(self):
        # Attacks units that get too close to import units
        for structure_type in self.defend_around:
            for structure in self.units(structure_type):
                threats = self.known_enemy_units.closer_than(
                    self.threat_proximity, structure.position)
                if threats.exists:
                    target_threat = None
                    new_threat_count = 0

                    for threat in threats:
                        if threat.tag not in self.defending_from:
                            self.defending_from[threat.tag] = None
                            target_threat = threat
                            new_threat_count += 1

                    if new_threat_count > 0:
                        if self.verbose:
                            print('%6.2f found %d threats' %
                                  (self.time, new_threat_count))
                        await self.target_enemy_unit(target_threat)
                        break

    async def target_enemy_unit(self, target):
        # sends all idle units to attack an enemy unit

        zealots = self.units(ZEALOT).idle
        stalkers = self.units(STALKER).idle
        total_units = zealots.amount + stalkers.amount

        # Only sends 1 unit to attack a worker
        is_worker = target.type_id in [PROBE, SCV, DRONE]

        if self.verbose:
            print('%6.2f defending with %d units' % (self.time, total_units))

        for unit_group in [zealots, stalkers]:
            for unit in unit_group:
                if is_worker:
                    await self.do(unit.attack(target))
                    if self.verbose:
                        print(
                            '     - target is a probe, sending a single unit')
                    return
                else:
                    await self.do(unit.attack(target.position))

    async def attack(self):
        total_units = 0
        for unit_type in self.units_available_for_attack.keys():
            total_units += self.units(unit_type).idle.amount

        if total_units >= self.minimum_army_size:
            if self.army_manager.army_size() == 0:
                for unit_type in self.units_available_for_attack.keys():
                    for unit in self.units(unit_type).idle:
                        self.army_manager.add(unit.tag)

                await self.army_manager.group_at_map_center(
                    wait_for_n_units=total_units - 1,
                    timeout=30,
                    move_towards_position=self.enemy_start_locations[0])

                if self.verbose:
                    print('%6.2f Attacking with %d units' %
                          (self.time, total_units))
            else:
                for unit_type in self.units_available_for_attack.keys():
                    for unit in self.units(unit_type).idle:
                        self.army_manager.add(unit.tag,
                                              options={'reinforcement': True})

                if self.verbose:
                    print('%6.2f reinforcing with %d units' %
                          (self.time, total_units))

    async def build_army(self):
        if not self.can('build_army'):
            return

        # Iterates over all gateways
        for gateway in self.units(GATEWAY).ready.noqueue:
            abilities = await self.get_available_abilities(gateway)

            # Checks if the gateway can morph into a warpgate
            if AbilityId.MORPH_WARPGATE in abilities and self.can_afford(
                    AbilityId.MORPH_WARPGATE):
                await self.do(gateway(MORPH_WARPGATE))

            # Else, tries to build a stalker
            elif AbilityId.GATEWAYTRAIN_STALKER in abilities:
                if self.can_afford(STALKER) and self.supply_left > 2:
                    await self.do(gateway.train(STALKER))

            # Else, tries to build a zealot
            elif AbilityId.GATEWAYTRAIN_ZEALOT in abilities:
                if self.can_afford(ZEALOT) and self.supply_left > 2:
                    await self.do(gateway.train(ZEALOT))

        # Iterates over all warpgates and warp in stalkers
        for warpgate in self.units(WARPGATE).ready:
            abilities = await self.get_available_abilities(warpgate)
            if AbilityId.WARPGATETRAIN_STALKER in abilities:
                if self.can_afford(STALKER) and self.supply_left > 2:
                    # Smartly find a good pylon boy to warp in units next to it
                    pylon = self.pylon_with_less_units()
                    #pos = pylon.position.to2.random_on_distance(4)
                    pos = pylon.position.to2
                    placement = await self.find_placement(PYLON,
                                                          pos,
                                                          placement_step=1,
                                                          max_distance=4)

                    if placement is not None:
                        await self.do(warpgate.warp_in(STALKER, placement))
                    else:
                        # otherwise just brute force it
                        for _ in range(5):  # TODO tweak this
                            pylon = self.units(PYLON).ready.random
                            #pos = pylon.position.to2.random_on_distance(4)
                            pos = pylon.position.to2
                            placement = await self.find_placement(
                                PYLON, pos, placement_step=1, max_distance=4)

                            if placement is not None:
                                await self.do(
                                    warpgate.warp_in(STALKER, placement))
                                break

    async def build_structures(self):
        if not self.can('build_structures'):
            return

        # Only start building main structures if there is
        # at least one pylon
        if not self.units(PYLON).ready.exists:
            return
        else:
            pylon = self.units(PYLON).ready.random

        number_of_gateways = self.units(WARPGATE).amount + self.units(
            GATEWAY).amount

        # Build the first gateway
        if self.can_afford(GATEWAY) and number_of_gateways == 0:
            if self.verbose:
                print('%6.2f starting first gateway' % (self.time))
            await self.build(GATEWAY, near=pylon)

        # Build the cybernetics core after the first gateway is ready
        if self.can_afford(CYBERNETICSCORE) and self.units(
                CYBERNETICSCORE).amount == 0 and self.units(GATEWAY).ready:
            if self.verbose:
                print('%6.2f starting cybernetics' % (self.time))
            await self.build(CYBERNETICSCORE, near=pylon)
            self.want_to_expand = True

        # Build more gateways after the cybernetics core is ready
        if self.can_afford(GATEWAY) and self.units(CYBERNETICSCORE).ready and (
            (number_of_gateways < 4 and self.units(NEXUS).amount <= 2) or
            (number_of_gateways <=
             self.units(NEXUS).amount * self.gateways_per_nexus)):
            if self.verbose:
                print('%6.2f starting more gateways' % (self.time))
            await self.build(GATEWAY, near=pylon)

        # Build 2 forges
        if self.time > self.start_forge_after and self.units(FORGE).amount < 2:
            if self.can_afford(FORGE) and not self.already_pending(FORGE):
                if self.verbose:
                    print('%6.2f building forge' % (self.time))
                await self.build(FORGE, near=pylon)

        # Build twilight council
        if self.units(FORGE).ready.amount >= 2 and self.units(
                TWILIGHTCOUNCIL).amount == 0:
            if self.can_afford(TWILIGHTCOUNCIL
                               ) and not self.already_pending(TWILIGHTCOUNCIL):
                if self.verbose:
                    print('%6.2f building twilight council' % (self.time))
                await self.build(TWILIGHTCOUNCIL, near=pylon)

    async def build_nexus(self):
        if not self.can('expand'):
            return

        if not self.already_pending(NEXUS) and self.can_afford(NEXUS) and \
           self.bot.units(UnitTypeId.NEXUS).ready.amount >= 1:
            if self.verbose:
                print('%6.2f expanding' % (self.time))

            await self.expand_now()
            self.want_to_expand = False

    async def manage_upgrades(self):
        await self.manage_cyberbetics_upgrades()
        await self.manage_forge_upgrades()

    async def manage_cyberbetics_upgrades(self):
        if self.units(CYBERNETICSCORE).ready.exists and self.can_afford(
                RESEARCH_WARPGATE) and not self.researched_warpgate:
            ccore = self.units(CYBERNETICSCORE).ready.first
            await self.do(ccore(RESEARCH_WARPGATE))
            self.researched_warpgate = True

            if self.verbose:
                print('%6.2f researching warpgate' % (self.time))

    async def manage_forge_upgrades(self):
        for forge in self.units(FORGE).ready.noqueue:
            abilities = await self.get_available_abilities(forge)

            for upgrade_type in self.forge_research_priority:
                for upgrade in self.upgrades[upgrade_type]:
                    sys.stdout.flush()
                    if upgrade in abilities and self.can_afford(upgrade):
                        if self.verbose:
                            print('%6.2f researching %s' %
                                  (self.time, self.upgrade_names[upgrade]))

                        await self.do(forge(upgrade))
                        break

    async def build_workers(self):
        nexus = self.units(NEXUS).ready.noqueue

        if nexus and self.units(
                PROBE
        ).amount < self.maximum_workers and self.workers.amount < self.units(
                NEXUS).amount * 22:
            if self.can_afford(PROBE) and self.supply_left > 2:
                await self.do(nexus.random.train(PROBE))

    async def manage_supply(self):
        for tries in range(5):  # Only tries 5 different placements
            nexus = self.units(NEXUS).ready

            if not nexus:
                return

            nexus = nexus.random

            if self.supply_left < 8 and not self.already_pending(PYLON):
                if self.can_afford(PYLON):
                    pos = await self.find_placement(PYLON,
                                                    nexus.position,
                                                    placement_step=2)
                    mineral_fields = self.state.mineral_field.closer_than(
                        8, nexus).closer_than(4, pos)

                    if mineral_fields:
                        continue
                    else:
                        await self.build(PYLON, near=pos)
                        break

    async def build_assimilator(self):
        if not self.can('build_assimilator'):
            return

        if self.workers.amount < 16:
            return

        for nexus in self.units(NEXUS).ready:
            vgs = self.state.vespene_geyser.closer_than(20, nexus)
            for vg in vgs:
                if not self.can_afford(ASSIMILATOR):
                    break

                worker = self.select_build_worker(vg.position)
                if worker is None:
                    break

                if not self.units(ASSIMILATOR).closer_than(1.0, vg).exists:
                    if self.verbose:
                        print('%6.2f building assimilator' % (self.time))
                    await self.do(worker.build(ASSIMILATOR, vg))

    async def debug(self):
        if not self.visual_debug:
            return

        # Setup and info

        font_size = 18

        total_units = 0
        for unit_type in self.units_available_for_attack.keys():
            total_units += self.units(unit_type).idle.amount

        number_of_minerals = sum([
            self.state.mineral_field.closer_than(10, x).amount
            for x in self.townhalls
        ])

        # Text

        messages = [
            '       n_workers: %3d' % self.units(PROBE).amount,
            '       n_zealots: %3d' % self.units(ZEALOT).amount,
            '      n_stalkers: %3d' % self.units(STALKER).amount,
            '       idle_army: %3d' % total_units,
            '       army_size: %3d' % self.army_manager.army_size(),
            '     ememy_units: %3d' % self.known_enemy_units.amount,
            'ememy_structures: %3d' % self.known_enemy_structures.amount,
            '   minerals_left: %3d' % number_of_minerals,
        ]

        if self.army_manager.leader is not None:
            messages.append('     leader: %3d' % self.army_manager.leader)

        y = 0
        inc = 0.025

        for message in messages:
            self._client.debug_text_screen(message,
                                           pos=(0.001, y),
                                           size=font_size)
            y += inc

        # Spheres

        leader_tag = self.army_manager.leader
        for soldier_tag in self.army_manager.soldiers:
            soldier_unit = self.units.find_by_tag(soldier_tag)

            if soldier_unit is not None:
                if soldier_tag == leader_tag:
                    self._client.debug_sphere_out(soldier_unit,
                                                  r=1,
                                                  color=(255, 0, 0))
                else:
                    self._client.debug_sphere_out(soldier_unit,
                                                  r=1,
                                                  color=(0, 0, 255))

        # Lines

        if self.army_manager.army_size() > 0:
            leader_tag = self.army_manager.leader
            leader_unit = self.units.find_by_tag(leader_tag)

            for soldier_tag in self.army_manager.soldiers:
                if soldier_tag == leader_tag:
                    continue

                soldier_unit = self.units.find_by_tag(soldier_tag)
                if soldier_unit is not None:
                    leader_tag = self.army_manager.leader
                    leader_unit = self.units.find_by_tag(leader_tag)
                    if leader_unit is not None:
                        self._client.debug_line_out(leader_unit,
                                                    soldier_unit,
                                                    color=(0, 255, 255))

        # pylon
        pylon = self.pylon_with_less_units()
        if pylon is not None:
            pos = pylon.position3d
            self._client.debug_sphere_out(pos, r=1, color=(0, 255, 0))
            self._client.debug_sphere_out(pos, r=2, color=(0, 255, 0))
            self._client.debug_sphere_out(pos, r=3, color=(0, 255, 0))
            self._client.debug_sphere_out(pos, r=4, color=(0, 255, 0))

        # Sens the debug info to the game
        await self._client.send_debug()

    def select_target(self, state):
        if self.known_enemy_structures.exists:
            return random.choice(self.known_enemy_structures)

        return self.enemy_start_locations[0]

    # Finds the pylon with more "space" next to it
    # Where more space == Less units
    # TODO consider "warpable" space
    def pylon_with_less_units(self, distance=4):
        pylons = self.units(PYLON).ready

        good_boy_pylon = None
        units_next_to_good_boy_pylon = float('inf')

        for pylon in pylons:
            units_next_to_candidate_pylon = self.units.closer_than(
                distance, pylon).amount

            if units_next_to_candidate_pylon < units_next_to_good_boy_pylon:
                good_boy_pylon = pylon
                units_next_to_good_boy_pylon = units_next_to_candidate_pylon

        return good_boy_pylon

    def can(self, what):
        if what == 'build_army':
            return not self.want_to_expand

        if what == 'build_structures':
            return not self.want_to_expand

        if what == 'build_assimilator':
            return not self.want_to_expand

        if what == 'expand':
            return self.want_to_expand

        self.console()

    def console(self):
        from IPython.terminal.embed import InteractiveShellEmbed
        ipshell = InteractiveShellEmbed.instance()
        ipshell()

    def get_unit_info(self, unit, field="food_required"):
        assert isinstance(unit, (Unit, UnitTypeId))

        if isinstance(unit, Unit):
            unit = unit._type_data._proto
        else:
            unit = self._game_data.units[unit.value]._proto

        if hasattr(unit, field):
            return getattr(unit, field)
        else:
            return None
Exemple #35
0
class NetServer(Thread):
    def __init__(self, port=None, address=None):
        Thread.__init__(self)
        self.daemon = True
        self.runthread = True
        self.port = port
        self.address = address
        self.pluginlist = None
        self.clients = {}
        self.event_subscriptions = {}
        self.em = EventManager()

    def config(self, conf):
        if (not conf.has_key('netserver')):
            return False
        if (not conf['netserver'].has_key('address')):
            return False
        if (not conf['netserver'].has_key('port')):
            return False
        if (not conf['netserver'].has_key('accept')):
            conf['netserver']['accept'] = '0.0.0.0/0'
        if (not conf['netserver'].has_key('reject')):
            conf['netserver']['reject'] = '0.0.0.0/32'
        if (not conf['netserver'].has_key('allow')):
            conf['netserver']['allow'] = '0.0.0.0/32'
        self.address = conf['netserver']['address']
        self.port = conf['netserver']['port']
        self.net_accept = {}
        self.net_reject = {}
        self.net_allow = {}

        ipcalc = IPCalc()

        for network_str in conf['netserver']['accept'].split(','):
            network, bitmask = ipcalc.netsplit(network_str)
            self.net_accept[network] = bitmask

        for network_str in conf['netserver']['reject'].split(','):
            network, bitmask = ipcalc.netsplit(network_str)
            self.net_reject[network] = bitmask

        for network_str in conf['netserver']['allow'].split(','):
            network, bitmask = ipcalc.netsplit(network_str)
            self.net_allow[network] = bitmask

        return True

    def plugins(self, plugins):
        self.pluginlist = plugins
        self.em.plugins(plugins)

    def add_event(self, event):
        if (not self.event_subscriptions.has_key(event['type'])):
            return False

        for client in self.event_subscriptions[event['type']]:
            try:
                self.clients[client]['thread'].add_event(event)
            except:
                lerror('unable to pass event to client thread')

    def run(self):
        listen = NetSocket(self.port, self.address)

        serversocket = listen.listen()
        if (not serversocket):
            lerror('cannot start server process')
            return 1

        ret = self.em.add_event_handler('NetServer', 2)
        ipcalc = IPCalc()
        while (self.runthread):
            try:
                clientsocket, address = serversocket.accept()

            except socket.error, serror:
                lerror('socket error (%d): %s ' % (serror[0], serror[1]))
                continue
            except:
Exemple #36
0
class AsteriskHandler(Thread):
    def __init__(self):
        Thread.__init__(self)
        self.daemon = True
        self.runthread = True
        self.idlesleep = 0.01
        self.eventpipe = deque()
        self.em = EventManager()
        self.ami = None
        self.queuereadflag = False
        self.queuestats = {}
        self.extstates = {}
        self.channels = {}
        self.status_expire = 60
        self.status_timeout = 1

    def config(self, conf):
        return True

    def plugins(self, plugins):
        self.pluginlist = plugins
        self.em.plugins(plugins)

        self.ami = array_value(plugins, ('AsteriskManager', 'object'),
                               self.ami)

    def push_event(self, event):
        return self.em.add_handler_event(event, 2)

    def add_event(self, event):
        return self.eventpipe.appendleft(event)

    def send(self, send_string):

        return self.ami.send(send_string)

    def extension_status(self, exten):
        if (not exten):
            return None

        idlesleep = 0.1
        timeout = int(self.status_timeout / idlesleep)

        if (self.extstates.has_key(exten) and
            ((time() - self.extstates[exten]['time']) < self.status_expire)):
            state = int(self.extstates[exten]['status'])

        else:
            ldebug('retrieving status of extension %s' % exten)
            message = "Action: ExtensionState\r\nExten: %s\r\n\r\n" % exten
            try:
                self.send(message)
            except:
                return None

            wait = 0
            while (wait < timeout):
                if (self.extstates.has_key(exten)):
                    state = int(self.extstates[exten]['status'])
                    break
                else:
                    sleep(idlesleep)
                    state = None
                    wait += 1

        return state

    def queue_status(self, queue):
        if (not queue):
            return None

        idlesleep = 0.1
        timeout = int(self.status_timeout / idlesleep)

        if (self.queuestats.has_key(queue) and
            ((time() - self.queuestats[queue]['time']) < self.status_expire)):
            status = self.queuestats[queue]

        else:
            if (self.queuereadflag == False):
                ldebug('retrieving status of queue %s' % queue)
                message = "Action: QueueStatus\r\nQueue: %s\r\n\r\n" % queue

                try:
                    self.send(message)
                except:
                    return None

            wait = 0
            while (wait < timeout):
                if (self.queuestats.has_key(queue)):
                    status = self.queuestats[queue]
                    ldebug('got new status of queue %s' % queue)
                    break
                else:
                    ldebug('waiting for update of queue %s' % queue)
                    sleep(idlesleep)
                    status = None
                    wait += 1

            if (status == None):
                lwarn('updating of queue %s failed after timeout' % queue)

        return status

    def get_channels(self):
        return self.channels

    def run(self):
        ret = self.em.add_event_handler('AsteriskHandler', 1)
        while self.runthread:
            if (self.eventpipe):
                event = self.eventpipe.pop()

            else:
                event = False
                sleep(self.idlesleep)
                continue

            push_event = {}

            if (array_value(event, 'Message') == "Extension Status"):
                exinfo = {}
                exten = array_value(event, 'Exten')
                exinfo['status'] = array_value(event, 'Status', 255, int)
                exinfo['time'] = array_value(event, '_time', 0, int)
                if (exten):
                    self.extstates[exten] = exinfo
                    push_event['type'] = 1
                    push_event['status'] = exinfo['status']
                    push_event['time'] = exinfo['time']
                    push_event['ext'] = exten
            elif (array_value(event, "Message") == "Queue status will follow"):
                queue_stats_time = int(event['_time'])
                self.queuereadflag = queue_stats_time
                continue

            if (not event.has_key("Event")):
                continue

            if (event["Event"] == "ExtensionStatus"):
                exinfo = {}
                exten = array_value(event, 'Exten')
                exinfo['status'] = array_value(event, 'Status', 255, int)
                exinfo['time'] = array_value(event, '_time', 0, int)
                if (exten):
                    self.extstates[exten] = exinfo
                    push_event['type'] = 1
                    push_event['status'] = exinfo['status']
                    push_event['time'] = exinfo['time']
                    push_event['ext'] = exten

            elif (event["Event"] == "QueueStatusComplete"):
                queue_stats_time = int(event['_time'])
                self.queuereadflag = False

            elif (event["Event"] == "QueueParams"):
                queue = array_value(event, 'Queue')

                if (not queue):
                    continue

                queue_entry = {}
                queue_stat = {}

                queue_stat['calls'] = array_value(event, 'Calls', None, int)
                queue_stat['completed'] = array_value(event, 'Completed', None,
                                                      int)
                queue_stat['abandoned'] = array_value(event, 'Abandoned', None,
                                                      int)
                queue_stat['maxlen'] = array_value(event, 'Max', None, int)
                queue_stat['holdtime'] = array_value(event, 'Holdtime', None,
                                                     int)
                queue_stat['weight'] = array_value(event, 'Weight', None, int)
                queue_stat['servicelevel'] = array_value(
                    event, 'ServiceLevel', None, int)
                queue_stat['serviceperf'] = array_value(
                    event, 'ServicelevelPerf', None, float)

                queue_entry['time'] = int(event['_time'])
                queue_entry['status'] = queue_stat
                queue_entry['members'] = []

                self.queuestats[queue] = queue_entry

            elif (event["Event"] == "QueueMember"):
                queue = array_value(event, 'Queue')
                if (not queue):
                    continue

                queue_member = {}

                queue_member['status'] = array_value(event, 'Status', None,
                                                     int)
                queue_member['penalty'] = array_value(event, 'Penalty', None,
                                                      int)
                queue_member['name'] = array_value(event, 'Name', None, int)
                queue_member['membership'] = array_value(
                    event, 'Membership', None, str)
                queue_member['location'] = array_value(event, 'Location', None,
                                                       int)
                queue_member['lastcall'] = array_value(event, 'LastCall', None,
                                                       int)
                queue_member['paused'] = array_value(event, 'Paused', None,
                                                     int)
                queue_member['callstaken'] = array_value(
                    event, 'CallsTaken', None, int)

                self.queuestats[queue]['members'].append(queue_member)

            elif (event["Event"] == "Join" or event["Event"] == "Leave"):
                queue = array_value(event, 'Queue', None, str)
                count = array_value(event, 'Count', None, int)

                if (queue == None):
                    continue
                if (count == None):
                    continue

                if (self.queuestats.has_key(queue)):
                    self.queuestats[queue]['status']['calls'] = count

            elif (event["Event"] == "Newchannel"):
                channelinfo = {}
                chan_id = array_value(event, 'Uniqueid')

                channelinfo['channel'] = array_value(event, 'Channel')
                channelinfo['status'] = array_value(event, 'ChannelState', 255,
                                                    int)
                channelinfo['time'] = time()
                channelinfo['starttime'] = channelinfo['time']
                channelinfo['ext'] = array_value(event, 'Exten')
                channelinfo['cidnum'] = array_value(event, 'CallerIDNum')
                channelinfo['cidname'] = array_value(event, 'CallerIDName')

                if (chan_id):
                    self.channels[chan_id] = channelinfo

            elif (event["Event"] == "ChannelUpdate"):
                chan_id = array_value(event, 'Uniqueid')

                if (chan_id):
                    if (not self.channels.has_key(chan_id)):
                        self.channels[chan_id] = {}
                    self.channels[chan_id]['channel'] = array_value(
                        event, 'Channel')
                    self.channels[chan_id]['time'] = time()
                    self.channels[chan_id]['channeltype'] = array_value(
                        event, 'Channeltype')

            elif (event["Event"] == "Newstate"):
                chan_id = array_value(event, 'Uniqueid')

                if (chan_id):
                    if (not self.channels.has_key(chan_id)):
                        self.channels[chan_id] = {}
                    self.channels[chan_id]['channel'] = array_value(
                        event, 'Channel')
                    self.channels[chan_id]['time'] = time()
                    self.channels[chan_id]['cidnum'] = array_value(
                        event, 'CallerIDNum')
                    self.channels[chan_id]['cidname'] = array_value(
                        event, 'CallerIDName')
                    self.channels[chan_id]['status'] = array_value(
                        event, 'ChannelState', 255, int)

            elif (event["Event"] == "NewCallerid"):
                chan_id = array_value(event, 'Uniqueid')

                if (chan_id):
                    if (not self.channels.has_key(chan_id)):
                        self.channels[chan_id] = {}
                    self.channels[chan_id]['channel'] = array_value(
                        event, 'Channel')
                    self.channels[chan_id]['time'] = time()
                    self.channels[chan_id]['cidnum'] = array_value(
                        event, 'CallerIDNum')
                    self.channels[chan_id]['cidname'] = array_value(
                        event, 'CallerIDName')

            elif (event["Event"] == "Bridge"):
                chan_id1 = array_value(event, 'Uniqueid1')
                chan_id2 = array_value(event, 'Uniqueid2')

                if (chan_id1 and chan_id2):
                    if (not self.channels.has_key(chan_id1)):
                        self.channels[chan_id1] = {}
                    self.channels[chan_id1]['channel'] = array_value(
                        event, 'Channel1')
                    self.channels[chan_id1]['time'] = time()
                    self.channels[chan_id1]['cidnum'] = array_value(
                        event, 'CallerID1')
                    self.channels[chan_id1]['bridgestate'] = array_value(
                        event, 'Bridgestate')
                    self.channels[chan_id1]['bridgetype'] = array_value(
                        event, 'Bridgetype')
                    self.channels[chan_id1]['bridgechannel'] = array_value(
                        event, 'Channel2')
                    self.channels[chan_id1]['bridgechanid'] = chan_id2

                    if (not self.channels.has_key(chan_id2)):
                        self.channels[chan_id2] = {}
                    self.channels[chan_id2]['channel'] = array_value(
                        event, 'Channel2')
                    self.channels[chan_id2]['time'] = time()
                    self.channels[chan_id2]['cidnum'] = array_value(
                        event, 'CallerID2')
                    self.channels[chan_id2]['bridgestate'] = array_value(
                        event, 'Bridgestate')
                    self.channels[chan_id2]['bridgetype'] = array_value(
                        event, 'Bridgetype')
                    self.channels[chan_id2]['bridgechannel'] = array_value(
                        event, 'Channel1')
                    self.channels[chan_id2]['bridgechanid'] = chan_id1

            elif (event["Event"] == "Hangup"):
                channelinfo = {}
                chan_id = array_value(event, 'Uniqueid')

                channelinfo['channel'] = array_value(event, 'Channel')
                channelinfo['status'] = array_value(event, 'ChannelState', 255,
                                                    int)
                channelinfo['time'] = time()
                channelinfo['cidnum'] = array_value(event, 'CallerIDNum')
                channelinfo['cidname'] = array_value(event, 'CallerIDName')
                channelinfo['cause'] = array_value(event, 'Cause', 255, int)

                if (chan_id):
                    self.channels[chan_id] = channelinfo

                    try:
                        del (self.channels[chan_id])
                    except:
                        lwarn('channel id "%s" not in list' % chan_id)

            if (push_event):
                self.push_event(push_event)

        ldebug('closing asterisk handler thread')

    def stop(self):
        self.runthread = False
Exemple #37
0
 	def Notify(self, event):
		EventManager.Post( self, event )
Exemple #38
0
class AsteriskHandler(Thread):

	def __init__(self):
		Thread.__init__(self)
		self.daemon = True
		self.runthread = True
		self.idlesleep = 0.01
		self.eventpipe = deque()
		self.em = EventManager()
		self.ami = None
		self.queuereadflag = False
		self.queuestats = {}
		self.extstates = {}
		self.channels = {}
		self.status_expire = 60
		self.status_timeout = 1
		
	def config(self, conf):		
		return True

	def plugins(self, plugins):
		self.pluginlist = plugins
		self.em.plugins(plugins)

		self.ami = array_value(plugins, ('AsteriskManager', 'object'), self.ami)

	def push_event(self, event):
		return self.em.add_handler_event(event, 2)
	
	def add_event(self, event):
		return self.eventpipe.appendleft(event)

	def send(self, send_string):
	
		return self.ami.send(send_string)

	def extension_status(self, exten):
		if (not exten):
			return None

		idlesleep = 0.1
		timeout = int(self.status_timeout / idlesleep)

		if (self.extstates.has_key(exten) and ((time() - self.extstates[exten]['time']) < self.status_expire)):
			state = int(self.extstates[exten]['status'])

		else:
			ldebug('retrieving status of extension %s' % exten)
			message = "Action: ExtensionState\r\nExten: %s\r\n\r\n" % exten
			try:
				self.send(message)
			except:
				return None

			wait = 0
			while (wait < timeout):
				if (self.extstates.has_key(exten)):
					state = int(self.extstates[exten]['status'])
					break
				else:
					sleep(idlesleep)
					state = None
					wait += 1
		
		return state

	def queue_status(self, queue):
		if (not queue):
			return None

		idlesleep = 0.1
		timeout = int(self.status_timeout / idlesleep)

		if (self.queuestats.has_key(queue) and ((time() - self.queuestats[queue]['time']) < self.status_expire)):
			status = self.queuestats[queue]

		else:
			if (self.queuereadflag == False):
				ldebug('retrieving status of queue %s' % queue)
				message = "Action: QueueStatus\r\nQueue: %s\r\n\r\n" % queue

				try:
					self.send(message)
				except:
					return None

			wait = 0
			while (wait < timeout):
				if (self.queuestats.has_key(queue)):
					status = self.queuestats[queue]
					ldebug('got new status of queue %s' % queue)
					break
				else:
					ldebug('waiting for update of queue %s' % queue)
					sleep(idlesleep)
					status = None
					wait += 1

			if (status == None):
				lwarn('updating of queue %s failed after timeout' % queue)

		return status
		
	def get_channels(self):	
		return self.channels

	def run(self):
		ret = self.em.add_event_handler('AsteriskHandler', 1)
		while self.runthread:
			if (self.eventpipe):
				event = self.eventpipe.pop()

			else:
				event = False
				sleep(self.idlesleep)
				continue

			push_event = {}

			if (array_value(event, 'Message') == "Extension Status"):
				exinfo = {}
				exten = array_value(event, 'Exten')
				exinfo['status'] = array_value(event, 'Status', 255, int)
				exinfo['time'] = array_value(event, '_time', 0, int)
				if (exten):
					self.extstates[exten]=exinfo
					push_event['type'] = 1
					push_event['status'] = exinfo['status']
					push_event['time'] = exinfo['time']
					push_event['ext'] = exten
			elif (array_value(event,"Message") == "Queue status will follow"):
				queue_stats_time = int(event['_time'])
				self.queuereadflag = queue_stats_time
				continue

			if (not event.has_key("Event")):
				continue

			if (event["Event"] == "ExtensionStatus"):
				exinfo = {}
				exten = array_value(event, 'Exten')
				exinfo['status'] = array_value(event, 'Status', 255, int)
				exinfo['time'] = array_value(event, '_time', 0, int)
				if (exten):
					self.extstates[exten]=exinfo
					push_event['type'] = 1
					push_event['status'] = exinfo['status']
					push_event['time'] = exinfo['time']
					push_event['ext'] = exten
			
			elif (event["Event"] == "QueueStatusComplete"):
				queue_stats_time = int(event['_time'])
				self.queuereadflag = False

			elif (event["Event"] == "QueueParams"):
				queue = array_value(event, 'Queue')

				if (not queue):
					continue

				queue_entry = {}
				queue_stat = {}

				queue_stat['calls'] 		= array_value(event, 'Calls', None, int)
				queue_stat['completed'] 	= array_value(event, 'Completed', None, int)
				queue_stat['abandoned'] 	= array_value(event, 'Abandoned', None, int)
				queue_stat['maxlen'] 		= array_value(event, 'Max', None, int)
				queue_stat['holdtime']		= array_value(event, 'Holdtime', None, int)
				queue_stat['weight']		= array_value(event, 'Weight', None, int)
				queue_stat['servicelevel']	= array_value(event, 'ServiceLevel', None, int)
				queue_stat['serviceperf']	= array_value(event, 'ServicelevelPerf', None, float)

				queue_entry['time'] = int(event['_time'])
				queue_entry['status'] = queue_stat
				queue_entry['members'] = []

				self.queuestats[queue] = queue_entry
	
			elif (event["Event"] == "QueueMember"):
				queue = array_value(event, 'Queue')
				if (not queue):
					continue
					
				queue_member = {}

				queue_member['status']		= array_value(event, 'Status', None, int)
				queue_member['penalty']		= array_value(event, 'Penalty', None, int)
				queue_member['name']		= array_value(event, 'Name', None, int)
				queue_member['membership']	= array_value(event, 'Membership', None, str)
				queue_member['location']	= array_value(event, 'Location', None, int)
				queue_member['lastcall']	= array_value(event, 'LastCall', None, int)
				queue_member['paused']		= array_value(event, 'Paused', None, int)
				queue_member['callstaken']	= array_value(event, 'CallsTaken', None, int)
			
				self.queuestats[queue]['members'].append(queue_member)

			elif (event["Event"] == "Join" or event["Event"] == "Leave"):
				queue = array_value(event, 'Queue', None, str)
				count = array_value(event, 'Count', None, int)

				if (queue == None):
					continue
				if (count == None):
					continue
			
				if (self.queuestats.has_key(queue)):
					self.queuestats[queue]['status']['calls'] = count
					
			elif (event["Event"] == "Newchannel"):
				channelinfo = {}
				chan_id = array_value(event, 'Uniqueid')
				
				channelinfo['channel'] = array_value(event, 'Channel')
				channelinfo['status'] = array_value(event, 'ChannelState', 255, int)
				channelinfo['time'] = time()
				channelinfo['starttime'] = channelinfo['time']
				channelinfo['ext'] = array_value(event, 'Exten')
				channelinfo['cidnum'] = array_value(event, 'CallerIDNum')
				channelinfo['cidname'] = array_value(event, 'CallerIDName')
				
				if (chan_id):
					self.channels[chan_id]=channelinfo
					
			elif (event["Event"] == "ChannelUpdate"):
				chan_id = array_value(event, 'Uniqueid')
				
				if (chan_id):
					if (not self.channels.has_key(chan_id)):
						self.channels[chan_id]={}
					self.channels[chan_id]['channel'] = array_value(event, 'Channel')
					self.channels[chan_id]['time'] = time()
					self.channels[chan_id]['channeltype'] = array_value(event, 'Channeltype')
					
			elif (event["Event"] == "Newstate"):
				chan_id = array_value(event, 'Uniqueid')
				
				if (chan_id):
					if (not self.channels.has_key(chan_id)):
						self.channels[chan_id]={}
					self.channels[chan_id]['channel'] = array_value(event, 'Channel')
					self.channels[chan_id]['time'] = time()
					self.channels[chan_id]['cidnum'] = array_value(event, 'CallerIDNum')
					self.channels[chan_id]['cidname'] = array_value(event, 'CallerIDName')
					self.channels[chan_id]['status'] = array_value(event, 'ChannelState', 255, int)
					
			elif (event["Event"] == "NewCallerid"):
				chan_id = array_value(event, 'Uniqueid')
				
				if (chan_id):
					if (not self.channels.has_key(chan_id)):
						self.channels[chan_id]={}
					self.channels[chan_id]['channel'] = array_value(event, 'Channel')
					self.channels[chan_id]['time'] = time()
					self.channels[chan_id]['cidnum'] = array_value(event, 'CallerIDNum')
					self.channels[chan_id]['cidname'] = array_value(event, 'CallerIDName')
					
			elif (event["Event"] == "Bridge"):
				chan_id1 = array_value(event, 'Uniqueid1')
				chan_id2 = array_value(event, 'Uniqueid2')
				
				if (chan_id1 and chan_id2):
					if (not self.channels.has_key(chan_id1)):
						self.channels[chan_id1]={}
					self.channels[chan_id1]['channel'] = array_value(event, 'Channel1')
					self.channels[chan_id1]['time'] = time()
					self.channels[chan_id1]['cidnum'] = array_value(event, 'CallerID1')
					self.channels[chan_id1]['bridgestate'] = array_value(event, 'Bridgestate')
					self.channels[chan_id1]['bridgetype'] = array_value(event, 'Bridgetype')
					self.channels[chan_id1]['bridgechannel'] = array_value(event, 'Channel2')
					self.channels[chan_id1]['bridgechanid'] = chan_id2
					
					if (not self.channels.has_key(chan_id2)):
						self.channels[chan_id2]={}
					self.channels[chan_id2]['channel'] = array_value(event, 'Channel2')
					self.channels[chan_id2]['time'] = time()
					self.channels[chan_id2]['cidnum'] = array_value(event, 'CallerID2')
					self.channels[chan_id2]['bridgestate'] = array_value(event, 'Bridgestate')
					self.channels[chan_id2]['bridgetype'] = array_value(event, 'Bridgetype')
					self.channels[chan_id2]['bridgechannel'] = array_value(event, 'Channel1')
					self.channels[chan_id2]['bridgechanid'] = chan_id1
					
			elif (event["Event"] == "Hangup"):
				channelinfo = {}
				chan_id = array_value(event, 'Uniqueid')
				
				channelinfo['channel'] = array_value(event, 'Channel')
				channelinfo['status'] = array_value(event, 'ChannelState', 255, int)
				channelinfo['time'] = time()
				channelinfo['cidnum'] = array_value(event, 'CallerIDNum')
				channelinfo['cidname'] = array_value(event, 'CallerIDName')
				channelinfo['cause'] = array_value(event, 'Cause', 255, int)
				
				if (chan_id):
					self.channels[chan_id]=channelinfo
					
					try:
						del(self.channels[chan_id])
					except:
						lwarn('channel id "%s" not in list' % chan_id);

			if (push_event):
				self.push_event(push_event)
			
		ldebug('closing asterisk handler thread')

	def stop(self):
		self.runthread = False
Exemple #39
0
    def display(self):
        del self.texts[2:]
        TOP = self.texts[1][1].top + 35

        format_string = "{rank:>4d} | {name:20s} | {matches_played:>14d} | {wins:>4d} | {losses:>6d} | {point_diff:>16d} | {win_per:>14.2f}"
        for index, leader in enumerate(self.leaderboard.get_top_number(10)):
            res = SMALL.render(
                format_string.format(**dict(
                    zip(("rank", "name", "matches_played", "wins", "losses",
                         "point_diff", "win_per"), leader))), True, BLACK)
            res_rect = res.get_rect()
            res_rect.top = TOP + 35 * index
            res_rect.centerx = HALF_WIDTH
            self.texts.append((res, res_rect))

        super(LeaderBoardPage, self).display()


if __name__ == '__main__':
    from properties import SCREEN_HEIGHT, SCREEN_WIDTH
    from eventmanager import EventManager
    c = pygame.time.Clock()
    s = pygame.display.set_mode((SCREEN_WIDTH, SCREEN_HEIGHT))
    e = EventManager()
    l = LeaderBoardPage(s, e)
    l.display()
    while True:
        e.run()
        c.tick(30)
import sys
import datetime

sys.path.insert(0, os.path.join(os.getcwd(), os.pardir) )

from eventmanager import EventManager
from events import Event

def parse_time(s):
    return datetime.datetime.strptime(s,'%Y-%m-%d %H:%M:%S')

EVENTS = [ Event({'_id':1, 'anon_screen_name':'A', 'time':parse_time('2013-11-10 06:00:00')}),
           Event({'_id':2, 'anon_screen_name':'B', 'time':parse_time('2013-11-10 06:00:00')}),
           Event({'_id':3, 'anon_screen_name':'A', 'time':parse_time('2013-11-10 06:05:00')}),
           Event({'_id':4, 'anon_screen_name':'B', 'time':parse_time('2013-11-10 06:10:00')}),
           Event({'_id':5, 'anon_screen_name':'A', 'time':parse_time('2013-11-10 06:10:00')})]


if __name__ == '__main__':
    manager = EventManager()
    for event in EVENTS:
        e = manager.stage_event(event)
        if e:
            print ','.join([e['_id'], e['anon_screen_name'], str(e.duration)]) 
        

# Expected output is:
#  1,A,5
#  2,B,10
#  3,A,5
Exemple #41
0
class AsteriskManager(Thread):
    def __init__(self):
        Thread.__init__(self)
        self.daemon = True
        self.host = None
        self.port = None
        self.user = None
        self.password = None
        self.runthread = True
        self.sendlock = False
        self.pluginlist = None
        self.em = EventManager()

    def config(self, conf):
        self.host = array_value(conf, ('asterisk', 'address'), '127.0.0.1')
        self.port = array_value(conf, ('asterisk', 'port'), 5038, int)
        self.user = array_value(conf, ('asterisk', 'user'), '')
        self.password = array_value(conf, ('asterisk', 'password'), '')

        return True

    def plugins(self, plugins):
        self.pluginlist = plugins
        self.em.plugins(plugins)

    def addevent(self, event):
        return self.em.add_handler_event(event, 1)

    def to_array(self, event):
        event_array = {}

        for line in event:
            keyword, delimeter, value = line.partition(": ")
            if (keyword):
                event_array[keyword] = value
        return event_array

    def send(self, send_string, blocking=True):
        if (blocking):
            while self.sendlock:
                sleep(0.1)

        self.sendlock = True

        try:
            self.mgsocket.send(send_string)
            self.sendlock = False
            return True

        except:
            self.sendlock = False
            return False

    def login(self, host, port, user, password):
        s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

        try:
            s.connect((host, port))
        except:
            return False

        send_string = "Action: Login\r\nUsername: %s\r\nSecret: %s\r\nEvents: on\r\n\r\n" % (
            user, password)

        s.settimeout(1)

        try:
            s.send(send_string)
        except:
            return False

        return s

    def run(self):
        ldebug('starting asterisk manager thread')

        while self.runthread:

            self.mgsocket = self.login(self.host, self.port, self.user,
                                       self.password)

            if (self.mgsocket == False):
                lerror('failed to open asterisk manager connection to %s:%d' %
                       (self.host, self.port))
                if (self.runthread):
                    sleep(1)
                continue

            ldebug('opening asterisk manager connection to %s:%d' %
                   (self.host, self.port))
            while self.runthread:

                try:
                    data = self.mgsocket.recv(65634)
                    timeout = False
                except:
                    timeout = True

                if (timeout):
                    continue

                events = data.split("\r\n\r\n")

                for event_line in events:
                    if (not event_line):
                        continue
                    event = event_line.splitlines()
                    event_array = self.to_array(event)

                    self.addevent(event_array)

                if not data:
                    break

            if (self.runthread):
                ldebug('lost connection to manager')
                sleep(1)
            if (self.mgsocket):
                self.mgsocket.close()

        ldebug('closing asterisk manager thread')

    def stop(self):
        self.runthread = False
Exemple #42
0
class Middle:
    """It handles the input, keeps track of time and draws objects to
    the screen.
    """

    @staticmethod
    def restore():
        """things to before shutdown"""
        System.restorescreen()


            
    def draw_minions(self):
        """Draws minions to screen."""
        for minion in self.logic.minions:
            self.system.draw_at(minion.pos.to_int(), 'o', 
                self.system.COLOR_BLACK, self.system.COLOR_YELLOW)

    def draw_bullets(self):
        """Draws bullets to screen."""
        for bullet in self.logic.bullets:
            if self.logic.current_level.tiles[int(bullet.pos.x), int(bullet.pos.y)] == 0:
                self.system.draw_at(bullet.pos.to_int(), '*', 
                    self.system.COLOR_BLACK, self.system.COLOR_GREEN)
            else:
                self.system.draw_at(bullet.pos.to_int(), '*', 
                    self.system.COLOR_BLACK, self.system.COLOR_YELLOW)

    def draw_towers(self):
        """Draws towers to screen."""
        for tower in self.logic.towers:
            self.system.draw_at(tower.pos.to_int(), '#', 
                self.system.COLOR_BLACK, self.system.COLOR_GREEN)

    def draw_map(self):
        """Draws map to screen."""
        for x in range(1, self.logic.current_level.max_x + 1):
            for y in range(1, self.logic.current_level.max_y + 1):
                if self.logic.current_level.tiles[x, y] == 0:
                    self.system.draw_at(Vector(x, y), ' ', 
                        self.system.COLOR_GREEN, self.system.COLOR_GREEN)
                else:
                    self.system.draw_at(Vector(x, y), ' ', 
                        self.system.COLOR_YELLOW, self.system.COLOR_YELLOW)
                        
    def draw_hud(self):
        """draws hud to screen"""
        self.windows['lives'].label = "lives:  %03d" % self.logic.lives
        self.windows['points'].label = "points: %03d" % self.logic.points
        self.windows['money'].label = "money:  %03d" % self.logic.money

    def load_map(self, file_name):
        """Loads map from xml file"""
        map_xml = minidom.parse(file_name)

        map_tag = map_xml.getElementsByTagName('map')[0]

        def get_data(elem, tag):
            return elem.getElementsByTagName(tag)[0].firstChild.data

        level = Level()
        level.max_y = int(get_data(map_tag, 'rows'))
        level.max_x = int(get_data(map_tag,'columns'))

        row_tag = map_xml.getElementsByTagName('row')

        for row in row_tag:
            row_data = row.firstChild.data
            y = int(row.attributes['pos'].value)
            for x in range(1, len(row_data)+1):
                level.tiles[x, y] = int(row_data[x-1])

        for waypoint in map_xml.getElementsByTagName('waypoint'):    
            number = int( waypoint.attributes['nr'].value )
            x = int( get_data(waypoint,'x'))
            y = int( get_data(waypoint,'y'))

            level.waypoints[number] = Vector(x, y)

        for wave in map_xml.getElementsByTagName('wave'):    
            w = Wave()
            w.offset_wave = int( get_data(wave, 'offset_wave'))
            w.offset_minion = int( get_data(wave, 'offset_minion'))
            w.hp_minion = int( get_data(wave, 'hp_minion'))
            w.nr_minion = int( get_data(wave, 'nr_minion'))

            level.waves.append(w)
            
        level.next_wave = level.waves[0]
        level.waves.remove(level.next_wave)        

        self.logic.current_level = level

    def Notify(self, event):
        if isinstance( event, KeyPressEvent ):
            if event.key == 'q': 
                self.evm.Post(QuitEvent())
            if event.key == 'a':
                self.logic.add_minion()
            if event.key == ' ':
                self.logic.current_level.send_next_wave()
                
        elif isinstance( event, MouseClickEvent ):
            self.logic.add_tower(event.pos.x, event.pos.y)
        elif isinstance( event, TickEvent ):
            self.evm.Send(ClearScreenEvent())
            self.draw_map()
            self.draw_minions()
            self.draw_towers()
            self.draw_bullets()
            self.draw_hud()
            
            self.wc.draw_widgets(self.main_window)

            if self.logic.current_level.next_wave and len(self.logic.current_level.active_waves) < len(self.wave_windows):
                self.wave_windows[len(self.logic.current_level.active_waves)].set_time(self.logic.current_level.next_wave.offset_wave)


        elif isinstance( event, WaveChangeEvent ):
            wavelist = []
            wavelist.extend(self.logic.current_level.active_waves)
            if self.logic.current_level.next_wave:
                wavelist.append(self.logic.current_level.next_wave)
            wavelist.extend(self.logic.current_level.waves)
            
            for i in range(0, min(len(self.wave_windows), len(wavelist))):
                wave = wavelist[i]
                window = self.wave_windows[i]
                window.set_nr(wave.nr_minion)
                window.border_bold = False
                window.show_time(False)

            for i in range(min(len(self.wave_windows), len(wavelist)),len(self.wave_windows)):
                self.wave_windows[i].show = False
                
            if self.logic.current_level.next_wave and len(self.logic.current_level.active_waves) < len(self.wave_windows):
                self.wave_windows[len(self.logic.current_level.active_waves)].border_bold = True
                self.wave_windows[len(self.logic.current_level.active_waves)].show_time(True)

    def __init__(self):

        from optparse import OptionParser
        parser = OptionParser(version="%prog 0.1.1")
        parser.add_option('-r', '--replay', 
                            dest='infile',
                            help='uses the recorded input instead of the user input')
        parser.add_option('-d', '--dump', 
                            dest='outfile',
                            help='writes the user input into a file')
        (options, args) = parser.parse_args()
        
        self.evm = EventManager()
        
        self.evm.RegisterListener(self)

        if options.infile:
            self.te = InputPlayer(self.evm, options.infile)
        else:
            self.te = TickEmitter(self.evm)
        
        self.system = System(self.evm)
        self.logic = Logic(self.evm)
        
        if options.outfile:
            self.input_recorder = InputRecorder(self.evm, options.outfile)
        
        self.load_map('map2.xml')
        
        #########################################
        ## create windows
        #########################################
        
        self.main_window = Widget(0,0,110,27)
        self.window = Widget(84,1,25,25)

        self.windows = {}

        self.windows['lives'] = Widget(1,1,23,3)
        self.windows['money'] = Widget(1,4,23,3)
        self.windows['points'] = Widget(1,7,23,3)

        for w in self.windows.values():
            self.window.add_child(w)
            
        self.main_window.add_child(self.window)

        self.wave_window = Widget(58,1,25,25)
        self.main_window.add_child(self.wave_window)
        
        wave_label = Widget(1,1,23,1)
        wave_label.label = 'Waves'
        wave_label.border = False
        self.wave_window.add_child(wave_label)

        self.wave_windows = []
        for i in range(0,4):
            w = WaveWidget(1,2 + i * 5, 23, 5)
            self.wave_windows.append(w)
            self.wave_window.add_child(w)
            
        self.wc = WidgetController(self.evm,self.system)
        
        help_window = Widget(1,22,56,4)

        help_window1 = Widget(0,1,56,1)
        help_window1.label = "Press space to send next wave. Hit q to quit the game."
        help_window1.border = False
        help_window.add_child(help_window1)

        help_window2 = Widget(0,2,56,1)
        help_window2.label = "Click anywhere on the map to place a tower."
        help_window2.border = False
        help_window.add_child(help_window2)
        
        self.main_window.add_child(help_window)

    def run(self):
        """The main game loop"""
        self.te.Run()

        # restore original settings
        self.system.restorescreen()
class NetServer(Thread):

	def __init__(self, port=None, address=None):
		Thread.__init__(self)
		self.daemon = True
		self.runthread = True
		self.port = port
		self.address = address
		self.pluginlist = None
		self.clients = {}
		self.event_subscriptions = {}
		self.em = EventManager()
		
	def config(self, conf):
		if (not conf.has_key('netserver')):
			return False
		if (not conf['netserver'].has_key('address')):
			return False
		if (not conf['netserver'].has_key('port')):
			return False
		if (not conf['netserver'].has_key('accept')):
			conf['netserver']['accept'] = '0.0.0.0/0'
		if (not conf['netserver'].has_key('reject')):
			conf['netserver']['reject'] = '0.0.0.0/32'
		if (not conf['netserver'].has_key('allow')):
			conf['netserver']['allow'] = '0.0.0.0/32'
		self.address = conf['netserver']['address']
		self.port = conf['netserver']['port']
		self.net_accept = {}
		self.net_reject = {}
		self.net_allow = {}

		ipcalc = IPCalc()
		
		for network_str in conf['netserver']['accept'].split(','):
			network, bitmask = ipcalc.netsplit(network_str)
			self.net_accept[network] = bitmask;

		for network_str in conf['netserver']['reject'].split(','):
			network, bitmask = ipcalc.netsplit(network_str)
			self.net_reject[network] = bitmask;
	
		for network_str in conf['netserver']['allow'].split(','):
			network, bitmask = ipcalc.netsplit(network_str)
			self.net_allow[network] = bitmask;
		
		return True

	def plugins(self, plugins):
		self.pluginlist = plugins
		self.em.plugins(plugins)
		
	def add_event(self, event):
		if (not self.event_subscriptions.has_key(event['type'])):
			return False

		for client in self.event_subscriptions[event['type']]:
			try:
				self.clients[client]['thread'].add_event(event)
			except:
				lerror('unable to pass event to client thread')

	def run(self):
		listen = NetSocket(self.port, self.address)
		
		serversocket = listen.listen()
		if (not serversocket):
			lerror('cannot start server process')
			return 1
		
		ret = self.em.add_event_handler('NetServer', 2)
		ipcalc = IPCalc()
		while (self.runthread):
			try:
				clientsocket, address = serversocket.accept()

			except socket.error, serror:
				lerror('socket error (%d): %s ' % (serror[0], serror[1]))
				continue
			except:
Exemple #44
0
class Bot:
    """
    Mainclass for the application, everything goes through here
    """

    def __init__(self):
        logutils.setup_logging("mustikkabot")
        self.log = logging.getLogger("mustikkabot")

        self.basepath = tools.find_basepath()
        self.confdir = os.path.join(self.basepath, "config")
        self.datadir = os.path.join(self.basepath, "data")
        self.srcdir = os.path.join(self.basepath, "src")

        setup.setup(self)
        setup.do_migrations(self)

        self.ircsock = None
        self.lastReceived = None

        self.user = None
        self.channel = None

        self.eventmanager = EventManager()
        """ :type: EventManager"""
        self.modulemanager = ModuleManager()
        """ :type: ModuleManager"""
        self.accessmanager = AccessManager()
        """ :type: AccessManager"""
        self.timemanager = TimeManager()
        """ :type: TimeManager"""

        self.run = True

    def parse_config(self):
        """
        :return: list of strings describing parameters
        :rtype: list(string, string, string, string)

        Parse the config file, and read the different defined parameters. Return them as a list
        """
        try:
            settings_f = open(os.path.join(self.confdir, "config.txt"))
        except IOError:
            self.log.error("Config not found, please make a copy of"
                           " \"config/config.txt.template\" as \"config/config.txt\"")
            sys.exit()

        host = None
        username = None
        password = None
        channel = None

        try:
            for line in settings_f:
                line = line.strip("\n\r")
                if line.find('host') != -1:
                    host = line.split(":")[1]
                if line.find('user') != -1:
                    username = line.split(":")[1]
                if line.find('pass') != -1:
                    password = '******'.join(line.split(":")[1:])
                if line.find('chnl') != -1:
                    channel = line.split(":")[1]
        except IndexError:
            self.log.error("Malformed config file, please fix")
            sys.exit()

        settings_f.close()

        passwd_hidden = ""

        for c in password:            # Hide auth token/password from log messages
            passwd_hidden += '*'

        self.log.info("PARAMETERS: Host: %s, username: %s, password: %s, channel: %s" %
                      (host, username, passwd_hidden, channel))

        return host, username, password, channel

    def connect(self, params):
        """
        :param params: A list of the params to be used to connect
        :type params: list(string, string, string, string)

        Try to connect to the IRC server using the provided parameters
        """
        try:
            self.ircsock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
            self.ircsock.settimeout(30)

            self.ircsock.connect((params[0], 6667))

            self.ircsock.setblocking(0)

            self.send_data("PASS %s" % (params[2]), dontLog=True)
            self.send_data("NICK %s" % (params[1]))
            self.send_data("USER %s mustikkaBot 127.0.0.1 :mustikkaBot" % (params[1]))
            self.send_data("JOIN %s" % (params[3]))
        except Exception as e:
            traceback.print_exc()

            self.log.error("\n\nError connecting: %s" % e)
            sys.exit()

    def get_data(self):
        """
        :return: Data received from the socket
        :rtype: str

        Return any data that has been received
        """

        try:
            data = self.ircsock.recv(1024)
            data = data.decode("utf-8", "replace").strip('\r\n')
            if not len(data) == 0:
                self.log.debug("RECV: <>" + data + "<>")
            return data
        except socket.error as e:
            err = e.args[0]
            if err == errno.EAGAIN or err == errno.EWOULDBLOCK:
                return ""  # no data

    def send_data(self, data, dontLog=False):
        """
        :param data: String to be sent
        :type data: str
        :param dontLog: Will the string be logged?
        :type dontLog: bool

        Send data appended with a newline
        """
        if not (data is "" or data is None):
            if not dontLog:
                self.log.debug("SEND: " + data)
            self.ircsock.send(bytes(data + "\n", "UTF-8"))

    def send_message(self, msg):
        """
        :param msg: Message to be sent
        :type msg: str

        Send a message to the channel
        """
        self.send_data("PRIVMSG " + self.channel + " :" + msg)

    def sigint(self, signal, frame):
        """
        :param signal: Signal received
        :param frame: ...

        A signal handler to trap ^C
        """
        self.log.info("^C received, stopping")
        self.run = False

    def main(self):
        """
        The startpoint of the bot
        """
        settings = self.parse_config()

        self.user = settings[1]
        self.channel = settings[3]

        self.accessmanager.init(self)
        self.modulemanager.init(self)

        try:
            self.connect(settings)
            self.lastReceived = datetime.datetime.now()
        except:
            self.log.error("Error connecting to IRC")
            sleep(3)

        signal.signal(signal.SIGINT, self.sigint)

        sleep(1)

        while self.run:
            # Get new data
            ircmsg = self.get_data()

            # Process CLI
            if platform.system() != "Windows":
                cli = select.select([sys.stdin], [], [], 0)[0]
            else:
                cli = False         # No cli on windows because you can't select stdin
            if cli:
                data = sys.stdin.readline().strip()
                if len(data) > 0:
                    self.eventmanager.handle_message(":cli!cli@localhost PRIVMSG " + self.channel + " :" + data)

            # Handle data if received
            if not (ircmsg is None or len(ircmsg) == 0):
                for line in ircmsg.split('\n'):
                    self.lastReceived = datetime.datetime.now()
                    if line.find(' PRIVMSG ') != -1:
                        self.eventmanager.handle_message(line)
                    else:
                        self.eventmanager.handle_special(line)

            # Provied timed events to timemanager
            self.timemanager.handle_events()

            # Check "watchdog"
            if self.lastReceived and datetime.datetime.now() - self.lastReceived > datetime.timedelta(minutes=15):
                self.log.warning("No messages received within 15 minutesr, trying to reconnect")
                try:
                    self.connect(settings)  # Reconnect
                    self.lastReceived = datetime.datetime.now()
                except:
                    self.log.error("Error connecting to IRC")
                    sleep(3)

            sleep(0.01)

        # Shut down
        self.modulemanager.dispose()
        self.accessmanager.dispose()
Exemple #45
0
class AsteriskManager(Thread):

	def __init__(self):
		Thread.__init__(self)
		self.daemon = True
		self.host = None
		self.port = None
		self.user = None
		self.password = None
		self.runthread = True
		self.sendlock = False
		self.pluginlist = None 
		self.em = EventManager()

	def config(self, conf):
		self.host = array_value(conf, ('asterisk','address'), '127.0.0.1')
		self.port = array_value(conf, ('asterisk','port'), 5038, int)
		self.user = array_value(conf, ('asterisk','user'), '')
		self.password = array_value(conf, ('asterisk','password'), '')

		return True
		
	def plugins(self, plugins):
		self.pluginlist = plugins
		self.em.plugins(plugins)

	def addevent(self, event):
		return self.em.add_handler_event(event, 1)

	def to_array(self, event):
		event_array = {}

		for line in event:
			keyword, delimeter, value = line.partition(": ")
			if (keyword):
				event_array[keyword] = value
		return event_array

	def send(self, send_string, blocking = True):
		if (blocking):
			while self.sendlock:
				sleep(0.1)

		self.sendlock = True

		try:
			self.mgsocket.send(send_string)
			self.sendlock = False
			return True

		except:
			self.sendlock = False
			return False

	def login(self, host, port, user, password):
		s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
		
		try:
			s.connect((host, port))
		except:
			return False

		send_string = "Action: Login\r\nUsername: %s\r\nSecret: %s\r\nEvents: on\r\n\r\n" % (user, password)

		s.settimeout(1)

		try:
			s.send(send_string)
		except:
			return False
			
		return s

	def run (self):
		ldebug('starting asterisk manager thread')
		
		while self.runthread:
			
			self.mgsocket = self.login(self.host, self.port, self.user, self.password)

			if (self.mgsocket == False):
				lerror('failed to open asterisk manager connection to %s:%d' % (self.host, self.port))
				if (self.runthread):
					sleep(1)
				continue
				
			ldebug('opening asterisk manager connection to %s:%d'  % (self.host, self.port))
			while self.runthread:

				try:
					data = self.mgsocket.recv(65634)
					timeout = False
				except:
					timeout = True

				if (timeout):
					continue


				events = data.split("\r\n\r\n")

				for event_line in events:
					if (not event_line):
						continue
					event = event_line.splitlines()
					event_array = self.to_array(event)

					self.addevent(event_array)

				if not data:
					break
			
			if (self.runthread):
				ldebug('lost connection to manager')
				sleep(1)
			if (self.mgsocket):
				self.mgsocket.close()

		ldebug('closing asterisk manager thread')

	def stop(self):
		self.runthread = False
Exemple #46
0
    def test_empty_event_queue(self):
        event_manager = EventManager([]);

        # No exception should be raised here
        event_manager.process_events()
Exemple #47
0
    def __init__(self):
        self.verbose = False
        self.visual_debug = False

        # Llama Stuff
        self.llama_controller = LlamaControler()

        # Control Stuff
        self.want_to_expand = False
        self.researched_warpgate = False

        # Attack stuff
        self.army_manager = ArmyManager(bot=self)
        self.attack_target = None
        self.units_available_for_attack = {
            ZEALOT: 'ZEALOT',
            STALKER: 'STALKER'
        }
        self.minimum_army_size = 15

        # Defense stuff
        self.threat_proximity = 20
        self.defending_units = {}
        self.defend_around = [PYLON, NEXUS]

        # Threat stuff stuff
        self.defending_from = {}

        # Scout stuff
        self.scouting_units = set()
        self.number_of_scouting_units = 3
        self.scout_interval = 30  # Seconds
        self.scout_timer = 0
        self.map_size = None

        # Expansion and macro stuff
        self.auto_expand_after = 300  # 5 Minutes
        self.auto_expand_mineral_threshold = 22  # Should be 2.5 ~ 3 fully saturated bases
        self.maximum_workers = 80
        self.gateways_per_nexus = 2

        # Research stuff
        self.start_forge_after = 180  # seconds - 4min
        self.forge_research_priority = ['ground_weapons', 'shield']

        self.event_manager = EventManager()

        self.upgrades = {
            'ground_weapons': [
                FORGERESEARCH_PROTOSSGROUNDWEAPONSLEVEL1,
                FORGERESEARCH_PROTOSSGROUNDWEAPONSLEVEL2,
                FORGERESEARCH_PROTOSSGROUNDWEAPONSLEVEL3
            ],
            'ground_armor': [
                FORGERESEARCH_PROTOSSGROUNDARMORLEVEL1,
                FORGERESEARCH_PROTOSSGROUNDARMORLEVEL2,
                FORGERESEARCH_PROTOSSGROUNDARMORLEVEL3
            ],
            'shield': [
                FORGERESEARCH_PROTOSSSHIELDSLEVEL1,
                FORGERESEARCH_PROTOSSSHIELDSLEVEL2,
                FORGERESEARCH_PROTOSSSHIELDSLEVEL3
            ]
        }

        self.upgrade_names = {
            FORGERESEARCH_PROTOSSGROUNDWEAPONSLEVEL1: 'GROUND WEAPONS 1',
            FORGERESEARCH_PROTOSSGROUNDWEAPONSLEVEL2: 'GROUND WEAPONS 2',
            FORGERESEARCH_PROTOSSGROUNDWEAPONSLEVEL3: 'GROUND WEAPONS 2',
            FORGERESEARCH_PROTOSSGROUNDARMORLEVEL1: 'GROUND ARMOR 2',
            FORGERESEARCH_PROTOSSGROUNDARMORLEVEL2: 'GROUND ARMOR 2',
            FORGERESEARCH_PROTOSSGROUNDARMORLEVEL3: 'GROUND ARMOR 2',
            FORGERESEARCH_PROTOSSSHIELDSLEVEL1: 'SHIELDS 1',
            FORGERESEARCH_PROTOSSSHIELDSLEVEL2: 'SHIELDS 2',
            FORGERESEARCH_PROTOSSSHIELDSLEVEL3: 'SHIELDS 3'
        }
Exemple #48
0
        'time': parse_time('2013-11-10 06:00:00')
    }),
    Event({
        '_id': 3,
        'anon_screen_name': 'A',
        'time': parse_time('2013-11-10 06:05:00')
    }),
    Event({
        '_id': 4,
        'anon_screen_name': 'B',
        'time': parse_time('2013-11-10 06:10:00')
    }),
    Event({
        '_id': 5,
        'anon_screen_name': 'A',
        'time': parse_time('2013-11-10 06:10:00')
    })
]

if __name__ == '__main__':
    manager = EventManager()
    for event in EVENTS:
        e = manager.stage_event(event)
        if e:
            print ','.join([e['_id'], e['anon_screen_name'], str(e.duration)])

# Expected output is:
#  1,A,5
#  2,B,10
#  3,A,5
Exemple #49
0
    def __init__(self):

        from optparse import OptionParser
        parser = OptionParser(version="%prog 0.1.1")
        parser.add_option('-r', '--replay', 
                            dest='infile',
                            help='uses the recorded input instead of the user input')
        parser.add_option('-d', '--dump', 
                            dest='outfile',
                            help='writes the user input into a file')
        (options, args) = parser.parse_args()
        
        self.evm = EventManager()
        
        self.evm.RegisterListener(self)

        if options.infile:
            self.te = InputPlayer(self.evm, options.infile)
        else:
            self.te = TickEmitter(self.evm)
        
        self.system = System(self.evm)
        self.logic = Logic(self.evm)
        
        if options.outfile:
            self.input_recorder = InputRecorder(self.evm, options.outfile)
        
        self.load_map('map2.xml')
        
        #########################################
        ## create windows
        #########################################
        
        self.main_window = Widget(0,0,110,27)
        self.window = Widget(84,1,25,25)

        self.windows = {}

        self.windows['lives'] = Widget(1,1,23,3)
        self.windows['money'] = Widget(1,4,23,3)
        self.windows['points'] = Widget(1,7,23,3)

        for w in self.windows.values():
            self.window.add_child(w)
            
        self.main_window.add_child(self.window)

        self.wave_window = Widget(58,1,25,25)
        self.main_window.add_child(self.wave_window)
        
        wave_label = Widget(1,1,23,1)
        wave_label.label = 'Waves'
        wave_label.border = False
        self.wave_window.add_child(wave_label)

        self.wave_windows = []
        for i in range(0,4):
            w = WaveWidget(1,2 + i * 5, 23, 5)
            self.wave_windows.append(w)
            self.wave_window.add_child(w)
            
        self.wc = WidgetController(self.evm,self.system)
        
        help_window = Widget(1,22,56,4)

        help_window1 = Widget(0,1,56,1)
        help_window1.label = "Press space to send next wave. Hit q to quit the game."
        help_window1.border = False
        help_window.add_child(help_window1)

        help_window2 = Widget(0,2,56,1)
        help_window2.label = "Click anywhere on the map to place a tower."
        help_window2.border = False
        help_window.add_child(help_window2)
        
        self.main_window.add_child(help_window)