As you know, using mIRC's !writini command will add the item and its value to the end of the section, causing the values to be unordered.
By using the filter command, we can retain the numerical sequence of the "level" (value) every time a "command" (item) is added, replaced or removed.
/*
** NOTE:
**
** The following alias adds, replaces or removes
** a command and its admin level in cmd.ini,
** keeping the levels in numerical sequence.
** Syntax:
** SetCommandLevel <NewCmd> <NewCmdLvl>
** Examples:
** SetCommandLevel !givecash 5 ; Add or Replace
** SetCommandLevel !givecash DEL ; Delete
*/
alias SetCommandLevel {
var %NewCmd = $1, %NewCmdLvl = $2
var %file = cmd.ini, %section = COMMANDS
; Create Hidden Window
window -h @cmds
var %a = 1, %b = 2, %c = 1, %t
; Total Commands
%t = $ini(%file,%section,0)
; Hold %file in buffer
while (%a <= %t) { echo @cmds $ini(%file,%section,%a) $readini(%file,%section,$ini(%file,%section,%a)) | inc %a }
; Insert, Replace or remove
; New-Command to buffer
if ($2 isnum) {
$iif( $fline(@cmds,$+(*,%NewCmd,*),1), !rline @cmds $fline(@cmds,$+(*,%NewCmd,*),1) %NewCmd %NewCmdLvl, !aline @cmds %NewCmd %NewCmdLvl )
}
elseif ($2 == DEL) { dline @cmds $fline(@cmds,$+(*,%NewCmd,*),1) }
; Remove original section/values
!remini %file %section
; Readd Section
!write -il1 %file $+([,%section,])
; Sort by level
filter -wwcut 2 32 @cmds @cmds
; Loop through buffer and write back contents
while $line(@cmds,%c) { var %cmd = $gettok($v1,1,32), %lvl = $gettok($v1,2,32) | !write -il $+ %b %file $+(%cmd,=,%lvl) | !inc %b | !inc %c }
; Close window
window -c @cmds
}
By having knowledge of string manipulation, we can also pass multiple values to our custom procedure.
alias SetMultipleCmds {
; Commands to add (separated by space)
var %a, %strCmds = !buycar=1 !sellcar=1 !mycars=1
; Loop through strCmds and pass to "SetCommandLevel"
while (%a <= $numtok(%strCmds,32)) { SetCommandLevel $replace($gettok(%strCmds,%a,32),$chr(61),$chr(32)) | inc %a }
; Remove multipe commands from cmd.ini
; while (%a <= $numtok(%strCmds,32)) { SetCommandLevel $replace($gettok(%strCmds,%a,32),$mid($gettok(%strCmds,%a,32),$pos($gettok(%strCmds,%a,32),=), $len($gettok(%strCmds,%a,32))), $chr(32) DEL) | inc %a }
}