This is the new home of the egghelp.org community forum.
All data has been migrated (including user logins/passwords) to a new phpBB version.


For more information, see this announcement post. Click the X in the top right-corner of this box to dismiss this message.

linsert and something else

Help for those learning Tcl or writing their own scripts.
User avatar
arfer
Master
Posts: 436
Joined: Fri Nov 26, 2004 8:45 pm
Location: Manchester, UK

Post by arfer »

OK thanks for that, I see it now as per the following. Without -exact it doesn't work as expected due to glob style default where square brackets are present in the nick.

[21:03] <@arfer> % set testnick [subst -nocommands {a[rf]er}]
[21:03] <@Baal> a[rf]er
[21:03] <@arfer> % return [lsearch {me you a[rf]er} $testnick]
[21:03] <@Baal> -1
[21:04] <@arfer> % return [lsearch -exact {me you a[rf]er} $testnick]
[21:04] <@Baal> 2
User avatar
ultralord
Master
Posts: 255
Joined: Mon Nov 06, 2006 6:52 pm

Post by ultralord »

ok.. sorry for any truble. if i make anyone.. i made that proc

Code: Select all

proc g_findadmin { } {   
   global g_pickupchan nick1 nick2 nick3 players g_players nick4 g_plstats g_teambserver g_teamaserver nick5 nick6 g_serverholder nick7 nick8 nick9 nick10 g_lastinfoteama g_lastinfoteamb
foreach {nick1 nick2 nick3 nick4 nick5} [split $g_teamaserver ]  {}
foreach {nick6 nick7 nick8 nick9 nick10} [split $g_teambserver ]  {}
if { $g_serverholder == $nick1 } {
set idx [lsearch -exact $g_teamaserver $nick1]
if {$idx != -1} {
set g_teamaserver [lreplace $g_teamaserver $idx $idx]
} else {
 if { $g_serverholder == $nick2 } {
set idx [lsearch -exact $g_teamaserver $nick2]
if {$idx != -1} {
set g_teamaserver [lreplace $g_teamaserver $idx $idx]
   } else {
if { $g_serverholder == $nick3 } {
set idx [lsearch -exact $g_teamaserver $nick3]
if {$idx != -1} {
set g_teamaserver [lreplace $g_teamaserver $idx $idx]
} else {
if { $g_serverholder == $nick4 } {
set idx [lsearch -exact $g_teamaserver $nick4]
if {$idx != -1} {
set g_teamaserver [lreplace $g_teamaserver $idx $idx]
} else {
if { $g_serverholder == $nick5 } {
set idx [lsearch -exact $g_teamaserver $nick5]
if {$idx != -1} {
set g_teamaserver [lreplace $g_teamaserver $idx $idx]
} else {
if { $g_serverholder == $nick6 } {
set idx [lsearch -exact $g_teambserver $nick6]
if {$idx != -1} {
set g_teambserver [lreplace $g_teambserver $idx $idx]
} else {
if { $g_serverholder == $nick7 } {
set idx [lsearch -exact $g_teambserver $nick7]
if {$idx != -1} {
set g_teambserver [lreplace $g_teambserver $idx $idx]
} else {
if { $g_serverholder == $nick8 } {
set idx [lsearch -exact $g_teambserver $nick8]
if {$idx != -1} {
set g_teambserver [lreplace $g_teambserver $idx $idx]
} else {
if { $g_serverholder == $nick9 } {
set idx [lsearch -exact $g_teambserver $nick9]
if {$idx != -1} {
set g_teambserver [lreplace $g_teambserver $idx $idx]
} else {
if { $g_serverholder == $nick10 } {
set idx [lsearch -exact $g_teambserver $nick10]
if {$idx != -1} {
set g_teambserver [lreplace $g_teambserver $idx $idx]
}
}
}
}
}
}
}
}
}
}
}
}
}
}
}
}
}
}
}
}
}
but doesnt work.. i want to remove the g_serverholder nick from the list teamaserver or teambserver ( teamaserver has 5 nicks = nick1 nick2 nick3 nick4 nick5 ) and teambserver the same..

