EventScripts Forums
Mattie's EventScripts and Source Forums
Mattie recommends...
Premier Sponsor:Platinum Sponsor:
 
Script Categories
addon (49) admin (269) admins (14) advert (15) adverts (19) afk (15) alerts (12) ammo (23) anti (15) auth (16) automatic (12) awp (23) ban (18) ba_jail (17) bhop (19) block (19) bomb (40) bonus (23) bot (24) bot-management (19) bots (17) bunnyhop (11) Buy (21) cash (65) chat (57) cheat (11) clan (16) classes (22) color (21) colors (18) command (20) commands (18) config (22) connect (42) CS:S (16) css (2500) Damage (35) database (11) dead (15) death (19) deathmatch (70) deathrun (12) disconnect (18) Dissolve (11) dm (20) dod:s (11) dods (386) easy (17) effects (120) English (15) entity (21) es_tools (12) Eventscript (12) flashbang (25) français (99) french (36) fun (286) funny (16) Gabeee (11) gameplay (174) give (16) gravity (11) grenade (25) grenades (29) gun (14) GunGame (26) GunGame5 (11) guns (17) Hack (15) headshot (32) health (54) hegrenade (13) hl2dm (329) HP (13) info (48) information (16) jail (26) jailbreak (11) join (23) jump (12) kick (23) kill (44) kills (22) knife (57) leveling (36) management (14) mani (15) map (25) map-management (27) maps (15) match (17) menu (106) message (20) messaging (52) mod (109) model (14) models (32) money (42) motd (12) music (29) mute (18) nades (18) name (13) noblock (35) player (40) player-management (31) player-tracking (28) popup (55) props (23) protection (27) punishment (50) python (63) quake (18) radio (21) random (36) rank (35) rates (16) rcon (13) realism (21) respawn (61) restrict (36) round (20) rpg (24) rules (42) say (11) scout (19) Script (20) script-helper (25) scriptpack (33) sdk (149) server (44) server-tools (42) shop (12) silly (31) simple (27) skins (24) slay (13) soccer (11) sound (45) sounds (92) spawn (63) speed (25) statistics (13) stats (48) STEAMID (23) Superhero (13) surf (31) Team (25) team-balance (14) teleport (12) text (14) TF2 (143) time (17) timer (14) tools (15) tracers (17) triggers (11) uedi (18) uses_auth (18) utility (11) vip (11) vote (36) voting (22) war (20) wcs (24) wcs:Python (32) weapon (77) weapons (114) web (14) welcome (12) zm (24) zombie (90) zombiemod (51) zombies (11)
Script Authors
*XYZ*SaYnt (12) .:MiB:. (11) .eMko* (6) 101satoon101 (10) 3R10N (24) 4u571n91 (5) 7355608 (9) Absolute (8) Ace Rimmer (40) adminc (5) Adz (8) AgathaKnuppelkuh (8) aidden (8) ajax (5) ak_47 (6) Al3c Tr3v3lyan (6) allstareng (5) ashbash1987 (9) ATAMAH (7) aznone (5) B00M (5) BackRaw (41) BFH_RedBull (8) bigfabi (7) Bioko (7) Blade (10) bladesback (13) bobdole (11) bodzsar1 (8) bonbon (36) Brainsucker (30) cagemonkey (8) carbon-14 (10) CaskioUTF (5) cbirou (15) ChaCaLz2psy4 (5) CharlesT (5) Chrisber (5) chrismrulz (9) Chun (6) cladiron (10) clipz934 (8) Colster (21) Cookieman8 (7) craziest (10) DanielB (19) Darkness123 (8) Dave (9) dbozan99 (7) deathx9 (5) Deathyy (16) dhack (16) Di[M]aN (12) DoCky (27) Don (15) dordtcore (8) DragonFreddo (8) Drassil (5) Einlanzers (42) EmbouT (10) emilplov (7) Errant (10) Eun (6) Fantole (9) Franc1sco (9) freddukes (18) Frequency (6) Fulmine (5) GAMEREN2 (8) german9114 (13) GODJonez (38) GoodfellaDeal (5) Hansi (6) HitThePipe (7) HOLLDIDAY (9) Icetouch (6) ichthys (25) infamous1 (9) Jeff91 (45) JoeyT2006 (30) Juba_PornBorn (12) jxl180 (10) KDBFame (6) L'In20Cible (7) Largo Usagi (10) Lobe (11) loKkdoKk (7) lolo-le-haricot (7) LosNir (5) Lumpi@Work (9) M4rc3L-XCN (7) macshot (6) Matth (5) Mattie (20) MBchrono (15) McFly (20) Medda (5) Memphis-84 (10) Messiah93 (12) Mickyy (5) micmacx (6) Mitchell (5) Mordavolt (7) MrScriptaz (5) mryoung (6) Nicolous (26) ojii (31) Omega_K2 (6) Owned|Myself (8) P3N (7) pand3mic (5) parsimba (5) Pascal257 (9) PatPeter (7) PDrop (10) Phaedrus (18) PhantOm Fury (7) phoenix131 (8) pinkyyy -.- (5) pitbull0993 (7) randomknifer (9) Ratzee (6) ReaCtioN2oo9 (6) Rennnyyy (17) revolutionfighters (6) RideGuy (12) Rio (9) Roeliekt (6) runamagic (13) sandking220 (6) Sarcasm_Poisoning (10) saRs| Johnny-5 (13) Schubaal (10) sea212 (5) sega74rus (7) sgt.angel (6) sicilia (5) sicman_adrian (22) skillz92 (7) sn4k3 (18) snake38 (10) sonicsight (7) spoonman184 (8) stabby (22) stas (22) Strontium Dog (30) SumGuy14 (25) SuperDave (45) surfteam (5) TaCo (5) TanaToS (17) Tealk (6) teowow (16) TheCheeTaH (20) TheDonFather (5) theresthatguy (6) Tiny Tod (7) Totyahun (9) uedi (38) Undead (25) usernamesaretaken (15) Warren (13) westham (6) WhiteAvenger (7) Wonder (14) X-Mania (5) XE_ManUp (13) xfalcon61 (5) zSweetXz (5) [Cs]Lord_Inferno2 (11) [NATO]Hunter (28) ||Wolf|| (10)
Search

