Example #1
0
    def execute(self, message, user, params):

        chan = params.group(1)
        access = params.group(2)
        if not access.isdigit():
            try:
                access = Config.getint("Access", access)
            except Exception:
                message.reply("Invalid access level '%s'" % (access,))
                return
        else:
            access = int(access)

        if access > user.access:
            message.reply("You may not add a user with higher access to your own")
            return

        try:
            session.add(Channel(name=chan, userlevel=access, maxlevel=user.access))
            session.commit()
            message.reply("Added chan %s at level %s" % (chan, access))
            message.privmsg("set %s autoinvite on" % (chan,), Config.get("Services", "nick"))
            message.privmsg("invite %s" % (chan,), Config.get("Services", "nick"))
        except IntegrityError:
            session.rollback()
            message.reply("Channel %s already exists" % (chan,))
Example #2
0
    def parse_N(self, scan_id, scan, page):
        #incoming fleets
        #<td class=left valign=top>Incoming</td><td valign=top>851</td><td class=left valign=top>We have detected an open jumpgate from Tertiary, located at 18:5:11. The fleet will approach our system in tick 855 and appears to have roughly 95 ships.</td>
        for m in re.finditer('<td class="left" valign="top">Incoming</td><td valign="top">(\d+)</td><td class="left" valign="top">We have detected an open jumpgate from ([^<]+), located at (\d+):(\d+):(\d+). The fleet will approach our system in tick (\d+) and appears to have roughly (\d+) ships.</td>', page):
            fleetscan = FleetScan()

            newstick = m.group(1)
            fleetname = m.group(2)
            originx = m.group(3)
            originy = m.group(4)
            originz = m.group(5)
            arrivaltick = int(m.group(6))
            numships = m.group(7)

            fleetscan.mission = "Unknown"
            fleetscan.fleet_name = fleetname
            fleetscan.launch_tick = newstick
            fleetscan.landing_tick = arrivaltick
            fleetscan.fleet_size = numships

            owner=Planet.load(originx,originy,originz)
            if owner is None:
                continue
            fleetscan.owner = owner
            fleetscan.target = scan.planet
            try:
                scan.fleets.append(fleetscan)
                session.commit()
            except Exception, e:
                session.rollback()
                print "Exception in news: "+e.__str__()
                traceback.print_exc()
                continue

            print 'Incoming: ' + newstick + ':' + fleetname + '-' + originx + ':' + originy + ':' + originz + '-' + arrivaltick + '|' + numships
Example #3
0
 def scan(self, uid, pa_id, gid=None):
     page = urlopen(Config.get("URL","viewscan")%(pa_id,)).read()
     page = decode(page)
     
     m = re.search('>([^>]+) on (\d+)\:(\d+)\:(\d+) in tick (\d+)', page)
     if not m:
         print "Expired/non-matchinng scan (id: %s)" %(pa_id,)
         return
     
     scantype = m.group(1)[0].upper()
     x = int(m.group(2))
     y = int(m.group(3))
     z = int(m.group(4))
     tick = int(m.group(5))
     
     planet = Planet.load(x,y,z)
     if planet is None:
         return
     try:
         scan = Scan(pa_id=pa_id, scantype=scantype, tick=tick, group_id=gid, scanner_id=uid)
         planet.scans.append(scan)
         session.commit()
         scan_id = scan.id
     except IntegrityError, e:
         session.rollback()
         print "Scan %s may already exist" %(pa_id,)
         print e.__str__()
         return
Example #4
0
 def execute(self, request, user, id, x, y, z, when):
     planet = Planet.load(x,y,z)
     if planet is None:
         return self.attack(request, user, id, "No planet with coords %s:%s:%s" %(x,y,z,))
     
     tick = Updates.current_tick()
     when = int(when)
     if when < PA.getint("numbers", "protection"):
         eta = when
         when += tick
     elif when <= tick:
         return self.attack(request, user, id, "Can not book targets in the past. You wanted tick %s, but current tick is %s." % (when, tick,))
     else:
         eta = when - tick
     if when > 32767:
         when = 32767        
     
     if planet.intel and planet.alliance and planet.alliance.name == Config.get("Alliance","name"):
         return self.attack(request, user, id, "%s:%s:%s is %s in %s. Quick, launch before they notice!" % (x,y,z, planet.intel.nick or 'someone', Config.get("Alliance","name"),))
     
     try:
         planet.bookings.append(Target(user=user, tick=when))
         session.commit()
     except IntegrityError:
         session.rollback()
         target = planet.bookings.filter(Target.tick == when).first()
         if target is not None:
             return self.attack(request, user, id, "Target %s:%s:%s is already booked for landing tick %s by user %s" % (x,y,z, when, target.user.name,))
     else:
         return self.attack(request, user, id, "Booked landing on %s:%s:%s tick %s (eta %s) for user %s" % (x,y,z, when, (when-tick), user.name,))
     
     return self.attack(request, user, id)
