/******************************************************************************* * Copyright (c) 2014, 2015 Scott Clarke (scott@dawg6.com). * * This file is part of Dawg6's Demon Hunter DPS Calculator. * * Dawg6's Demon Hunter DPS Calculator is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Dawg6's Demon Hunter DPS Calculator is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. *******************************************************************************/ package com.dawg6.web.dhcalc.client; import java.util.List; import java.util.Vector; import com.dawg6.d3api.shared.Account; import com.dawg6.d3api.shared.Leaderboard; import com.dawg6.d3api.shared.LeaderboardRow; import com.dawg6.d3api.shared.Realm; import com.dawg6.d3api.shared.SeasonIndex; import com.dawg6.d3api.shared.Util; import com.dawg6.gwt.client.ApplicationPanel; import com.dawg6.gwt.common.util.DefaultCallback; import com.dawg6.web.dhcalc.shared.calculator.LeaderboardType; import com.google.gwt.event.dom.client.ClickEvent; import com.google.gwt.event.dom.client.ClickHandler; import com.google.gwt.http.client.URL; import com.google.gwt.i18n.client.NumberFormat; import com.google.gwt.user.client.Window; import com.google.gwt.user.client.ui.Anchor; import com.google.gwt.user.client.ui.Button; import com.google.gwt.user.client.ui.CheckBox; import com.google.gwt.user.client.ui.FlexTable; import com.google.gwt.user.client.ui.HasVerticalAlignment; import com.google.gwt.user.client.ui.HorizontalPanel; import com.google.gwt.user.client.ui.Label; import com.google.gwt.user.client.ui.ListBox; public class LeaderboardPanel extends ApplicationPanel { private final ListBox seasonList = new ListBox(); private final ListBox leaderboard = new ListBox(); private final MainPanel mainPanel; private final CheckBox hardcore = new CheckBox(); private SeasonIndex seasons; private final FlexTable table; private final int leaderboardRow; private ListBox leaders; public LeaderboardPanel(MainPanel mainPanel) { this.mainPanel = mainPanel; table = new FlexTable(); initWidget(table); int row = 0; table.setWidget(row, 0, new Label("Season/Era:", false)); table.setWidget(row, 1, seasonList); table.setWidget(row, 2, new Label("Hardcore:", false)); table.setWidget(row, 3, hardcore); table.setWidget(row, 4, new Label("Leaderboard:", false)); table.setWidget(row, 5, leaderboard); row++; Button button = new Button("Get Leaderboard"); button.addClickHandler(new ClickHandler() { @Override public void onClick(ClickEvent event) { getLeaderboard(); } }); table.setWidget(row, 0, button); Anchor anchor = new Anchor("battle.net"); anchor.setHref("javascript:void(0)"); anchor.addClickHandler(new ClickHandler() { @Override public void onClick(ClickEvent event) { leaderboardLink(); } }); table.setWidget(row, 1, anchor); row++; for (LeaderboardType t : LeaderboardType.values()) { leaderboard.addItem(t.toString(), t.name()); } leaderboard.setSelectedIndex(0); leaderboardRow = row; } protected void leaderboardLink() { Realm realm = mainPanel.getSelectedRealm(); Integer season = getSelectedSeason(); LeaderboardType type = getSelectedLeaderboard(); if ((realm != null) && (season != null) && (type != null)) { boolean hardcore = this.hardcore.getValue(); String which = type.getKey(hardcore); String server = realm.getHost(); String url = server + "/d3/rankings/" + ((season < 0) ? "era" : "season") + "/" + Math.abs(season) + "/" + which; Window.open(url, "_blank", ""); } } protected void getLeaderboard() { LeaderboardType type = getSelectedLeaderboard(); boolean hardcore = this.hardcore.getValue(); if (type != null) { String which = type.getKey(hardcore); Integer season = getSelectedSeason(); if (season != null) { Service.getInstance().getLeaderboard( mainPanel.getSelectedRealm(), Math.abs(season), season < 0, which, new DefaultCallback<Leaderboard>() { @Override protected void doOnSuccess(Leaderboard result) { populateLeaders(result); } }); } } } protected void populateLeaders(Leaderboard result) { leaders = new ListBox(); for (LeaderboardRow row : result.rows) { if ((row != null) && (row.players != null)) { if (row.data != null) { Long rift = Util.getLeaderboardDataNumber(row.data, "RiftLevel"); Long time = Util.getLeaderboardDataTimestamp(row.data, "RiftTime"); Long rank = Util.getLeaderboardDataNumber(row.data, "Rank"); if ((rift != null) && (time != null) && (rank != null)) { for (Account a : row.players) { String clazz = Util.getLeaderboardDataString( a.data, "HeroClass"); if ((clazz != null) && clazz.equals("demon hunter")) { String btag = Util.getLeaderboardDataString( a.data, "HeroBattleTag"); Long heroId = Util.getLeaderboardDataNumber( a.data, "HeroId"); if ((btag != null) && (heroId != null)) { long minutes = time / 60000L; long seconds = (time - (minutes * 60000)) / 1000L; String ts = NumberFormat.getFormat("00") .format(minutes) + ":" + NumberFormat.getFormat("00") .format(seconds); String label = rank + ") Level " + rift + ": " + ts + " - " + btag; leaders.addItem(label, btag + "#" + heroId); } } } } } } } HorizontalPanel row = new HorizontalPanel(); row.setVerticalAlignment(HasVerticalAlignment.ALIGN_MIDDLE); row.setSpacing(5); row.add(leaders); this.table.setWidget(this.leaderboardRow, 0, row); this.table.getFlexCellFormatter().setColSpan(this.leaderboardRow, 0, 6); Anchor career = new Anchor("profile"); career.setHref("javascript:void(0)"); row.add(career); career.addClickHandler(new ClickHandler() { @Override public void onClick(ClickEvent event) { showCareer(); } }); Anchor hero = new Anchor("hero"); hero.setHref("javascript:void(0)"); row.add(hero); hero.addClickHandler(new ClickHandler() { @Override public void onClick(ClickEvent event) { showHero(); } }); hero.addClickHandler(new ClickHandler() { @Override public void onClick(ClickEvent event) { showHero(); } }); Anchor paperdoll = new Anchor("paperdoll"); paperdoll.setHref("javascript:void(0)"); row.add(paperdoll); paperdoll.addClickHandler(new ClickHandler() { @Override public void onClick(ClickEvent event) { showPaperdoll(); } }); Button button = new Button("Import Profile"); row.add(button); button.addClickHandler(new ClickHandler() { @Override public void onClick(ClickEvent event) { getHeroList(); } }); } protected void showPaperdoll() { String btag = getSelectedAccount(); Realm realm = mainPanel.getSelectedRealm(); if ((realm != null) && (btag != null)) { String[] split = btag.split("#"); MainPanel.openPaperdoll(realm.name(), URL.encodePathSegment(split[0]), Integer.valueOf(split[1]), Integer.valueOf(split[2])); } } protected void showHero() { String btag = getSelectedAccount(); Realm realm = mainPanel.getSelectedRealm(); if ((realm != null) && (btag != null)) { String[] split = btag.split("#"); String server = realm.getHost(); String url = server + "/d3/profile/" + split[0] + "-" + split[1] + "/hero/" + split[2]; Window.open(url, "_blank", ""); } } protected void showCareer() { String btag = getSelectedAccount(); Realm realm = mainPanel.getSelectedRealm(); if ((realm != null) && (btag != null)) { String[] split = btag.split("#"); String server = realm.getHost(); String url = server + "/d3/profile/" + split[0] + "-" + split[1] + "/"; Window.open(url, "_blank", ""); } } protected void getHeroList() { String btag = getSelectedAccount(); if (btag != null) { String[] split = btag.split("#"); mainPanel.importProfile(split[0], split[1], Integer.parseInt(split[2])); } } private String getSelectedAccount() { int i = leaders.getSelectedIndex(); if (i < 0) return null; return leaders.getValue(i); } private Integer getSelectedSeason() { int i = this.seasonList.getSelectedIndex(); if (i < 0) return null; String value = seasonList.getValue(i); return Integer.parseInt(value); } private LeaderboardType getSelectedLeaderboard() { int i = this.leaderboard.getSelectedIndex(); if (i < 0) return null; String value = leaderboard.getValue(i); return LeaderboardType.valueOf(value); } @Override public void onLoad() { if (this.seasons == null) { Realm realm = mainPanel.getSelectedRealm(); Service.getInstance().getSeasonEraIndex(realm, new DefaultCallback<SeasonIndex>() { @Override protected void doOnSuccess(SeasonIndex result) { populateSeasonIndex(result); } }); } } protected void populateSeasonIndex(SeasonIndex seasons) { this.seasons = seasons; seasonList.clear(); List<SeasonHolder> list = new Vector<SeasonHolder>(); for (int i = 1; i <= seasons.current_era; i++) { SeasonHolder s = new SeasonHolder(); s.era = i; list.add(s); } for (int i = 1; i <= seasons.current_season; i++) { SeasonHolder s = new SeasonHolder(); s.season = i; list.add(s); } for (SeasonHolder s : list) { seasonList.addItem(s.toString(), s.value()); } seasonList.setSelectedIndex(list.size() - 1); } private class SeasonHolder { public Integer season; public Integer era; @Override public String toString() { return (era != null) ? ("Era " + era) : ("Season " + season); } public String value() { return (era != null) ? String.valueOf(-era) : String .valueOf(season); } } }