Post new topic Reply to topic
Author Message
User avatar
Experienced
Profile

Posts: 446
Location:
Yes.
 
New postPosted: 2008-09-09, 5:51 pm 
   Post subject: Command line parser

PYTHON:

    import re





    def parse(string, delim1 = " ", delim2 = '"'):

        big = re.split("%s[^%s]*%s" %(delim2, delim2, delim2), string)

        little = re.findall("%s[^%s]*%s" %(delim2, delim2, delim2), string)

        total = []

        for i in range(len(little) ):

            temp = big[i].strip().split(delim1)

            for each in temp:

                if len(each.strip() ):

                    total.append(each.strip() )

            total.append(little[i][1:-1])

        temp = big[-1:][0].strip().split(delim1)

        for each in temp:

            if len(each.strip() ):

                total.append(each.strip() )

         

     




What this does is parses simple commands into a list of commands. For example: to parse a string passed in by the user:

Code:
!kick "Cheating Player"  You are not allowed to cheat on this server!


Would return:
Code:
['!kick', 'Cheating Player', 'You', 'are', 'not', 'allowed', 'to', 'cheat', 'on', 'this', 'server!']



It keeps groups of words surrounded by quote together by default.

This is very useful if you need to treat incoming text by a say prefix as parameters.

Tell me what you think.

_________________
Image





User avatar
EventScripts Administrator
EventScripts Administrator
Profile

Posts: 12890
Location:
irc://irc.gamesurge.net/eventscripts
 
New postPosted: 2008-09-09, 11:47 pm 