Example #5
0
    def execute(self, page, uid, pa_id, gid=None):
        scanlog("Scan: %s (group: %s)" %(pa_id,gid,))
        page = decode(page)
        
        m = re.search('>([^>]+) on (\d+)\:(\d+)\:(\d+) in tick (\d+)', page)
        if not m:
            scanlog("Expired/non-matchinng scan (id: %s)" %(pa_id,))
            return
        
        scantype = m.group(1)[0].upper()
        x = int(m.group(2))
        y = int(m.group(3))
        z = int(m.group(4))
        tick = int(m.group(5))

        m = re.search("<p class=\"right scan_time\">Scan time: ([^<]*)</p>", page)
        scantime = m.group(1)
        
        planet = Planet.load(x,y,z,)

        try:
            Q = session.query(Scan).filter(Scan.pa_id == pa_id).filter(Scan.planet_id == None)
            if Q.count() > 0:
                scan = Q.first()
            else:
                scan = Scan(pa_id=pa_id, scantype=scantype, tick=tick, time=scantime, group_id=gid, scanner_id=uid)
                session.add(scan)
            if planet:
                planet.scans.append(scan)
            session.commit()
            scan_id = scan.id
        except IntegrityError, e:
            session.rollback()
            scanlog("Scan %s may already exist: %s" %(pa_id,str(e),))
            return
Example #6
0
 def execute(self, message, user, params):
     
     chan = params.group(1)
     access = params.group(2)
     if not access.isdigit():
         try:
             access = Config.getint("Access",access)
         except Exception:
             message.reply("Invalid access level '%s'" % (access,))
             return
     else:
         access = int(access)
     
     if access > user.access:
         message.reply("You may not add a user with higher access to your own")
         return
     
     try:
         session.add(Channel(name=chan, userlevel=access, maxlevel=user.access))
         session.commit()
         message.reply("Added chan %s at level %s" % (chan,access,))
         message.privmsg("set %s autoinvite on" %(chan,),Config.get("Services", "nick"));
         message.privmsg("invite %s" %(chan,),Config.get("Services", "nick"));
     except IntegrityError:
         session.rollback()
         message.reply("Channel %s already exists" % (chan,))
Example #7
0
 def execute(self, page, uid, pa_id, gid=None):
     scanlog("Scan: %s (group: %s)" %(pa_id,gid,))
     page = decode(page)
     
     m = re.search('>([^>]+) on (\d+)\:(\d+)\:(\d+) in tick (\d+)', page)
     if not m:
         scanlog("Expired/non-matchinng scan (id: %s)" %(pa_id,))
         return
     
     scantype = m.group(1)[0].upper()
     x = int(m.group(2))
     y = int(m.group(3))
     z = int(m.group(4))
     tick = int(m.group(5))
     
     planet = Planet.load(x,y,z)
     if planet is None:
         return
     try:
         scan = Scan(pa_id=pa_id, scantype=scantype, tick=tick, group_id=gid, scanner_id=uid)
         planet.scans.append(scan)
         session.commit()
         scan_id = scan.id
     except IntegrityError, e:
         session.rollback()
         scanlog("Scan %s may already exist: %s" %(pa_id,str(e),))
         return
Example #8
0
    def __init__(self, message, m):

        scanlog(asctime())
        try:
            pnick = "(%s)" % message.get_pnick()
        except:
            pnick = ""
        scanlog("Galaxy status from %s%s" % (message.get_nick(), pnick))

        target_x=m.group(1)
        target_y=m.group(2)
        target_z=m.group(3)

        owner_x=m.group(4)
        owner_y=m.group(5)
        owner_z=m.group(6)



        mission=m.group(7)
        fleetname=m.group(8)
#        race=m.group(10)
        fleetsize=m.group(11)
        eta=m.group(12)

        if mission == "A":
            mission = "Attack"
        elif mission == "D":
            mission = "Defend"
        elif mission == "R":
            mission = "Return"

        target=Planet.load(target_x,target_y,target_z)
        if target is None:
            return

        owner=Planet.load(owner_x,owner_y,owner_z)
        if owner is None:
            return

        curtick=Updates.current_tick()
        landing_tick = int(eta) + int(curtick)

        scanlog("%s:%s:%s %s:%s:%s '%s' %s %s eta %s" % (owner_x,owner_y,owner_z,target_x,target_y,target_z,fleetname,fleetsize,mission,eta))

        fleet = FleetScan(owner=owner, target=target, fleet_size=fleetsize, fleet_name=fleetname, landing_tick=landing_tick, mission=mission)
        fleet.in_cluster = owner_x == target_x
        fleet.in_galaxy = fleet.in_cluster and owner_y == target_y
        try:
            session.add(fleet)
            session.commit()
        except IntegrityError,e:
            session.rollback()
            print "Exception in galstatus: "+e.__str__()
            scanlog("Exception in galstatus: "+e.__str__())
            traceback.print_exc()