thanks but i have some problems with other things and i cant fix that :(
n
nml375
Revered One
Posts: 2860
Joined: Fri Aug 04, 2006 2:09 pm

Post by nml375 »

Most likely, you are nesting your if-constructs in an improper way..
Indenting your code would probably make this easier to spot..
I'm going to have a deeper look at the code, and get back later.
NML_375
n
nml375
Revered One
Posts: 2860
Joined: Fri Aug 04, 2006 2:09 pm

Post by nml375 »

You are indeed nesting your if-constructs, pretty much preventing any actions unless g_serverholder is equal to nick1. At that case, making the rest of the code useless.

Also, that huge block of code could really be condensed to something much smaller, making use of the fact that we're using variables..

Code: Select all

...
 if {[set idx [lsearch -exact $g_teamaserver $g_serverholder]] => 0} {
  set g_teamaserver [lreplace $g_teamaserver $idx $idx]
 } elseif {[set idx [lsearch -exact $g_teambserver $g_serverholder]] =>0} {
  set g_teambserver [lreplace $g_teambserver $idx $idx]
 }
...
Basically, if we get a positive hit in the first lsearch, do the replacement in g_teamaserver. If we don't, move on and test g_teambserver in the same manner...
NML_375
User avatar
speechles
Revered One
Posts: 1398
Joined: Sat Aug 26, 2006 10:19 pm
Location: emerald triangle, california (coastal redwoods)

Post by speechles »

ultralord wrote:

Code: Select all

if { $g_serverholder == $nick10 } {
set idx [lsearch -exact $g_teambserver $nick10]
if {$idx != -1} {
set g_teambserver [lreplace $g_teambserver $idx $idx]
} 
Upon deconstructing this, one wonders why we test if $g_serverholder equals $nick10, just to lsearch for $nick10. You realize if $g_serverholder == nickANY, then we can just search using $g_serverholder. There doesn't need to be this elaborate nested if to accomplish it either. The foreach, converting into 5 elements, then compare using an elaborate if-then procedure, just to in the end lreplace the thing out. Boy, what a long road when the short one is so obvious. Let me point you towards a much cleaner, elegant and simpler solution.

Code: Select all

# split here once for simplicity, this creates a list
# remember when i asked if you were doing this
# on a string or list? we want a list.
set g_teamaserver [split $g_teamaserver]
set g_teambserver [split $g_teamaserver]
# search each list a and b and return the lindex
# position for each into founda and foundb
set founda [lsearch -exact  $g_teamaserver $g_serverholder]]
set foundb [lsearch -exact $g_teambserver $g_serverholder]]
# if we have positive lsearches (found it!) let's remove it from
# the list on either of them.
If {$founda != -1} { set g_teamaserver [lreplace $g_teamaserver $founda $founda] }
If {$foundb != -1} { set g_teambserver [lreplace $g_teambserver $foundb $foundb] }
This accomplishes the same thing with far less code expended.

@nml375, haw, we almost said the exact same thing simultaneously ;) but you forgot to split. You forgot about his funky foreach that does nothing except span the value into 5 variables.

Code: Select all

foreach {nick1 nick2 nick3 nick4 nick5} [split $g_teamaserver ]  {}
foreach {nick6 nick7 nick8 nick9 nick10} [split $g_teambserver ]  {} 
So I assume the greater part of the problem is the confusion of lists vs strings.
Last edited by speechles on Tue Jan 13, 2009 7:07 pm, edited 1 time in total.
n
nml375
Revered One
Posts: 2860
Joined: Fri Aug 04, 2006 2:09 pm

Post by nml375 »

speechles, you do realize that the next time you iterate your code, you'll be splitting a list, not a string (assuming it has not been converted back into a string somewhere else) ? ;)

Or simply, since we're lreplacing all over, I figured it'd be a list all of the time...
NML_375
User avatar
speechles
Revered One
Posts: 1398
Joined: Sat Aug 26, 2006 10:19 pm
Location: emerald triangle, california (coastal redwoods)