Doesn't it seem easier to just register a say command?
PYTHON:
    # ./addons/eventscripts/myaddon/myaddon.py

    import es



    def kick_cmd():

       es.msg(', '.join(es.getargv(x) for x in xrange(1, es.getargc())))



    es.regsaycmd('!kick', 'myaddon/kick_cmd', 'Kick command')



    def unload():

       es.unregsaycmd('!kick')
You type in:
Code:
!kick "Cheating Player"  You are not allowed to cheat on this server!
It returns:
Code:
Cheating Player, You, are, not, allowed, to, cheat, on, this, server!
There is also this which does most of the work for you: http://forums.mattie.info/cs/forums/viewtopic.php?t=25650


I strongly suggest registering a say command but if you have to use a say filter you might consider:
PYTHON:
    def parse(parse_me):

       s = parse_me.split('"')

       r, p = [], True

       for x in xrange(len(s)):

          if p:

             if s[x]:

                r += s[x].split()

          else: r.append(s[x])

          p = not p

       return r
I'm sure we can come up with a better way, though.

_________________
Image
EventScripts Wiki --- #eventscripts --- Python.org --- es_install FAQ


User avatar
Guru
Guru
Profile

Posts: 1607
Location:
Location: Location:
 
New postPosted: 2008-09-10, 11:30 am 

SuperDave, could your method be improved by using yield instead of appending to a list, then returning that?

_________________
- Saul

All code I give out is licensed under the Creative Commons Attribution-Noncommercial-Share Alike 3.0 license.


User avatar
EventScripts Administrator
EventScripts Administrator
Profile

Posts: 12890
Location:
irc://irc.gamesurge.net/eventscripts
 
New postPosted: 2008-09-10, 6:36 pm 

Indeed, we could make it a generator. Good idea :)

_________________
Image
EventScripts Wiki --- #eventscripts --- Python.org --- es_install FAQ


User avatar
Experienced
Profile

Posts: 446
Location:
Yes.
 
New postPosted: 2008-09-10, 8:09 pm 

SuperDave wrote:
Doesn't it seem easier to just register a say command?
PYTHON:
    # ./addons/eventscripts/myaddon/myaddon.py
    import es

    def kick_cmd():
       es.msg(', '.join(es.getargv(x) for x in xrange(1, es.getargc())))

    es.regsaycmd('!kick', 'myaddon/kick_cmd', 'Kick command')

    def unload():
       es.unregsaycmd('!kick')
You type in:
Code:
!kick "Cheating Player"  You are not allowed to cheat on this server!
It returns:
Code:
Cheating Player, You, are, not, allowed, to, cheat, on, this, server!
There is also this which does most of the work for you: http://forums.mattie.info/cs/forums/viewtopic.php?t=25650


I strongly suggest registering a say command but if you have to use a say filter you might consider:
PYTHON:
    def parse(parse_me):
       s = parse_me.split('"')
       r, p = [], True
       for x in xrange(len(s)):
          if p:
             if s[x]:
                r += s[x].split()
          else: r.append(s[x])
          p = not p
       return r
I'm sure we can come up with a better way, though.


Unfortunately, You cannot tell if a say command was a private team say or a normal say command. It would be very nice if the say command would report this.

_________________
Image


User avatar
EventScripts Administrator
EventScripts Administrator
Profile

Posts: 12890
Location:
irc://irc.gamesurge.net/eventscripts
 
New postPosted: 2008-09-10, 10:10 pm 

I bet a client command filter could catch say or say_team. If you remember the last version used by each player you can determine which was used to trigger the say command.

Even if you decide to stick with the say filter the non-regex version should be slightly faster as regex is slow, especially in Python. I seem to recall Chun benching the ESS regex vs the ESP regex and the ESS version was faster :o


BTW, looking at my code I'm not sure we could turn it into a generator since generators are unsubscriptable -- one big benefit of having a list. It's still a good idea I hadn't thought of, though :)

_________________
Image
EventScripts Wiki --- #eventscripts --- Python.org --- es_install FAQ


User avatar
Experienced
Profile

Posts: 446
Location:
Yes.
 