Example #9
0
    def parse_J(self, scan_id, scan, page):
        # <td class=left>Origin</td><td class=left>Mission</td><td>Fleet</td><td>ETA</td><td>Fleetsize</td>
        # <td class=left>13:10:5</td><td class=left>Attack</td><td>Gamma</td><td>5</td><td>265</td>

        #                     <td class="left">15:7:11            </td><td class="left">Defend </td><td>Ad infinitum</td><td>9</td><td>0</td>
        #<tr><td class="left">10:4:9</td><td class="left">Return</td><td>They look thirsty</td><td>5</td><td>3000</td></tr>
        #        <tr><td class="left">4:1:10</td><td class="left">Return</td><td>Or Is It?</td><td>9</td><td>3000</td></tr>

        #<tr><td class="left">10:1:10</td><td class="left">Defend</td><td class="left">Pesticide IV</td><td class="right">1</td><td class="right">0</td></tr>

        for m in re.finditer('<td[^>]*>(?:<a[^>]+>)?(\d+)\:(\d+)\:(\d+)(?:</a>)?[^/]*/[^/]*/td><td[^>]*>([^<]+)</td><td[^>]*>([^<]+)</td><td[^>]*>(\d+)</td><td[^>]*>(\d+(?:,\d{3})*)</td>', page):
            scanlog("%s:%s:%s %s %s %s %s" %m.groups())
            
            fleetscan = FleetScan()

            originx = m.group(1)
            originy = m.group(2)
            originz = m.group(3)
            mission = m.group(4)
            fleet = m.group(5)
            eta = int(m.group(6))
            fleetsize = m.group(7).replace(',', '')

            fleetscan.mission = mission
            fleetscan.fleet_name = fleet
            fleetscan.landing_tick = eta + scan.tick
            fleetscan.fleet_size = fleetsize

            attacker=PlanetHistory.load_planet(originx,originy,originz,scan.tick)
            if attacker is None:
                scanlog("Can't find attacker in db: %s:%s:%s tick: %s"%(originx,originy,originz, scan.tick))
                continue
            fleetscan.owner = attacker
            fleetscan.target = scan.planet
            fleetscan.in_cluster = fleetscan.owner.x == fleetscan.target.x
            fleetscan.in_galaxy = fleetscan.in_cluster and fleetscan.owner.y == fleetscan.target.y

            try:
                scan.fleets.append(fleetscan)
                session.commit()
            except IntegrityError, e:
                session.rollback()
                scanlog("Caught integrity exception in jgp: %s"%(str(e),))
                scanlog("Trying to update instead")
                query = session.query(FleetScan).filter_by(owner=attacker, target=scan.planet, fleet_size=fleetsize, fleet_name=fleet, landing_tick=eta+scan.tick, mission=mission)
                try:
                    query.update({"scan_id": scan_id})
                    session.commit()
                except Exception, e:
                    session.rollback()
                    scanlog("Exception trying to update jgp: %s"%(str(e),), traceback=True)
                    continue
Example #10
0
    def execute(self, page, uid, pa_id, gid=None):
        scanlog("Scan: %s (group: %s)" % (
            pa_id,
            gid,
        ))
        page = decode(page)

        m = re.search('>([^>]+) on (\d+)\:(\d+)\:(\d+) in tick (\d+)', page)
        if not m:
            scanlog("Expired/non-matchinng scan (id: %s)" % (pa_id, ))
            return

        scantype = m.group(1)[0].upper()
        x = int(m.group(2))
        y = int(m.group(3))
        z = int(m.group(4))
        tick = int(m.group(5))

        m = re.search("<p class=\"right scan_time\">Scan time: ([^<]*)</p>",
                      page)
        scantime = m.group(1)

        planet = Planet.load(
            x,
            y,
            z,
        )

        try:
            Q = session.query(Scan).filter(Scan.pa_id == pa_id).filter(
                Scan.planet_id == None)
            if Q.count() > 0:
                scan = Q.first()
            else:
                scan = Scan(pa_id=pa_id,
                            scantype=scantype,
                            tick=tick,
                            time=scantime,
                            group_id=gid,
                            scanner_id=uid)
                session.add(scan)
            if planet:
                planet.scans.append(scan)
            session.commit()
            scan_id = scan.id
        except IntegrityError, e:
            session.rollback()
            scanlog("Scan %s may already exist: %s" % (
                pa_id,
                str(e),
            ))
            return
Example #11
0
    def parse_J(self, scan_id, scan, page):
        # <td class=left>Origin</td><td class=left>Mission</td><td>Fleet</td><td>ETA</td><td>Fleetsize</td>
        # <td class=left>13:10:5</td><td class=left>Attack</td><td>Gamma</td><td>5</td><td>265</td>

        #                     <td class="left">15:7:11            </td><td class="left">Defend </td><td>Ad infinitum</td><td>9</td><td>0</td>
        #<tr><td class="left">10:4:9</td><td class="left">Return</td><td>They look thirsty</td><td>5</td><td>3000</td></tr>
        #        <tr><td class="left">4:1:10</td><td class="left">Return</td><td>Or Is It?</td><td>9</td><td>3000</td></tr>

        #<tr><td class="left">10:1:10</td><td class="left">Defend</td><td class="left">Pesticide IV</td><td class="right">1</td><td class="right">0</td></tr>

        for m in re.finditer('<td[^>]*>(\d+)\:(\d+)\:(\d+)</td><td[^>]*>([^<]+)</td><td[^>]*>([^<]+)</td><td[^>]*>(\d+)</td><td[^>]*>(\d+(?:,\d{3})*)</td>', page):
            fleetscan = FleetScan()

            originx = m.group(1)
            originy = m.group(2)
            originz = m.group(3)
            mission = m.group(4)
            fleet = m.group(5)
            eta = int(m.group(6))
            fleetsize = m.group(7).replace(',', '')

            fleetscan.mission = mission
            fleetscan.fleet_name = fleet
            fleetscan.landing_tick = eta + scan.tick
            fleetscan.fleet_size = fleetsize

            print "JGP fleet "

            attacker=Planet.load(originx,originy,originz)
            if attacker is None:
                print "Can't find attacker in db: %s:%s:%s"%(originx,originy,originz)
                continue
            fleetscan.owner = attacker
            fleetscan.target = scan.planet

            try:
                scan.fleets.append(fleetscan)
                session.commit()
            except IntegrityError, e:
                session.rollback()
                print "Caught integrity exception in jgp: "+e.__str__()
                print "Trying to update instead"
                query = session.query(FleetScan).filter_by(owner=attacker, target=scan.planet, fleet_size=fleetsize, fleet_name=fleet, landing_tick=eta+scan.tick, mission=mission)
                try:
                    query.update({"scan_id": scan_id})
                    session.commit()
                except Exception, e:
                    session.rollback()
                    print "Exception trying to update jgp: "+e.__str__()
                    traceback.print_exc()
                    continue
