I apologise, the first time I tried your line of code it didn't appear to give me what I wanted. Tried again and realised I must of done something wrong.

Unfortunately what I'm trying to achieve isn't quite as simple as what I first put.

Code:
on *:Text:!level:#:{
  var %exp = $readini(Exp.ini,$+(#,.,$nick),Exp) 
  if (%exp isnum 1-5) { %exp = - Recruit - }
  elseif (%exp isnum 6-13) { %exp = ○ Apprentice ○ }
  elseif (%exp isnum 14-22) { %exp = ● Private ● }
  elseif (%exp isnum 23-33) { %exp = ◇ Corporal ◇ }
  msg # $nick is a Level $iif($readini(Rank.ini,$+(#,.,$nick),Rank),$v1 Rank.,0 %exp with $iif($readini(Exp.ini,$+(#,.,$nick),Exp),$v1 Exp.,0  Exp. Stay active to gain Exp)
}


As you can see I also have a separate "Rank" which is also displayed. This is on a separate timer.

Ideal outcome "Nick is a Level 20 - recruit - with 102 Exp."

Ideal outcome if new user "Nick is a Level 0 with 0 Exp. Please stay active to gain Exp.

Now, as you can see I have tried to edit the line you gave me suit this. This clearly doesn't work, I'm guessing I can't have the two $iif in one line? If so what is the alternative please?

Sorry to be a pain also how would I go about maxing the "rank" level at 50 as I have not used the isnum method for this and it just simply adds 1 to the rank every 40 minutes. Is it possible to stop this going past 50?

Code:
on !*:join:#:{
  $+(.timerrank.,#,.,$nick) 0 2880 add.pts $+(#,.,$nick)
  add.pts $+(#,.,$nick)
  if ((%floodjoin) || ($($+(%,floodjoin.,$nick),2))) { return }
  set -u10 %floodjoin On
  set -u30 %floodjoin. $+ $nick On
}
on !*:part:#:$+(.timerrank.,#,.,$nick) off
alias -l add.pts {
  writeini -n Rank.ini $1 Rank $calc($readini(Rank.ini,$1,Rank) + 1)
  if ((%floodpart) || ($($+(%,floodpart.,$nick),2))) { return }
  set -u10 %floodpart On
  set -u30 %floodpart. $+ $nick On

Thanks for the help. Very much appreciated smile