Post by speechles »

Code: Select all

foreach {nick6 nick7 nick8 nick9 nick10} [split $g_teambserver ]  {} 
Seeing this illustrates the author is converting a string $g_teambserver into a list to be iterated through the foreach. Meaning the author expects $g_teambserver to be a string, yet wants the ease of use provided by list commands. This is why I think the problem hasn't been solved yet.

Also, why would my code iterate? It's meant be replace his entire code, the foreach, everything. Only thing I left out were two [joins] at the bottom to return the two lists to strings. Mostly because I'm confused at this point.. laff
n
nml375
Revered One
Posts: 2860
Joined: Fri Aug 04, 2006 2:09 pm

Post by nml375 »

I believe this is straying away from the topic and turning into a mere academic question.

Needless to say, earlier posts by ultralord do suggest he is treating it as a list, adding elements with linsert.
And by iterate, I'm referring to the next time the command is executed...

@speechles:
Oh btw, my code is coherent, whereas yours isn't *nag* ;)
NML_375
User avatar
speechles
Revered One
Posts: 1398
Joined: Sat Aug 26, 2006 10:19 pm
Location: emerald triangle, california (coastal redwoods)

Post by speechles »

nml375 wrote:@speechles:
Oh btw, my code is coherent, whereas yours isn't *nag* ;)
Mine is simplified on purpose to show ultralord how to do this himself. I wasn't trying to show off or anything, just trying to be helpful was all. Not to stray off topic or anything, but yes, I do believe ultralord has some confusion regarding strings vs lists. :P
User avatar
ultralord
Master
Posts: 255
Joined: Mon Nov 06, 2006 6:52 pm

Post by ultralord »

thnkx again for all answers.. i try these ways to do my work.. and i have one last problem the problem is when i split like speechles the g_teamaserver or g_teambserver the problem is from others of my procs because is "reading" all the nicks but the only thing what i want is to set 4 nicks of 5 (nick1 nick2 nick3 nick4 nick5) on g_teamaserver or g_teambserver if g_serverholder is one of these nicks(1...5)

thanks for all your opinion i unterestand now how it works lsearch .. but how i can do that ?


i have many confusions heh i havent so much time to do all the things but i try :/
User avatar
speechles
Revered One
Posts: 1398
Joined: Sat Aug 26, 2006 10:19 pm
Location: emerald triangle, california (coastal redwoods)

Post by speechles »

ultralord wrote:and i have one last problem the problem is when i split like speechles the g_teamaserver or g_teambserver the problem is from others of my procs because is "reading" all the nicks
This is because it lacks the join necessary.

Code: Select all