Example #12
0
    def __init__(self, message, m):

        print m.groups()

        target_x = m.group(1)
        target_y = m.group(2)
        target_z = m.group(3)

        owner_x = m.group(4)
        owner_y = m.group(5)
        owner_z = m.group(6)

        fleetname = m.group(7)
        race = m.group(9)
        fleetsize = m.group(10)
        mission = m.group(11)
        eta = m.group(12)

        print "%s:%s:%s %s:%s:%s '%s' %s m:%s e:%s" % (
            owner_x, owner_y, owner_z, target_x, target_y, target_z, fleetname,
            fleetsize, mission, eta)

        target = Planet.load(target_x, target_y, target_z)
        if target is None:
            return

        owner = Planet.load(owner_x, owner_y, owner_z)
        if owner is None:
            return

        curtick = Updates.current_tick()
        landing_tick = int(eta) + int(curtick)

        fleet = FleetScan(owner=owner,
                          target=target,
                          fleet_size=fleetsize,
                          fleet_name=fleetname,
                          landing_tick=landing_tick,
                          mission=mission)
        fleet.in_cluster = owner_x == target_x
        fleet.in_galaxy = fleet.in_cluster and owner_y == target_y
        try:
            session.add(fleet)
            session.commit()
        except IntegrityError, e:
            session.rollback()
            print "Exception in galstatus: " + e.__str__()
            traceback.print_exc()
Example #13
0
 def execute(self, message, user, params):
     
     chan = params.group(1)
     if "galmate" in Config.options("Access"):
         access = Config.getint("Access","galmate")
     else:
         access = 0
     
     try:
         session.add(Channel(name=chan, userlevel=access, maxlevel=access))
         session.commit()
         message.reply("Added your galchannel as %s (if you didn't add me to the channel with at least access 24 first, I'm never going to bother joining)" % (chan,))
         message.privmsg("set %s autoinvite on" %(chan,),'P');
         message.privmsg("invite %s" %(chan,),'P');
     except IntegrityError:
         session.rollback()
         message.reply("Channel %s already exists" % (chan,))
Example #14
0
    def parse_N(self, scan_id, scan, page):
        #incoming fleets
        #<td class=left valign=top>Incoming</td><td valign=top>851</td><td class=left valign=top>We have detected an open jumpgate from Tertiary, located at 18:5:11. The fleet will approach our system in tick 855 and appears to have roughly 95 ships.</td>
        for m in re.finditer(
                '<td class="left" valign="top">Incoming</td><td valign="top">(\d+)</td><td class="left" valign="top">We have detected an open jumpgate from ([^<]+), located at <a[^>]+>(\d+):(\d+):(\d+)</a>. The fleet will approach our system in tick (\d+) and appears to have (\d+) visible ships.</td>',
                page):
            fleetscan = FleetScan()

            newstick = m.group(1)
            fleetname = m.group(2)
            originx = m.group(3)
            originy = m.group(4)
            originz = m.group(5)
            arrivaltick = m.group(6)
            numships = m.group(7)

            fleetscan.mission = "Unknown"
            fleetscan.fleet_name = fleetname
            fleetscan.launch_tick = newstick
            fleetscan.landing_tick = int(arrivaltick)
            fleetscan.fleet_size = numships

            owner = PlanetHistory.load_planet(
                originx,
                originy,
                originz,
                newstick,
                closest=not Config.getboolean("Misc", "catchup"))
            if owner is None:
                continue
            fleetscan.owner = owner
            fleetscan.target = scan.planet
            fleetscan.in_cluster = fleetscan.owner.x == fleetscan.target.x
            fleetscan.in_galaxy = fleetscan.in_cluster and fleetscan.owner.y == fleetscan.target.y

            try:
                scan.fleets.append(fleetscan)
                session.commit()
            except Exception, e:
                session.rollback()
                scanlog("Exception in news: %s" % (str(e), ), traceback=True)
                continue

            scanlog('Incoming: ' + newstick + ':' + fleetname + '-' + originx +
                    ':' + originy + ':' + originz + '-' + arrivaltick + '|' +
                    numships)
Example #15
0
    def __init__(self, message, m):

        print m.groups()

        target_x=m.group(1)
        target_y=m.group(2)
        target_z=m.group(3)

        owner_x=m.group(4)
        owner_y=m.group(5)
        owner_z=m.group(6)



        fleetname=m.group(7)
        race=m.group(9)
        fleetsize=m.group(10)
        mission=m.group(11)
        eta=m.group(12)

        print "%s:%s:%s %s:%s:%s '%s' %s m:%s e:%s"%(owner_x,owner_y,owner_z,target_x,target_y,target_z,fleetname,fleetsize,mission,eta)

        target=Planet.load(target_x,target_y,target_z)
        if target is None:
            return

        owner=Planet.load(owner_x,owner_y,owner_z)
        if owner is None:
            return

        curtick=Updates.current_tick()
        landing_tick = int(eta) + int(curtick)

        fleet = FleetScan(owner=owner, target=target, fleet_size=fleetsize, fleet_name=fleetname, landing_tick=landing_tick, mission=mission)
        fleet.in_cluster = owner_x == target_x
        fleet.in_galaxy = fleet.in_cluster and owner_y == target_y
        try:
            session.add(fleet)
            session.commit()
        except IntegrityError,e:
            session.rollback()
            print "Exception in galstatus: "+e.__str__()
            traceback.print_exc()
