2012-04-27 11:47:11 +02:00
package com.gmail.nossr50.util ;
import java.io.BufferedReader ;
import java.io.FileReader ;
import java.util.ArrayList ;
2013-01-01 04:40:33 +01:00
import java.util.Collections ;
import java.util.Comparator ;
2013-01-15 23:49:20 +01:00
import java.util.HashMap ;
2013-01-01 04:40:33 +01:00
import java.util.List ;
2012-04-27 11:47:11 +02:00
2012-06-07 00:02:22 +02:00
import com.gmail.nossr50.mcMMO ;
2012-04-27 11:47:11 +02:00
import com.gmail.nossr50.datatypes.PlayerStat ;
import com.gmail.nossr50.datatypes.SkillType ;
public class Leaderboard {
2012-06-07 00:02:22 +02:00
private static mcMMO plugin = mcMMO . p ;
2012-07-09 16:55:33 +02:00
private final static String location = mcMMO . getUsersFile ( ) ;
2013-01-15 23:49:20 +01:00
private static HashMap < SkillType , List < PlayerStat > > playerStatHash = new HashMap < SkillType , List < PlayerStat > > ( ) ;
2013-01-16 21:02:41 +01:00
private static long lastUpdate = 0 ;
2013-01-15 23:49:20 +01:00
2012-04-27 11:47:11 +02:00
/ * *
2013-01-15 23:49:20 +01:00
* Update the leader boards .
2012-04-27 11:47:11 +02:00
* /
2013-01-15 23:49:20 +01:00
public static void updateLeaderboards ( ) {
2013-01-16 21:02:41 +01:00
if ( System . currentTimeMillis ( ) < lastUpdate + 600000 ) {
return ; //Only update FFS leaderboards every 10 minutes.. this puts a lot of strain on the server (depending on the size of the database) and should not be done frequently
}
lastUpdate = System . currentTimeMillis ( ) ; //Log when the last update was run
2013-01-15 23:49:20 +01:00
//Initialize lists
List < PlayerStat > mining , woodcutting , herbalism , excavation , acrobatics , repair , swords , axes , archery , unarmed , taming , fishing , powerlevel ;
mining = new ArrayList < PlayerStat > ( ) ;
woodcutting = new ArrayList < PlayerStat > ( ) ;
herbalism = new ArrayList < PlayerStat > ( ) ;
excavation = new ArrayList < PlayerStat > ( ) ;
acrobatics = new ArrayList < PlayerStat > ( ) ;
repair = new ArrayList < PlayerStat > ( ) ;
swords = new ArrayList < PlayerStat > ( ) ;
axes = new ArrayList < PlayerStat > ( ) ;
archery = new ArrayList < PlayerStat > ( ) ;
unarmed = new ArrayList < PlayerStat > ( ) ;
taming = new ArrayList < PlayerStat > ( ) ;
fishing = new ArrayList < PlayerStat > ( ) ;
powerlevel = new ArrayList < PlayerStat > ( ) ;
//Read from the FlatFile database and fill our arrays with information
2012-04-27 11:47:11 +02:00
try {
FileReader file = new FileReader ( location ) ;
BufferedReader in = new BufferedReader ( file ) ;
String line = " " ;
ArrayList < String > players = new ArrayList < String > ( ) ;
while ( ( line = in . readLine ( ) ) ! = null ) {
String [ ] character = line . split ( " : " ) ;
2013-01-14 22:09:11 +01:00
2012-04-27 11:47:11 +02:00
String p = character [ 0 ] ;
int powerLevel = 0 ;
2013-01-15 23:49:20 +01:00
//Prevent the same player from being added multiple times (I'd like to note that this shouldn't happen...)
2012-04-27 11:47:11 +02:00
if ( players . contains ( p ) ) {
continue ;
}
2013-01-10 04:43:21 +01:00
players . add ( p ) ;
2012-04-27 11:47:11 +02:00
if ( character . length > 1 & & Misc . isInt ( character [ 1 ] ) ) {
2013-01-15 23:49:20 +01:00
mining . add ( new PlayerStat ( p , Integer . valueOf ( character [ 1 ] ) ) ) ;
2012-04-27 11:47:11 +02:00
powerLevel + = Integer . valueOf ( character [ 1 ] ) ;
}
if ( character . length > 5 & & Misc . isInt ( character [ 5 ] ) ) {
2013-01-15 23:49:20 +01:00
woodcutting . add ( new PlayerStat ( p , Integer . valueOf ( character [ 5 ] ) ) ) ;
2012-04-27 11:47:11 +02:00
powerLevel + = Integer . valueOf ( character [ 5 ] ) ;
}
if ( character . length > 7 & & Misc . isInt ( character [ 7 ] ) ) {
2013-01-15 23:49:20 +01:00
repair . add ( new PlayerStat ( p , Integer . valueOf ( character [ 7 ] ) ) ) ;
2012-04-27 11:47:11 +02:00
powerLevel + = Integer . valueOf ( character [ 7 ] ) ;
}
if ( character . length > 8 & & Misc . isInt ( character [ 8 ] ) ) {
2013-01-15 23:49:20 +01:00
unarmed . add ( new PlayerStat ( p , Integer . valueOf ( character [ 8 ] ) ) ) ;
2012-04-27 11:47:11 +02:00
powerLevel + = Integer . valueOf ( character [ 8 ] ) ;
}
if ( character . length > 9 & & Misc . isInt ( character [ 9 ] ) ) {
2013-01-15 23:49:20 +01:00
herbalism . add ( new PlayerStat ( p , Integer . valueOf ( character [ 9 ] ) ) ) ;
2012-04-27 11:47:11 +02:00
powerLevel + = Integer . valueOf ( character [ 9 ] ) ;
}
if ( character . length > 10 & & Misc . isInt ( character [ 10 ] ) ) {
2013-01-15 23:49:20 +01:00
excavation . add ( new PlayerStat ( p , Integer . valueOf ( character [ 10 ] ) ) ) ;
2012-04-27 11:47:11 +02:00
powerLevel + = Integer . valueOf ( character [ 10 ] ) ;
}
if ( character . length > 11 & & Misc . isInt ( character [ 11 ] ) ) {
2013-01-15 23:49:20 +01:00
archery . add ( new PlayerStat ( p , Integer . valueOf ( character [ 11 ] ) ) ) ;
2012-04-27 11:47:11 +02:00
powerLevel + = Integer . valueOf ( character [ 11 ] ) ;
}
if ( character . length > 12 & & Misc . isInt ( character [ 12 ] ) ) {
2013-01-15 23:49:20 +01:00
swords . add ( new PlayerStat ( p , Integer . valueOf ( character [ 12 ] ) ) ) ;
2012-04-27 11:47:11 +02:00
powerLevel + = Integer . valueOf ( character [ 12 ] ) ;
}
if ( character . length > 13 & & Misc . isInt ( character [ 13 ] ) ) {
2013-01-15 23:49:20 +01:00
axes . add ( new PlayerStat ( p , Integer . valueOf ( character [ 13 ] ) ) ) ;
2012-04-27 11:47:11 +02:00
powerLevel + = Integer . valueOf ( character [ 13 ] ) ;
}
if ( character . length > 14 & & Misc . isInt ( character [ 14 ] ) ) {
2013-01-15 23:49:20 +01:00
acrobatics . add ( new PlayerStat ( p , Integer . valueOf ( character [ 14 ] ) ) ) ;
2012-04-27 11:47:11 +02:00
powerLevel + = Integer . valueOf ( character [ 14 ] ) ;
}
if ( character . length > 24 & & Misc . isInt ( character [ 24 ] ) ) {
2013-01-15 23:49:20 +01:00
taming . add ( new PlayerStat ( p , Integer . valueOf ( character [ 24 ] ) ) ) ;
2012-04-27 11:47:11 +02:00
powerLevel + = Integer . valueOf ( character [ 24 ] ) ;
}
if ( character . length > 34 & & Misc . isInt ( character [ 34 ] ) ) {
2013-01-15 23:49:20 +01:00
fishing . add ( new PlayerStat ( p , Integer . valueOf ( character [ 34 ] ) ) ) ;
2012-04-27 11:47:11 +02:00
powerLevel + = Integer . valueOf ( character [ 34 ] ) ;
}
2013-01-15 23:49:20 +01:00
powerlevel . add ( new PlayerStat ( p , powerLevel ) ) ;
2012-04-27 11:47:11 +02:00
}
in . close ( ) ;
}
catch ( Exception e ) {
plugin . getLogger ( ) . severe ( ( " Exception while reading " + location + " (Are you sure you formatted it correctly?) " + e . toString ( ) ) ) ;
}
2013-01-01 04:40:33 +01:00
SkillComparator c = new SkillComparator ( ) ;
2013-01-15 23:49:20 +01:00
Collections . sort ( mining , c ) ;
Collections . sort ( woodcutting , c ) ;
Collections . sort ( repair , c ) ;
Collections . sort ( unarmed , c ) ;
Collections . sort ( herbalism , c ) ;
Collections . sort ( excavation , c ) ;
Collections . sort ( archery , c ) ;
Collections . sort ( swords , c ) ;
Collections . sort ( axes , c ) ;
Collections . sort ( acrobatics , c ) ;
Collections . sort ( taming , c ) ;
Collections . sort ( fishing , c ) ;
Collections . sort ( powerlevel , c ) ;
playerStatHash . put ( SkillType . MINING , mining ) ;
playerStatHash . put ( SkillType . WOODCUTTING , woodcutting ) ;
playerStatHash . put ( SkillType . REPAIR , repair ) ;
playerStatHash . put ( SkillType . UNARMED , unarmed ) ;
playerStatHash . put ( SkillType . HERBALISM , herbalism ) ;
playerStatHash . put ( SkillType . EXCAVATION , excavation ) ;
playerStatHash . put ( SkillType . ARCHERY , archery ) ;
playerStatHash . put ( SkillType . SWORDS , swords ) ;
playerStatHash . put ( SkillType . AXES , axes ) ;
playerStatHash . put ( SkillType . ACROBATICS , acrobatics ) ;
playerStatHash . put ( SkillType . TAMING , taming ) ;
playerStatHash . put ( SkillType . FISHING , fishing ) ;
playerStatHash . put ( SkillType . ALL , powerlevel ) ;
2012-04-27 11:47:11 +02:00
}
/ * *
* Retrieve leaderboard info .
*
* @param skillName Skill to retrieve info on .
* @param pagenumber Which page in the leaderboards to retrieve
* @return the requested leaderboard information
* /
2013-01-15 23:49:20 +01:00
public static String [ ] retrieveInfo ( SkillType skillType , int pagenumber ) {
String [ ] info = new String [ 10 ] ;
List < PlayerStat > statsList = playerStatHash . get ( skillType ) ;
if ( statsList ! = null ) {
int destination ;
//How many lines to skip through
2012-04-27 11:47:11 +02:00
if ( pagenumber = = 1 ) {
destination = 0 ;
}
else {
destination = ( pagenumber * 10 ) - 9 ;
}
2013-01-15 23:49:20 +01:00
int currentPos = 0 ;
for ( PlayerStat ps : statsList ) {
if ( currentPos = = 10 )
break ;
if ( destination > 1 ) {
destination - - ;
continue ;
}
info [ currentPos ] = ps . name + " : " + ps . statVal ;
currentPos + + ;
}
} else {
info [ 0 ] = " DummyPlayer:0 " ; //Coming up with a better solution soon...
2012-04-27 11:47:11 +02:00
}
2013-01-15 23:49:20 +01:00
return info ;
2012-04-27 11:47:11 +02:00
}
2013-01-15 23:49:20 +01:00
2013-01-16 20:58:14 +01:00
public static int [ ] getPlayerRank ( String playerName , SkillType skillType ) {
2013-01-15 23:49:20 +01:00
int currentPos = 1 ;
List < PlayerStat > statsList = playerStatHash . get ( skillType ) ;
if ( statsList ! = null ) {
for ( PlayerStat ps : statsList ) {
if ( ps . name . equalsIgnoreCase ( playerName ) ) {
2013-01-16 20:58:14 +01:00
return new int [ ] { currentPos , ps . statVal } ;
2013-01-15 23:49:20 +01:00
} else {
currentPos + + ;
continue ;
}
}
2013-01-16 20:58:14 +01:00
return new int [ ] { 0 } ;
2013-01-15 23:49:20 +01:00
} else {
2013-01-16 20:58:14 +01:00
return new int [ ] { 0 } ;
2012-04-27 11:47:11 +02:00
}
}
2013-01-15 23:49:20 +01:00
2013-01-01 04:40:33 +01:00
private static class SkillComparator implements Comparator < PlayerStat > {
@Override
public int compare ( PlayerStat o1 , PlayerStat o2 ) {
return ( o2 . statVal - o1 . statVal ) ;
}
}
2012-04-27 11:47:11 +02:00
}