New postPosted: 2008-09-11, 8:00 am 

SuperDave wrote:
I bet a client command filter could catch say or say_team. If you remember the last version used by each player you can determine which was used to trigger the say command.

Even if you decide to stick with the say filter the non-regex version should be slightly faster as regex is slow, especially in Python. I seem to recall Chun benching the ESS regex vs the ESP regex and the ESS version was faster :o


BTW, looking at my code I'm not sure we could turn it into a generator since generators are unsubscriptable -- one big benefit of having a list. It's still a good idea I hadn't thought of, though :)


I originally had big things in mind for this plugin. I used it to parse my apache log files. Each log file was a little over 100,000 entries, and each entry was being stroed in a mysql database. Altogether it took just over a minute to finish. Worst case would be about 1600 regex matches per second, which is not great, but is fast enough for my purposes.


The best solution would be if the regsaycmd returned which tpye of text it was, since i am sure it has access to it. Something along the lines of es.getteamsay()

_________________
Image


User avatar
Guru
Guru
Profile

Posts: 1607
Location:
Location: Location:
 
New postPosted: 2008-09-11, 1:07 pm 

Yeah, I think thats the only issue with generators. They are just generally used to be looped through, or checking whether some item is contained in them, for example, you could have a fastParse() function, which returns a generator.

You can then just do simple checks with it, example:
PYTHON:
    if '!kick' in fastParse():


I dunno, just throwing up ideas here.

_________________
- Saul

All code I give out is licensed under the Creative Commons Attribution-Noncommercial-Share Alike 3.0 license.


User avatar
Moderator
Moderator
Profile

Posts: 4920
Location:
/dev/null
 
New postPosted: 2008-09-15, 1:19 pm 

Why don't you just do a .split('"')

_________________
~ The_WuH
_________________
All code I give out is licensed - http://creativecommons.org/licenses/by-nc-sa/3.0/us/
Image
Weeks of programming can save you hours of planning.


User avatar
EventScripts Administrator
EventScripts Administrator
Profile

Posts: 12890
Location:
irc://irc.gamesurge.net/eventscripts
 
New postPosted: 2008-09-15, 2:43 pm 

PYTHON:
    >>> 'I think "some parameters" will be incorrectly grouped'.split('"')

    ['I think ', 'some parameters', ' will be incorrectly grouped']
Which is why I do that and then split by whitespace :)

_________________
Image
EventScripts Wiki --- #eventscripts --- Python.org --- es_install FAQ


User avatar
Experienced
Profile

Posts: 446
Location:
Yes.
 
New postPosted: 2008-09-18, 6:50 am 

PYTHON:

    def parse(string, token1 = " ", token2 = '"'):

        split = string.split(token2)

        final = []

        b = True

        for each in split:

            if b:

                if len( each.strip() ):

                    final += each.strip().split(token1)

            else:

                final += [each.strip()]

            b = not b

       

        return filter(_filterparse, final)

       

    def _filterparse(string):

        if len(string):

            return True

        return False



     


Semi Revised Version

_________________
Image


User avatar
EventScripts Administrator
EventScripts Administrator
Profile

Posts: 12890
Location:
irc://irc.gamesurge.net/eventscripts
 
New postPosted: 2008-09-18, 4:35 pm 

So you know, this:
PYTHON:
    if len( each.strip() ):
will behave the same as:
PYTHON:
    if each.strip():

Also this:
PYTHON:
    def _filterparse(string):

        if len(string):

            return True

        return False
will behave the same as:
PYTHON:
    def _filterparse(string):

        return bool(string)

Meaning this:
PYTHON:
    return filter(_filterparse, final)
will behave the same as:
PYTHON:
    return filter(len, final)

_________________
Image
EventScripts Wiki --- #eventscripts --- Python.org --- es_install FAQ


Display posts from previous:  Sort by  
Post new topic Reply to topic  [ 12 posts ] 


Who is online

Users browsing this forum: No registered users and 1 guest


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot post attachments in this forum

Search for:
Jump to:  
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group