Example #16
0
    def execute(self, message, user, params):

        chan = params.group(1)
        if "galmate" in Config.options("Access"):
            access = Config.getint("Access", "galmate")
        else:
            access = 0

        try:
            session.add(Channel(name=chan, userlevel=access, maxlevel=access))
            session.commit()
            message.reply(
                "Added your galchannel as %s (if you didn't add me to the channel with at least access 24 first, I'm never going to bother joining)"
                % (chan, ))
            message.privmsg("set %s autoinvite on" % (chan, ),
                            Config.get("Services", "nick"))
            message.privmsg("invite %s" % (chan, ),
                            Config.get("Services", "nick"))
        except IntegrityError:
            session.rollback()
            message.reply("Channel %s already exists" % (chan, ))
Example #17
0
    def parse_N(self, scan_id, scan, page):
        #incoming fleets
        #<td class=left valign=top>Incoming</td><td valign=top>851</td><td class=left valign=top>We have detected an open jumpgate from Tertiary, located at 18:5:11. The fleet will approach our system in tick 855 and appears to have roughly 95 ships.</td>
        for m in re.finditer('<td class="left" valign="top">Incoming</td><td valign="top">(\d+)</td><td class="left" valign="top">We have detected an open jumpgate from ([^<]+), located at <a[^>]+>(\d+):(\d+):(\d+)</a>. The fleet will approach our system in tick (\d+) and appears to have (\d+) visible ships.</td>', page):
            fleetscan = FleetScan()

            newstick = m.group(1)
            fleetname = m.group(2)
            originx = m.group(3)
            originy = m.group(4)
            originz = m.group(5)
            arrivaltick = m.group(6)
            numships = m.group(7)

            fleetscan.mission = "Unknown"
            fleetscan.fleet_name = fleetname
            fleetscan.launch_tick = newstick
            fleetscan.landing_tick = int(arrivaltick)
            fleetscan.fleet_size = numships

            owner = PlanetHistory.load_planet(originx,originy,originz,newstick,closest=not Config.getboolean("Misc", "catchup"))
            if owner is None:
                continue
            fleetscan.owner = owner
            fleetscan.target = scan.planet
            fleetscan.in_cluster = fleetscan.owner.x == fleetscan.target.x
            fleetscan.in_galaxy = fleetscan.in_cluster and fleetscan.owner.y == fleetscan.target.y

            try:
                scan.fleets.append(fleetscan)
                session.commit()
            except Exception, e:
                session.rollback()
                scanlog("Exception in news: %s"%(str(e),), traceback=True)
                continue

            scanlog('Incoming: ' + newstick + ':' + fleetname + '-' + originx + ':' + originy + ':' + originz + '-' + arrivaltick + '|' + numships)
Example #18
0
    def execute(self, page, uid, pa_id, gid=None):
        scanlog("Scan: %s (group: %s)" % (
            pa_id,
            gid,
        ))
        page = decode(page)

        m = re.search('>([^>]+) on (\d+)\:(\d+)\:(\d+) in tick (\d+)', page)
        if not m:
            scanlog("Expired/non-matchinng scan (id: %s)" % (pa_id, ))
            return

        scantype = m.group(1)[0].upper()
        x = int(m.group(2))
        y = int(m.group(3))
        z = int(m.group(4))
        tick = int(m.group(5))

        planet = Planet.load(x, y, z)
        if planet is None:
            return
        try:
            scan = Scan(pa_id=pa_id,
                        scantype=scantype,
                        tick=tick,
                        group_id=gid,
                        scanner_id=uid)
            planet.scans.append(scan)
            session.commit()
            scan_id = scan.id
        except IntegrityError, e:
            session.rollback()
            scanlog("Scan %s may already exist: %s" % (
                pa_id,
                str(e),
            ))
            return
