package net.pocketmine.server;
import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.PrintWriter;
import java.security.SecureRandom;
import java.util.LinkedHashMap;
import java.util.Map;
import net.pocketmine.server.R;
import com.actionbarsherlock.app.SherlockActivity;
import com.actionbarsherlock.view.Menu;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.os.Bundle;
import android.text.InputType;
import android.util.Log;
import android.view.KeyEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.EditText;
import android.widget.LinearLayout;
import android.widget.CompoundButton.OnCheckedChangeListener;
import android.widget.SeekBar;
import android.widget.SeekBar.OnSeekBarChangeListener;
import android.widget.TextView;
import android.widget.Toast;
import android.widget.ToggleButton;
public class ConfigActivity extends SherlockActivity {
private Boolean install = false;
public LinkedHashMap<String, String> values = null;
public String ram = "64";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_config);
install = getIntent().getBooleanExtra("install", false);
final CheckBox showAdvanced = (CheckBox) findViewById(R.id.config_advanced);
final TextView advancedLabel = (TextView) findViewById(R.id.config_advanced_label);
final LinearLayout advanced = (LinearLayout) findViewById(R.id.config_advanced_layout);
advanced.setVisibility(View.GONE);
advancedLabel.setVisibility(View.GONE);
showAdvanced.setOnCheckedChangeListener(new OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton sender, boolean checked) {
advanced.setVisibility(checked ? View.VISIBLE : View.GONE);
advancedLabel.setVisibility(checked ? View.VISIBLE : View.GONE);
}
});
final Button saveBtn = (Button) findViewById(R.id.config_save);
saveBtn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
save();
finish();
}
});
final Button cancelBtn = (Button) findViewById(R.id.config_cancel);
cancelBtn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
finish();
}
});
cancelBtn.setVisibility(install ? View.GONE : View.VISIBLE);
final TextView spawnprotect = (TextView) findViewById(R.id.config_spawnprotect);
final ToggleButton spawnprotect_toggle = (ToggleButton) findViewById(R.id.config_spawnprotect_enable);
spawnprotect_toggle
.setOnCheckedChangeListener(new OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton sender,
boolean checked) {
if (checked) {
spawnprotect.setEnabled(true);
spawnprotect.setText("16");
} else {
spawnprotect.setEnabled(false);
spawnprotect.setText("-1");
}
}
});
final Button whitelist_edit = (Button) findViewById(R.id.config_whitelist_edit); // no
// need
// to
// disable
whitelist_edit.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
startActivity(new Intent(ConfigActivity.this,
WhitelistActivity.class));
}
});
final ToggleButton gamemode_survival = (ToggleButton) findViewById(R.id.config_survival);
final ToggleButton gamemode_creative = (ToggleButton) findViewById(R.id.config_creative);
final ToggleButton gamemode_adventure = (ToggleButton) findViewById(R.id.config_adventure);
final ToggleButton gamemode_spectator = (ToggleButton) findViewById(R.id.config_spectator);
final ToggleButton ram64 = (ToggleButton) findViewById(R.id.config_ram64);
final ToggleButton ram128 = (ToggleButton) findViewById(R.id.config_ram128);
final ToggleButton ram256 = (ToggleButton) findViewById(R.id.config_ram256);
final ToggleButton ramCustom = (ToggleButton) findViewById(R.id.config_ramCustom);
final ToggleButton difficulty_peaceful = (ToggleButton) findViewById(R.id.config_peaceful);
final ToggleButton difficulty_easy = (ToggleButton) findViewById(R.id.config_easy);
final ToggleButton difficulty_normal = (ToggleButton) findViewById(R.id.config_normal);
final ToggleButton difficulty_hard = (ToggleButton) findViewById(R.id.config_hard);
final SeekBar viewDistance = (SeekBar) findViewById(R.id.config_distance);
final TextView viewDistanceValue = (TextView) findViewById(R.id.config_distance_value);
final TextView viewDistanceWarning = (TextView) findViewById(R.id.config_distance_warning);
viewDistance.setOnSeekBarChangeListener(new OnSeekBarChangeListener() {
Boolean displayingWarning = true;
@Override
public void onStopTrackingTouch(SeekBar bar) {
}
@Override
public void onStartTrackingTouch(SeekBar bar) {
}
@Override
public void onProgressChanged(SeekBar bar, int progress,
boolean fromUser) {
int val = progress + 3;
viewDistanceValue.setText("" + val);
if (val > 10 && !displayingWarning) {
viewDistanceWarning.setVisibility(View.VISIBLE);
displayingWarning = true;
} else if (val <= 10 && displayingWarning) {
viewDistanceWarning.setVisibility(View.GONE);
displayingWarning = false;
}
}
});
readFile();
setValue(R.id.config_name, "server-name", "Minecraft: PE Server");
setValue(R.id.config_port, "server-port", "19132");
gamemode_survival.setChecked(false);
gamemode_creative.setChecked(false);
gamemode_adventure.setChecked(false);
gamemode_spectator.setChecked(false);
if (values.containsKey("gamemode")) {
String gamemode = values.get("gamemode");
if (gamemode.equals("0")) {
gamemode_survival.setChecked(true);
} else if (gamemode.equals("1")) {
gamemode_creative.setChecked(true);
} else if (gamemode.equals("2")) {
gamemode_adventure.setChecked(true);
} else if (gamemode.equals("3")) {
gamemode_spectator.setChecked(true);
} else {
gamemode_survival.setChecked(true);
}
} else {
gamemode_survival.setChecked(true);
}
setValue(R.id.config_players, "max-players", "20");
if (values.containsKey("spawn-protection")
&& !values.get("spawn-protection").equals("-1")) {
try {
spawnprotect.setText(Integer.parseInt(values
.get("spawn-protection")) + ""); // no, that isn't a
// nonsense
spawnprotect_toggle.setChecked(true);
} catch (Exception e) {
e.printStackTrace();
}
} else {
spawnprotect_toggle.setChecked(false);
}
setValue(R.id.config_whitelist, "whitelist", false);
setValue(R.id.config_query, "enable-query", true);
setValue(R.id.config_rcon, "enable-rcon", false);
setValue(R.id.config_desc, "description",
"Server made using PocketMine-MP");
setValue(R.id.config_motd, "motd", "Welcome @player to this server!");
//setValue(R.id.config_ip, "server-ip", "");
// *server-type
ram64.setChecked(false);
ram128.setChecked(false);
ram256.setChecked(false);
ramCustom.setChecked(false);
if (values.containsKey("memory-limit")) {
ram = values.get("memory-limit");
if (ram.endsWith("M")) {
ram = ram.substring(0, ram.length() - 1);
}
if (ram.equals("64")) {
ram64.setChecked(true);
} else if (ram.equals("128")) {
ram128.setChecked(true);
} else if (ram.equals("256")) {
ram256.setChecked(true);
} else {
try {
Integer.parseInt(ram);
ramCustom.setChecked(true);
} catch (Exception e) {
ram = "128";
ram128.setChecked(true);
}
}
} else {
ram128.setChecked(true);
ram = "128";
}
// *last-update
setValue(R.id.config_achievements, "announce-player-achievements", true);
if (values.containsKey("view-distance")) {
try {
int v = Integer.parseInt(values.get("view-distance")) - 3;
if (v >= 0 && v <= 13) {
viewDistance.setProgress(v);
}
} catch (Exception e) {
e.printStackTrace();
viewDistance.setProgress(7); // 10-3 = 7
}
} else {
viewDistance.setProgress(7); // 10-3 = 7
}
setValue(R.id.config_fly, "allow-flight", false);
// *spawn-monsters
// *spawn-mobs
setValue(R.id.config_hardcore, "hardcore", false);
setValue(R.id.config_pvp, "pvp", true);
difficulty_peaceful.setChecked(false);
difficulty_easy.setChecked(false);
difficulty_normal.setChecked(false);
difficulty_hard.setChecked(false);
if (values.containsKey("difficulty")) {
String difficulty = values.get("difficulty");
if (difficulty.equals("0")) {
difficulty_peaceful.setChecked(true);
} else if (difficulty.equals("1")) {
difficulty_easy.setChecked(true);
} else if (difficulty.equals("2")) {
difficulty_normal.setChecked(true);
} else if (difficulty.equals("3")) {
difficulty_hard.setChecked(true);
} else {
difficulty_easy.setChecked(true);
}
} else {
difficulty_easy.setChecked(true);
}
setValue(R.id.config_generator_settings, "generator-settings", "");
setValue(R.id.config_level_name, "level-name", "world");
setValue(R.id.config_level_seed, "level-seed", "");
setValue(R.id.config_level_type, "level-type", "DEFAULT");
setValue(R.id.config_rcon_password, "rcon.password",
generatePassword(5, 50));
setValue(R.id.config_autosave, "auto-save", true);
}
private void setValue(int resId, String name, String defaultValue) {
TextView tv = (TextView) findViewById(resId);
if (values.containsKey(name)) {
tv.setText(values.get(name));
} else {
tv.setText(defaultValue);
}
}
private void setValue(int resId, String name, Boolean defaultValue) {
CompoundButton tv = (CompoundButton) findViewById(resId);
if (values.containsKey(name)) {
tv.setChecked(values.get(name).equals("on"));
} else {
tv.setChecked(defaultValue);
}
}
public void save() {
final ToggleButton gamemode_survival = (ToggleButton) findViewById(R.id.config_survival);
final ToggleButton gamemode_creative = (ToggleButton) findViewById(R.id.config_creative);
final ToggleButton gamemode_adventure = (ToggleButton) findViewById(R.id.config_adventure);
final ToggleButton gamemode_spectator = (ToggleButton) findViewById(R.id.config_spectator);
final ToggleButton difficulty_peaceful = (ToggleButton) findViewById(R.id.config_peaceful);
final ToggleButton difficulty_easy = (ToggleButton) findViewById(R.id.config_easy);
final ToggleButton difficulty_normal = (ToggleButton) findViewById(R.id.config_normal);
final ToggleButton difficulty_hard = (ToggleButton) findViewById(R.id.config_hard);
final SeekBar viewDistance = (SeekBar) findViewById(R.id.config_distance);
putValueString(R.id.config_name, "server-name");
putValueString(R.id.config_port, "server-port");
// find out gamemode
String gamemode = "0";
if (gamemode_survival.isChecked()) {
gamemode = "0";
} else if (gamemode_creative.isChecked()) {
gamemode = "1";
} else if (gamemode_adventure.isChecked()) {
gamemode = "2";
} else if (gamemode_spectator.isChecked()) {
gamemode = "3";
}
values.put("gamemode", gamemode);
putValueString(R.id.config_players, "max-players");
putValueString(R.id.config_spawnprotect, "spawn-protection");
putValueBool(R.id.config_whitelist, "whitelist");
putValueBool(R.id.config_query, "enable-query");
putValueBool(R.id.config_rcon, "enable-rcon");
//putValueBool(R.id.config_usage, "send-usage");
putValueString(R.id.config_desc, "description");
putValueString(R.id.config_motd, "motd");
//putValueString(R.id.config_ip, "server-ip");
if (!values.containsKey("server-type"))
values.put("server-type", "normal");
values.put("memory-limit", ram + "M");
if (!values.containsKey("last-update"))
values.put("last-update", "off");
putValueBool(R.id.config_achievements, "announce-player-achievements");
values.put("view-distance", (viewDistance.getProgress() + 3) + "");
putValueBool(R.id.config_fly, "allow-flight");
if (!values.containsKey("spawn-animals"))
values.put("spawn-animals", "on");
if (!values.containsKey("spawn-mobs"))
values.put("spawn-mobs", "on");
putValueBool(R.id.config_hardcore, "hardcore");
putValueBool(R.id.config_pvp, "pvp");
String difficulty = "0";
if (difficulty_peaceful.isChecked()) {
difficulty = "0";
} else if (difficulty_easy.isChecked()) {
difficulty = "1";
} else if (difficulty_normal.isChecked()) {
difficulty = "2";
} else if (difficulty_hard.isChecked()) {
difficulty = "3";
}
values.put("difficulty", difficulty);
putValueString(R.id.config_generator_settings, "generator-settings");
putValueString(R.id.config_level_name, "level-name");
if (values.get("level-name").equals("")) {
values.put("level-name", "world");
}
putValueString(R.id.config_level_seed, "level-seed");
putValueString(R.id.config_level_type, "level-type");
putValueString(R.id.config_rcon_password, "rcon.password");
putValueBool(R.id.config_autosave, "auto-save");
try {
PrintWriter writer = new PrintWriter(ServerUtils.getDataDirectory()
+ "/server.properties");
for (Map.Entry<String, String> entry : values.entrySet()) {
writer.println(entry.getKey() + "=" + entry.getValue());
}
writer.flush();
writer.close();
Toast.makeText(this, "Saved.", Toast.LENGTH_SHORT).show();
} catch (Exception e) {
Toast.makeText(this, "Saving failed.", Toast.LENGTH_SHORT).show();
}
}
private void putValueString(int resId, String name) {
TextView tv = (TextView) findViewById(resId);
values.put(name, tv.getText().toString());
}
private void putValueBool(int resId, String name) {
CompoundButton tv = (CompoundButton) findViewById(resId);
values.put(name, tv.isChecked() ? "on" : "off");
}
public void setGamemode(View v) {
final ToggleButton gamemode_survival = (ToggleButton) findViewById(R.id.config_survival);
final ToggleButton gamemode_creative = (ToggleButton) findViewById(R.id.config_creative);
final ToggleButton gamemode_adventure = (ToggleButton) findViewById(R.id.config_adventure);
final ToggleButton gamemode_spectator = (ToggleButton) findViewById(R.id.config_spectator);
gamemode_survival.setChecked(false);
gamemode_creative.setChecked(false);
gamemode_adventure.setChecked(false);
gamemode_spectator.setChecked(false);
ToggleButton btn = (ToggleButton) v;
btn.setChecked(true);
}
public void setDifficulty(View v) {
final ToggleButton difficulty_peaceful = (ToggleButton) findViewById(R.id.config_peaceful);
final ToggleButton difficulty_easy = (ToggleButton) findViewById(R.id.config_easy);
final ToggleButton difficulty_normal = (ToggleButton) findViewById(R.id.config_normal);
final ToggleButton difficulty_hard = (ToggleButton) findViewById(R.id.config_hard);
difficulty_peaceful.setChecked(false);
difficulty_easy.setChecked(false);
difficulty_normal.setChecked(false);
difficulty_hard.setChecked(false);
ToggleButton btn = (ToggleButton) v;
btn.setChecked(true);
}
public void setRAM(View v) {
final ToggleButton ram64 = (ToggleButton) findViewById(R.id.config_ram64);
final ToggleButton ram128 = (ToggleButton) findViewById(R.id.config_ram128);
final ToggleButton ram256 = (ToggleButton) findViewById(R.id.config_ram256);
final ToggleButton ramCustom = (ToggleButton) findViewById(R.id.config_ramCustom);
if (v == ram64 || v == ram128 || v == ram256) {
ram64.setChecked(false);
ram128.setChecked(false);
ram256.setChecked(false);
ramCustom.setChecked(false);
}
if (v == ram64) {
ram64.setChecked(true);
ram = "64";
} else if (v == ram128) {
ram128.setChecked(true);
ram = "128";
} else if (v == ram256) {
ram256.setChecked(true);
ram = "256";
} else if (v == ramCustom) {
LinearLayout ll = new LinearLayout(this);
final EditText input = new EditText(this);
LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(
LinearLayout.LayoutParams.MATCH_PARENT,
LinearLayout.LayoutParams.WRAP_CONTENT);
input.setInputType(InputType.TYPE_CLASS_NUMBER);
layoutParams.setMargins(HomeActivity.dip2px(8), 0,
HomeActivity.dip2px(8), 0);
input.setLayoutParams(layoutParams);
ll.addView(input);
new AlertDialog.Builder(this)
.setTitle("Custom...")
.setMessage(
"Select the maximal amount of RAM, which PocketMine can use.")
.setView(ll)
.setPositiveButton("Done",
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog,
int whichButton) {
try {
String out = input.getText().toString();
Integer.parseInt(out);
ram = out;
ram64.setChecked(false);
ram128.setChecked(false);
ram256.setChecked(false);
ramCustom.setChecked(true);
} catch (Exception e) {
e.printStackTrace();
}
}
}).setNegativeButton("Cancel", null).show();
}
}
private void readFile() {
values = new LinkedHashMap<String, String>();
try {
BufferedReader reader = new BufferedReader(new FileReader(
ServerUtils.getDataDirectory() + "/server.properties"));
try {
String line;
while ((line = reader.readLine()) != null) {
if (!line.startsWith("#")) {
int iof = line.indexOf("=");
if (iof == -1) {
Log.e("Configuration parser", "Invalid entry: "
+ line);
} else {
String name = line.substring(0, iof);
String value = line.substring(iof + 1);
Log.d("Configuration parser", "[Parsing] Name: "
+ name + " Value: " + value);
values.put(name, value);
}
}
}
} finally {
reader.close();
}
} catch (FileNotFoundException e) {
// File not found, it's all
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// getSupportMenuInflater().inflate(R.menu.config, menu);
return true;
}
private SecureRandom random = new SecureRandom();
private char[] chars = "QWERTYUIOPASDFGHJKLZXCVBNMqwertyuiopasdfghjklzxcvbnm1234567890"
.toCharArray();
public String generatePassword(int minLen, int maxLen) {
int len = random.nextInt(maxLen - minLen) + minLen;
StringBuilder b = new StringBuilder();
for (int i = 0; i < len; i++) {
b.append(chars[random.nextInt(chars.length)]);
}
return b.toString();
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK && install) {
return true;
}
return super.onKeyDown(keyCode, event);
}
}