set g_teamaserver [split $g_teamaserver]
set g_teambserver [split $g_teambserver]
If {[set founda [lsearch -exact  $g_teamaserver $g_serverholder]] != -1} {
   set g_teamaserver [lreplace $g_teamaserver $founda $founda]
} elseif {[set foundb [lsearch -exact $g_teambserver $g_serverholder]] != -1} {
   set g_teambserver [lreplace $g_teambserver $foundb $foundb]
}
set g_teamaserver [join $g_teamaserver]
set g_teambserver [join $g_teambserver]
Possibly? If there is still an issue, remove both pairs of set lines containing [splits] and [joins] (or simply use nml375's code) and try again. One of these ways has to work.. *crosses fingers*
note: the only way it wouldn't would be case insensitive detection. So if your using [string tolower] anywhere you might need to do it to the list and target before attempting the lsearch (it lacks -nocase option for some reason).
User avatar
ultralord
Master
Posts: 255
Joined: Mon Nov 06, 2006 6:52 pm

Post by ultralord »

thnx again.. so.. i try again with 2 codes to fix my issue but nothing.. look one proc ( with that proc i add nicks on teamaserver teambserver)

Code: Select all

proc g_addme { nick uhost handle channel team } {
  global g_teamaserver g_teambserver g_playernumber addid addteama addteamb g_serverholder g_lastinfoteama g_lastinfoteamb ids g_last g_last2 g_spamchannel g_spamchannel2 g_spamchannel3 g_spamchanneltest g_spamchannel4 g_spamchannel5 g_spamchannel6 g_spamchannel7 g_spamchannel8 g_spamchannel9 g_maxpl g_pickupchan g_active g_quality g_shutupchan g_playerleft
  set channel [string tolower $channel]
  if { $channel == $g_pickupchan } { 
    if { $g_shutupchan == 0 } {
      if { $g_active == 1 } {
        set team [string tolower $team]
        set nick [g_charfilter $nick]
        if { $team == "" } {
          set numberteama [lsearch -exact $g_teamaserver $nick ]
          set numberteamb [lsearch -exact $g_teambserver $nick ]
          set ispresent [expr $numberteama + $numberteamb]
          if { $ispresent == -2 } {
            if { [llength $g_teambserver] < [llength $g_teamaserver] } {
              set team b
            } else {
              set team a
            }
          } else {
            putserv "NOTICE $nick :[g_txt addme1]"
            return 0
          }
        }
        if { $g_quality == 1 } {
          if { ( [isvoice $nick $channel] ) || ( [isop $nick $channel] ) } {
            if { ( [lsearch -exact $team a ] >-1 ) && ( [lsearch -exact $g_teamaserver $nick ] <0 ) && ( [llength $g_teamaserver] < [expr $g_maxpl/2] ) } {
              set g_teamaserver [linsert $g_teamaserver end $nick ]
              if {[lsearch -exact $g_teambserver $nick ] >-1 } {
                set playerindex [lsearch -exact $g_teambserver $nick ]
                set g_teambserver [lreplace $g_teambserver $playerindex $playerindex ]
 if {[set idx [lsearch -exact $g_teamaserver $g_serverholder]] => 0} {
  set g_teamaserver [lreplace $g_teamaserver $idx $idx] 
              }
              set g_playernumber [expr [llength $g_teamaserver]+[llength $g_teambserver]]
              g_settopic
            } elseif { ( [lsearch -exact $team b] >-1 ) && ( [lsearch -exact $g_teambserver $nick ] <0 ) && ( [llength $g_teambserver] < [expr $g_maxpl/2] ) } {
              set g_teambserver [linsert $g_teambserver end $nick ]
              if {[lsearch -exact $g_teamaserver $nick ] >-1 } {
                set playerindex [lsearch -exact $g_teamaserver $nick ]
                set g_teamaserver [lreplace $g_teamaserver $playerindex $playerindex ]
 if {[set idx [lsearch -exact $g_teambserver $g_serverholder]] => 0} {
  set g_teambserver [lreplace $g_teambserver $idx $idx] 
              }
              set g_playernumber [expr [llength $g_teamaserver]+[llength $g_teambserver]]
              g_settopic
            } else {
              putserv "NOTICE $nick :[g_txt addme1]"
            }
            if { $g_playernumber == $g_maxpl } {
              g_launchgame
              set g_quality 0
            } elseif { $g_playernumber > [expr $g_maxpl - $g_playerleft] } {
              set g_playerneeded [expr $g_maxpl -$g_playernumber]
              putserv "NOTICE $channel :[g_txt start5] $channel !! [g_txt separator2] $g_playerneeded [g_txt start6]"
NOTICE $g_spamchanneltest :[g_txt start5] $channel !! [g_txt separator2] $g_playerneeded [g_txt start6]"
            }
          } else {
            putserv "NOTICE $nick :[g_txt addme2]"
          }
        } elseif { $g_quality == 0 } {
          if { ( [lsearch -exact $team a ] >-1 ) && ( [lsearch -exact $g_teamaserver $nick ] <0 ) && ( [llength $g_teamaserver] < [expr $g_maxpl/2] ) } {
            set g_teamaserver [linsert $g_teamaserver end $nick ]
            if {[lsearch -exact $g_teambserver $nick ] >-1 } {
              set playerindex [lsearch -exact $g_teambserver $nick ]
              set g_teambserver [lreplace $g_teambserver $playerindex $playerindex ]
            }
            set g_playernumber [expr [llength $g_teamaserver]+[llength $g_teambserver]]
            g_settopic
          } elseif { ( [lsearch -exact $team b] >-1 ) && ( [lsearch -exact $g_teambserver $nick ] <0 ) && ( [llength $g_teambserver] < [expr $g_maxpl/2] ) } {
            set g_teambserver [linsert $g_teambserver end $nick ]
            if {[lsearch -exact $g_teamaserver $nick ] >-1 } {
              set playerindex [lsearch -exact $g_teamaserver $nick ]
              set g_teamaserver [lreplace $g_teamaserver $playerindex $playerindex ]
            }
            set g_playernumber [expr [llength $g_teamaserver]+[llength $g_teambserver]]
            g_settopic
          } else {
            putserv "NOTICE $nick :[g_txt addme1]"
          }
          if { $g_playernumber == $g_maxpl } {
            g_launchgame
          } elseif { $g_playernumber > [expr $g_maxpl - $g_playerleft] } {
            set g_playerneeded [expr $g_maxpl - $g_playernumber]
            putserv "NOTICE $channel :[g_txt start5] $channel !! [g_txt separator2] $g_playerneeded [g_txt start6]"
putserv "NOTICE $g_spamchanneltest :[g_txt start5] $channel !! [g_txt separator2] $g_playerneeded [g_txt start6]"
          }
        }
      } else {
        putserv "NOTICE $nick :[g_txt addme3]"
      }
    } else {
      putserv "NOTICE $nick :[g_txt addme4]"
    }
  }
}
}
}
and i have that error when i add

Code: Select all

Tcl error [g_addme]: syntax error in expression "[set idx [lsearch -exact $g_teamaserver $g_serverholder]] =>...": extra tokens at end of expression
thnx again..
User avatar
speechles
Revered One
Posts: 1398
Joined: Sat Aug 26, 2006 10:19 pm
Location: emerald triangle, california (coastal redwoods)

Post by speechles »

ultralord wrote: and i have that error when i add

Code: Select all

Tcl error [g_addme]: syntax error in expression "[set idx [lsearch -exact $g_teamaserver $g_serverholder]] =>...": extra tokens at end of expression
thnx again..
< > <= >=
Boolean less, greater, less than or equal, and greater than or equal. Each operator produces 1 if the condition is true, 0 otherwise. These operators may be applied to strings as well as numeric operands, in which case string comparison is used.
Change the: => to look like this: >=
User avatar
ultralord
Master
Posts: 255
Joined: Mon Nov 06, 2006 6:52 pm

Post by ultralord »

thnx. i change that you said and nothing.. also i modified my previus proc to :

Code: Select all

proc g_addme { nick uhost handle channel team } {
  global g_teamaserver g_teambserver g_playernumber g_findadmin g_serverholder addid addteama addteamb  g_lastinfoteama g_lastinfoteamb ids g_last g_last2 g_spamchannel g_spamchannel2 g_spamchannel3 g_spamchanneltest g_spamchannel4 g_spamchannel5 g_spamchannel6 g_spamchannel7 g_spamchannel8 g_spamchannel9 g_maxpl g_pickupchan g_active g_quality g_shutupchan g_playerleft
  set channel [string tolower $channel]
  if { $channel == $g_pickupchan } { 
    if { $g_shutupchan == 0 } {
      if { $g_active == 1 } {
if { $nick == $g_serverholder } {
        set team [string tolower $team]
set nick [g_charfilter $nick]
        if { $team == "" } {
          set numberteama [lsearch -exact $g_teamaserver $nick ]
          set numberteamb [lsearch -exact $g_teambserver $nick ]
          set ispresent [expr $numberteama + $numberteamb]
          if { $ispresent == -2 } {
            if { [llength $g_teambserver] < [llength $g_teamaserver] } {
              set team b
            } else {
              set team a
            }
          } else {
            putserv "NOTICE $nick :[g_txt addme1]"
            return 0
          }
        }
        if { $g_quality == 1 } {
          if { ( [isvoice $nick $channel] ) || ( [isop $nick $channel] ) } {
            if { ( [lsearch -exact $team a ] >-1 ) && ( [lsearch -exact $g_teamaserver $nick ] <0 ) && ( [llength $g_teamaserver] < [expr $g_maxpl/2] ) } {
              set g_teamaserver [linsert $g_teamaserver end $nick ]
              if {[lsearch -exact $g_teambserver $nick ] >-1 } {
                set playerindex [lsearch -exact $g_teambserver $nick ]
                set g_teambserver [lreplace $g_teambserver $playerindex $playerindex ]
 if {[set idx [lsearch -exact $g_teamaserver $g_serverholder]] >= 0} {
  set g_teamaserver [lreplace $g_teamaserver $idx $idx]
 } elseif {[set idx [lsearch -exact $g_teambserver $g_serverholder]] >= 0} {
  set g_teambserver [lreplace $g_teambserver $idx $idx]
 } 
}
              set g_playernumber [expr [llength $g_teamaserver]+[llength $g_teambserver]]
              g_settopic
            } elseif { ( [lsearch -exact $team b] >-1 ) && ( [lsearch -exact $g_teambserver $nick ] <0 ) && ( [llength $g_teambserver] < [expr $g_maxpl/2] ) } {
              set g_teambserver [linsert $g_teambserver end $nick ]
              if {[lsearch -exact $g_teamaserver $nick ] >-1 } {
                set playerindex [lsearch -exact $g_teamaserver $nick ]
                set g_teamaserver [lreplace $g_teamaserver $playerindex $playerindex ]
 if {[set idx [lsearch -exact $g_teamaserver $g_serverholder]] >= 0} {
  set g_teamaserver [lreplace $g_teamaserver $idx $idx]
 } elseif {[set idx [lsearch -exact $g_teambserver $g_serverholder]] >= 0} {
  set g_teambserver [lreplace $g_teambserver $idx $idx]
 } 
}
              set g_playernumber [expr [llength $g_teamaserver]+[llength $g_teambserver]]
              g_settopic
            } else {
              putserv "NOTICE $nick :[g_txt addme1]"
            }
            if { $g_playernumber == $g_maxpl } {
              g_launchgame
              set g_quality 0
            } elseif { $g_playernumber > [expr $g_maxpl - $g_playerleft] } {
              set g_playerneeded [expr $g_maxpl -$g_playernumber]
              putserv "NOTICE $channel :[g_txt start5] $channel !! [g_txt separator2] $g_playerneeded [g_txt start6]"
NOTICE $g_spamchanneltest :[g_txt start5] $channel !! [g_txt separator2] $g_playerneeded [g_txt start6]"
            }
          } else {
            putserv "NOTICE $nick :[g_txt addme2]"
          }
        } elseif { $g_quality == 0 } {
          if { ( [lsearch -exact $team a ] >-1 ) && ( [lsearch -exact $g_teamaserver $nick ] <0 ) && ( [llength $g_teamaserver] < [expr $g_maxpl/2] ) } {
            set g_teamaserver [linsert $g_teamaserver end $nick ]
            if {[lsearch -exact $g_teambserver $nick ] >-1 } {
              set playerindex [lsearch -exact $g_teambserver $nick ]
              set g_teambserver [lreplace $g_teambserver $playerindex $playerindex ]
            }
            set g_playernumber [expr [llength $g_teamaserver]+[llength $g_teambserver]]
            g_settopic
          } elseif { ( [lsearch -exact $team b] >-1 ) && ( [lsearch -exact $g_teambserver $nick ] <0 ) && ( [llength $g_teambserver] < [expr $g_maxpl/2] ) } {
            set g_teambserver [linsert $g_teambserver end $nick ]
            if {[lsearch -exact $g_teamaserver $nick ] >-1 } {
              set playerindex [lsearch -exact $g_teamaserver $nick ]
              set g_teamaserver [lreplace $g_teamaserver $playerindex $playerindex ]
            }
            set g_playernumber [expr [llength $g_teamaserver]+[llength $g_teambserver]]
            g_settopic
          } else {
            putserv "NOTICE $nick :[g_txt addme1]"
          }
          if { $g_playernumber == $g_maxpl } {
            g_launchgame
          } elseif { $g_playernumber > [expr $g_maxpl - $g_playerleft] } {
            set g_playerneeded [expr $g_maxpl - $g_playernumber]
            putserv "NOTICE $channel :[g_txt start5] $channel !! [g_txt separator2] $g_playerneeded [g_txt start6]"
putserv "NOTICE $g_spamchanneltest :[g_txt start5] $channel !! [g_txt separator2] $g_playerneeded [g_txt start6]"
          }
        }
} else {
set team [string tolower $team]
        set nick [g_charfilter $nick]
        if { $team == "" } {
          set numberteama [lsearch -exact $g_teamaserver $nick ]
          set numberteamb [lsearch -exact $g_teambserver $nick ]
          set ispresent [expr $numberteama + $numberteamb]
          if { $ispresent == -2 } {
            if { [llength $g_teambserver] < [llength $g_teamaserver] } {
              set team b
            } else {
              set team a
            }
          } else {
            putserv "NOTICE $nick :[g_txt addme1]"
            return 0
          }
        }
        if { $g_quality == 1 } {
          if { ( [isvoice $nick $channel] ) || ( [isop $nick $channel] ) } {
            if { ( [lsearch -exact $team a ] >-1 ) && ( [lsearch -exact $g_teamaserver $nick ] <0 ) && ( [llength $g_teamaserver] < [expr $g_maxpl/2] ) } {
              set g_teamaserver [linsert $g_teamaserver end $nick ]
              if {[lsearch -exact $g_teambserver $nick ] >-1 } {
                set playerindex [lsearch -exact $g_teambserver $nick ]
                set g_teambserver [lreplace $g_teambserver $playerindex $playerindex ]
              }
              set g_playernumber [expr [llength $g_teamaserver]+[llength $g_teambserver]]
              g_settopic
            } elseif { ( [lsearch -exact $team b] >-1 ) && ( [lsearch -exact $g_teambserver $nick ] <0 ) && ( [llength $g_teambserver] < [expr $g_maxpl/2] ) } {
              set g_teambserver [linsert $g_teambserver end $nick ]
              if {[lsearch -exact $g_teamaserver $nick ] >-1 } {
                set playerindex [lsearch -exact $g_teamaserver $nick ]
                set g_teamaserver [lreplace $g_teamaserver $playerindex $playerindex ]
              }
              set g_playernumber [expr [llength $g_teamaserver]+[llength $g_teambserver]]
              g_settopic
            } else {
              putserv "NOTICE $nick :[g_txt addme1]"
            }
            if { $g_playernumber == $g_maxpl } {
              g_launchgame
              set g_quality 0
            } elseif { $g_playernumber > [expr $g_maxpl - $g_playerleft] } {
              set g_playerneeded [expr $g_maxpl -$g_playernumber]
              putserv "NOTICE $channel :[g_txt start5] $channel !! [g_txt separator2] $g_playerneeded [g_txt start6]"
NOTICE $g_spamchanneltest :[g_txt start5] $channel !! [g_txt separator2] $g_playerneeded [g_txt start6]"
            }
          } else {
            putserv "NOTICE $nick :[g_txt addme2]"
          }
        } elseif { $g_quality == 0 } {
          if { ( [lsearch -exact $team a ] >-1 ) && ( [lsearch -exact $g_teamaserver $nick ] <0 ) && ( [llength $g_teamaserver] < [expr $g_maxpl/2] ) } {
            set g_teamaserver [linsert $g_teamaserver end $nick ]
            if {[lsearch -exact $g_teambserver $nick ] >-1 } {
              set playerindex [lsearch -exact $g_teambserver $nick ]
              set g_teambserver [lreplace $g_teambserver $playerindex $playerindex ]
            }
            set g_playernumber [expr [llength $g_teamaserver]+[llength $g_teambserver]]
            g_settopic
          } elseif { ( [lsearch -exact $team b] >-1 ) && ( [lsearch -exact $g_teambserver $nick ] <0 ) && ( [llength $g_teambserver] < [expr $g_maxpl/2] ) } {
            set g_teambserver [linsert $g_teambserver end $nick ]
            if {[lsearch -exact $g_teamaserver $nick ] >-1 } {
              set playerindex [lsearch -exact $g_teamaserver $nick ]
              set g_teamaserver [lreplace $g_teamaserver $playerindex $playerindex ]
            }
            set g_playernumber [expr [llength $g_teamaserver]+[llength $g_teambserver]]
            g_settopic
          } else {
            putserv "NOTICE $nick :[g_txt addme1]"
          }
          if { $g_playernumber == $g_maxpl } {
            g_launchgame
          } elseif { $g_playernumber > [expr $g_maxpl - $g_playerleft] } {
            set g_playerneeded [expr $g_maxpl - $g_playernumber]
            putserv "NOTICE $channel :[g_txt start5] $channel !! [g_txt separator2] $g_playerneeded [g_txt start6]"
putserv "NOTICE $g_spamchanneltest :[g_txt start5] $channel !! [g_txt separator2] $g_playerneeded [g_txt start6]"
}
}
}
      } else {
        putserv "NOTICE $nick :[g_txt addme3]"
      }
    } else {
      putserv "NOTICE $nick :[g_txt addme4]"
    }
  }
}
but nothing wotking ok.. but my nick is on g_teamaserver or g_teambservers doesnt removed.. :/
n
nml375
Revered One
Posts: 2860
Joined: Fri Aug 04, 2006 2:09 pm

Post by nml375 »

To me, it looks like you are doing pretty much the same thing over and over in the code, making it unnecessary complex with deep conditional-constructs.

In many cases, isolating dominant conditions helps making the code alot more manageable:

Code: Select all

if {$channel == $g_pickupchan} {
 if {$g_shutupchan == 0} {
  if {$g_active == 1} {
...
  } else {
   putserv "NOTICE $nick :[g_txt addme3]"
  }
 } else {
  putserv "NOTICE $nick :[g_txt addme4]"
 }
}

## considder using this instead:
if {$channel != $g_pickupchan} {
 return 0
}
if {$g_shutupchan != 0} {
 putserv "NOTICE $nick :[g_txt addme4]"
 return 0
}
if {$g_active != 1} {
 putserv "NOTICE $nick :[g_txt addme3]"
 return 0
}
...
Also, I'm not sure what purpose g_quality has, as I really can't see much difference between the codeblocks.. possibly other than one requires voice/op and the other doesn't?
Further, both of those blocks look.. rather messy, doing the very same lsearch'es over and over.

Also, in a few places, you've left out the puthelp/putserv command when trying to send a notice to the channel.

More, you have a test whether nick == g_serverholder, yet you try to remove both nick and g_serverholder from the lists - which should mean you are doing the same work over and over again. And to be honest, I can't see any differences in the code in the two blocks here either.

Now, I'm not trying to rant at your code or such, but I would suggest you try and "compact" and "group" your code. That is, try avoiding doing the very same tasks in 5 different places if you don't need to;
  • The added voice/op-check when g_quality is set to 1 could simply be merged into a single conditional statement, rather than having two identical blocks doing the very same thing (apart for the added voice/op-check).
  • Rather than doing one lsearch to see whether the item exists in the list, and then do a second one to store the index, save it to a variable first and then test it.
Doing these steps may not instantly fix your problems, but it would make it easier to find them as the code generally gets easier to read.
NML_375
Post Reply