Example #19
0
    def parse_J(self, scan_id, scan, page):
        # <td class=left>Origin</td><td class=left>Mission</td><td>Fleet</td><td>ETA</td><td>Fleetsize</td>
        # <td class=left>13:10:5</td><td class=left>Attack</td><td>Gamma</td><td>5</td><td>265</td>

        #                     <td class="left">15:7:11            </td><td class="left">Defend </td><td>Ad infinitum</td><td>9</td><td>0</td>
        #<tr><td class="left">10:4:9</td><td class="left">Return</td><td>They look thirsty</td><td>5</td><td>3000</td></tr>
        #        <tr><td class="left">4:1:10</td><td class="left">Return</td><td>Or Is It?</td><td>9</td><td>3000</td></tr>

        #<tr><td class="left">10:1:10</td><td class="left">Defend</td><td class="left">Pesticide IV</td><td class="right">1</td><td class="right">0</td></tr>

        for m in re.finditer(
                '<td[^>]*>(?:<a[^>]+>)?(\d+)\:(\d+)\:(\d+)(?:</a>)?[^/]*/[^/]*/td><td[^>]*>([^<]+)</td><td[^>]*>([^<]+)</td><td[^>]*>(\d+)</td><td[^>]*>(\d+(?:,\d{3})*)</td>',
                page):
            scanlog("%s:%s:%s %s %s %s %s" % m.groups())

            fleetscan = FleetScan()

            originx = m.group(1)
            originy = m.group(2)
            originz = m.group(3)
            mission = m.group(4)
            fleet = m.group(5)
            eta = int(m.group(6))
            fleetsize = m.group(7).replace(',', '')

            fleetscan.mission = mission
            fleetscan.fleet_name = fleet
            fleetscan.landing_tick = eta + scan.tick
            fleetscan.fleet_size = fleetsize

            attacker = PlanetHistory.load_planet(originx, originy, originz,
                                                 scan.tick)
            if attacker is None:
                scanlog("Can't find attacker in db: %s:%s:%s tick: %s" %
                        (originx, originy, originz, scan.tick))
                continue
            fleetscan.owner = attacker
            fleetscan.target = scan.planet
            fleetscan.in_cluster = fleetscan.owner.x == fleetscan.target.x
            fleetscan.in_galaxy = fleetscan.in_cluster and fleetscan.owner.y == fleetscan.target.y

            try:
                scan.fleets.append(fleetscan)
                session.commit()
            except IntegrityError, e:
                session.rollback()
                scanlog("Caught integrity exception in jgp: %s" % (str(e), ))
                scanlog("Trying to update instead")
                query = session.query(FleetScan).filter_by(
                    owner=attacker,
                    target=scan.planet,
                    fleet_size=fleetsize,
                    fleet_name=fleet,
                    landing_tick=eta + scan.tick,
                    mission=mission)
                try:
                    query.update({"scan_id": scan_id})
                    session.commit()
                except Exception, e:
                    session.rollback()
                    scanlog("Exception trying to update jgp: %s" % (str(e), ),
                            traceback=True)
                    continue
Example #20
0
    def execute(self, message, user, params):
        planet = Planet.load(*params.group(1,3,5))
        if planet is None:
            message.alert("No planet with coords %s:%s:%s" % params.group(1,3,5))
            return
        
        tick = Updates.current_tick()
        when = int(params.group(6))
        if when < 32:
            eta = when
            when += tick
        elif when <= tick:
            message.alert("Can not book targets in the past. You wanted tick %s, but current tick is %s." % (when, tick,))
            return
        else:
            eta = when - tick
        if when > 32767:
            when = 32767        
        override = params.group(7)
        
        if planet.intel and planet.alliance and planet.alliance.name == Config.get("Alliance","name"):
            message.reply("%s:%s:%s is %s in %s. Quick, launch before they notice the highlight." % (planet.x,planet.y,planet.z, planet.intel.nick or 'someone', Config.get("Alliance","name"),))
            return
                
        T = session.query(Attack)
        T = T.join(AttackData)
        T = T.filter(AttackData.planet_id == planet.id)
        T = T.filter(Attack.start_time < datetime.datetime.now())
        T = T.filter(Attack.book_time > datetime.datetime.now())
        tresult = T.all()
        if len(tresult) >= 1:
	    message.reply("Target %s:%s:%s is part of an upcoming attack" % (planet.x,planet.y,planet.z,))
	    return

        Q = session.query(User.name, Target.tick)
        Q = Q.join(Target.user)
        Q = Q.filter(Target.planet == planet)
        Q = Q.filter(Target.tick >= when)
        Q = Q.order_by(asc(Target.tick))
        result = Q.all()
        
        if len(result) >= 1:
            booker, land = result[0]
            if land == when:
	        if str(params.group(7)) == "later" or str(params.group(8)) == "later":
		    later = when+1
                    Q2 = session.query(User.name, Target.tick)
                    Q2 = Q2.join(Target.user)
                    Q2 = Q2.filter(Target.planet == planet)
                    Q2 = Q2.filter(Target.tick >= later)
                    Q2 = Q2.order_by(asc(Target.tick))
                    result2 = Q2.all()
		    if len(result2) >= 1:
                       laterbooker, laterland = result2[0]
                       if laterland == later:
                           message.reply("YOU CANNOT HIT %s:%s:%s. NOT EVEN SLOPPY SECOND'S. THIS TARGET IS MORE TAKEN THAN YOUR MUM, AMIRITE?" % (planet.x,planet.y,planet.z,))
                           return
                    try:
                        planet.bookings.append(Target(user=user, tick=later))
                        session.commit()
                        message.reply("YOU HAVE BEEN BEATEN TO THIS TARGET. YOU ARE NOW GETTING SLOPPY SECOND'S ON %s:%s:%s TAKING PLACE ON TICK %s" % (planet.x,planet.y,planet.z, later,))
                        return
                    except IntegrityError:
                        session.rollback()
                        raise Exception("Integrity error? Unable to booking for pid %s and tick %s"%(planet.id, later,))
                        return
		else:
                    message.reply("Target %s:%s:%s is already booked for landing tick %s by user %s" % (planet.x,planet.y,planet.z, land, booker,))
                    return
            if params.group(7) is None or (str(params.group(7)) == "later" and params.group(8) is None):
                reply="There are already bookings for that target after landing pt %s (eta %s). To see status on this target, do !status %s:%s:%s." % (when,eta, planet.x,planet.y,planet.z,)
                reply+=" To force booking at your desired eta/landing tick, use !book %s:%s:%s %s yes (Bookers: " %(planet.x,planet.y,planet.z, when,)
                prev=[]
                for booker, land in result:
                    prev.append("(%s user:%s)" % (land, booker,))
                reply += ", ".join(prev) + ")"
                message.reply(reply)
                return
        
        try:
            planet.bookings.append(Target(user=user, tick=when))
            session.commit()
            message.reply("Booked landing on %s:%s:%s tick %s for user %s" % (planet.x,planet.y,planet.z, when, user.name,))
            return
        except IntegrityError:
            session.rollback()
            raise Exception("Integrity error? Unable to booking for pid %s and tick %s"%(planet.id, when,))
            return
Example #21
0
                    owner=attacker,
                    target=scan.planet,
                    fleet_size=fleetsize,
                    fleet_name=fleet,
                    landing_tick=eta + scan.tick,
                    mission=mission)
                try:
                    query.update({"scan_id": scan_id})
                    session.commit()
                except Exception, e:
                    session.rollback()
                    scanlog("Exception trying to update jgp: %s" % (str(e), ),
                            traceback=True)
                    continue
            except Exception, e:
                session.rollback()
                scanlog("Exception in jgp: %s" % (str(e), ), traceback=True)
                continue

    def parse_N(self, scan_id, scan, page):
        #incoming fleets
        #<td class=left valign=top>Incoming</td><td valign=top>851</td><td class=left valign=top>We have detected an open jumpgate from Tertiary, located at 18:5:11. The fleet will approach our system in tick 855 and appears to have roughly 95 ships.</td>
        for m in re.finditer(
                '<td class="left" valign="top">Incoming</td><td valign="top">(\d+)</td><td class="left" valign="top">We have detected an open jumpgate from ([^<]+), located at <a[^>]+>(\d+):(\d+):(\d+)</a>. The fleet will approach our system in tick (\d+) and appears to have (\d+) visible ships.</td>',
                page):
            fleetscan = FleetScan()

            newstick = m.group(1)
            fleetname = m.group(2)
            originx = m.group(3)
            originy = m.group(4)
Example #22
0
File: book.py Project: JDD/merlin
 def execute(self, message, user, params):
     planet = Planet.load(*params.group(1,3,5))
     if planet is None:
         message.alert("No planet with coords %s:%s:%s" % params.group(1,3,5))
         return
     
     tick = Updates.current_tick()
     when = int(params.group(6))
     if when < PA.getint("numbers", "protection"):
         eta = when
         when += tick
     elif when <= tick:
         message.alert("Can not book targets in the past. You wanted tick %s, but current tick is %s." % (when, tick,))
         return
     else:
         eta = when - tick
     if when > 32767:
         when = 32767        
     
     override = params.group(7)
     later = params.group(8)
     
     if planet.intel and planet.alliance and planet.alliance.name == Config.get("Alliance","name"):
         message.reply("%s:%s:%s is %s in %s. Quick, launch before they notice the highlight." % (planet.x,planet.y,planet.z, planet.intel.nick or 'someone', Config.get("Alliance","name"),))
         return
     
     free, book1, book2 = self.get_free_book(planet, when, later)
     
     if free is None:
         if later is None:
             message.reply("Target %s:%s:%s is already booked for landing tick %s by user %s" % (planet.x,planet.y,planet.z, when, book1.user.name,))
         else:
             message.reply("You cannot hit %s:%s:%s. Not even sloppy seconds. This target is more taken than your mum, amirite?" % (planet.x,planet.y,planet.z,))
         return
     
     if override is None and later is None:
         books = planet.bookings.filter(Target.tick >= when).order_by(asc(Target.tick)).all()
         if len(books) >= 1:
             reply = "There are already bookings for that target after landing pt %s (eta %s). To see status on this target, do !status %s:%s:%s." % (when,eta, planet.x,planet.y,planet.z,)
             reply+= " To force booking at your desired eta/landing tick, use !book %s:%s:%s %s yes (Bookers: " %(planet.x,planet.y,planet.z, when,)
             prev=[]
             for book in books:
                 prev.append("(%s user:%s)" % (book.tick, book.user.name,))
             reply += ", ".join(prev) + ")"
             message.reply(reply)
             return
     
     if free == when:
         reply = "Booked landing on %s:%s:%s tick %s (eta %s) for user %s" % (planet.x,planet.y,planet.z, free, (free-tick), user.name,)
     elif free == when + 1:
         reply = "You have been beaten to %s:%s:%s by %s. You are now getting sloppy seconds at tick %s (eta %s)" % (planet.x,planet.y,planet.z, book1.user.name, free, (free-tick),)
     elif free == when + 2:
         reply = "You've been beaten to %s:%s:%s by %s and %s you slow retarded f****t. I feel sorry for you, so have tick %s (eta %s)" % (planet.x,planet.y,planet.z, book1.user.name, book2.user.name, free, (free-tick),)
     
     try:
         planet.bookings.append(Target(user=user, tick=free))
         session.commit()
         message.reply(reply)
         return
     except IntegrityError:
         session.rollback()
         raise Exception("Integrity error? Unable to booking for pid %s and tick %s"%(planet.id, when,))
         return
Example #23
0
    def execute(self, message, user, params):
        planet = Planet.load(*params.group(1, 3, 5))
        if planet is None:
            message.alert("No planet with coords %s:%s:%s" %
                          params.group(1, 3, 5))
            return

        tick = Updates.current_tick()
        when = int(params.group(6))
        if when < PA.getint("numbers", "protection"):
            eta = when
            when += tick
        elif when <= tick:
            message.alert(
                "Can not book targets in the past. You wanted tick %s, but current tick is %s."
                % (
                    when,
                    tick,
                ))
            return
        else:
            eta = when - tick
        if when > 32767:
            when = 32767

        override = params.group(7)
        later = params.group(8)

        if planet.intel and planet.alliance and planet.alliance.name == Config.get(
                "Alliance", "name"):
            message.reply(
                "%s:%s:%s is %s in %s. Quick, launch before they notice the highlight."
                % (
                    planet.x,
                    planet.y,
                    planet.z,
                    planet.intel.nick or 'someone',
                    Config.get("Alliance", "name"),
                ))
            return

        free, book1, book2 = self.get_free_book(planet, when, later)

        if free is None:
            if later is None:
                message.reply(
                    "Target %s:%s:%s is already booked for landing tick %s by user %s"
                    % (
                        planet.x,
                        planet.y,
                        planet.z,
                        when,
                        book1.user.name,
                    ))
            else:
                message.reply(
                    "You cannot hit %s:%s:%s. Not even sloppy seconds. This target is more taken than your mum, amirite?"
                    % (
                        planet.x,
                        planet.y,
                        planet.z,
                    ))
            return

        if override is None and later is None:
            books = planet.bookings.filter(Target.tick >= when).order_by(
                asc(Target.tick)).all()
            if len(books) >= 1:
                reply = "There are already bookings for that target after landing pt %s (eta %s). To see status on this target, do !status %s:%s:%s." % (
                    when,
                    eta,
                    planet.x,
                    planet.y,
                    planet.z,
                )
                reply += " To force booking at your desired eta/landing tick, use !book %s:%s:%s %s yes (Bookers: " % (
                    planet.x,
                    planet.y,
                    planet.z,
                    when,
                )
                prev = []
                for book in books:
                    prev.append("(%s user:%s)" % (
                        book.tick,
                        book.user.name,
                    ))
                reply += ", ".join(prev) + ")"
                message.reply(reply)
                return

        if free == when:
            reply = "Booked landing on %s:%s:%s tick %s (eta %s) for user %s" % (
                planet.x,
                planet.y,
                planet.z,
                free,
                (free - tick),
                user.name,
            )
        elif free == when + 1:
            reply = "You have been beaten to %s:%s:%s by %s. You are now getting sloppy seconds at tick %s (eta %s)" % (
                planet.x,
                planet.y,
                planet.z,
                book1.user.name,
                free,
                (free - tick),
            )
        elif free == when + 2:
            reply = "You've been beaten to %s:%s:%s by %s and %s you slow retarded f****t. I feel sorry for you, so have tick %s (eta %s)" % (
                planet.x,
                planet.y,
                planet.z,
                book1.user.name,
                book2.user.name,
                free,
                (free - tick),
            )

        try:
            planet.bookings.append(Target(user=user, tick=free))
            session.commit()
            message.reply(reply)
            return
        except IntegrityError:
            session.rollback()
            raise Exception(
                "Integrity error? Unable to booking for pid %s and tick %s" % (
                    planet.id,
                    when,
                ))
            return
Example #24
0
            )
        )

        # Finally we can commit!
        session.commit()

        t2 = time.time() - t1
        print "History and final update in %.3f seconds" % (t2,)
        t1 = time.time()

        break
    except Exception, e:
        print "Something random went wrong, sleeping for 15 seconds to hope it improves"
        print e.__str__()
        traceback.print_exc()
        session.rollback()
        time.sleep(15)
        continue

session.close()

t1 = time.time() - t_start
print "Total time taken: %.3f seconds" % (t1,)

# Measure some dicks
last_tick = Updates.current_tick()
history_tick = max(last_tick - 72, 1)
t_start = time.time()
t1 = t_start
session.execute(epenis.__table__.delete())
session.execute(text("SELECT setval('epenis_rank_seq', 1, :false);", bindparams=[false]))
Example #25
0
    def execute(self, request, user, id, x, y, z, when):
        planet = Planet.load(x, y, z)
        if planet is None:
            return self.attack(request, user, id,
                               "No planet with coords %s:%s:%s" % (
                                   x,
                                   y,
                                   z,
                               ))

        tick = Updates.current_tick()
        when = int(when)
        if when < PA.getint("numbers", "protection"):
            eta = when
            when += tick
        elif when <= tick:
            return self.attack(
                request, user, id,
                "Can not book targets in the past. You wanted tick %s, but current tick is %s."
                % (
                    when,
                    tick,
                ))
        else:
            eta = when - tick
        if when > 32767:
            when = 32767

        if planet.intel and planet.alliance and planet.alliance.name == Config.get(
                "Alliance", "name"):
            return self.attack(
                request, user, id,
                "%s:%s:%s is %s in %s. Quick, launch before they notice!" % (
                    x,
                    y,
                    z,
                    planet.intel.nick or 'someone',
                    Config.get("Alliance", "name"),
                ))

        try:
            planet.bookings.append(Target(user=user, tick=when))
            session.commit()
        except IntegrityError:
            session.rollback()
            target = planet.bookings.filter(Target.tick == when).first()
            if target is not None:
                return self.attack(
                    request, user, id,
                    "Target %s:%s:%s is already booked for landing tick %s by user %s"
                    % (
                        x,
                        y,
                        z,
                        when,
                        target.user.name,
                    ))
        else:
            return self.attack(
                request, user, id,
                "Booked landing on %s:%s:%s tick %s (eta %s) for user %s" % (
                    x,
                    y,
                    z,
                    when,
                    (when - tick),
                    user.name,
                ))

        return self.attack(request, user, id)