retrieval/updating and player profile tracking.master
After Width: | Height: | Size: 8.0 KiB |
@ -0,0 +1,129 @@ |
||||
package sig; |
||||
|
||||
import java.awt.AlphaComposite; |
||||
import java.awt.BasicStroke; |
||||
import java.awt.Color; |
||||
import java.awt.Font; |
||||
import java.awt.Graphics; |
||||
import java.awt.Graphics2D; |
||||
import java.awt.Image; |
||||
import java.awt.Rectangle; |
||||
import java.awt.RenderingHints; |
||||
import java.awt.Shape; |
||||
import java.awt.font.FontRenderContext; |
||||
import java.awt.font.GlyphVector; |
||||
import java.awt.font.TextAttribute; |
||||
import java.awt.geom.Rectangle2D; |
||||
import java.awt.image.BufferedImage; |
||||
import java.awt.image.ImageObserver; |
||||
import java.text.AttributedString; |
||||
|
||||
public class DrawUtils { |
||||
public static void drawOutlineText(Graphics g, Font font, double x, double y, int outline_size, Color text_color, Color shadow_color, String message) { |
||||
drawOutlineText(g,font,x,y,0,0,1,outline_size,text_color,shadow_color,message); |
||||
} |
||||
public static void drawOutlineText(Graphics g, Font font, double x, double y, int font_thickness, int outline_thickness, Color text_color, Color shadow_color, String message) { |
||||
drawOutlineText(g,font,x,y,0,0,font_thickness,outline_thickness,text_color,shadow_color,message); |
||||
} |
||||
static void drawOutlineText(Graphics g, Font font, double x, double y, double xoffset, double yoffset, int font_thickness, int outline_thickness, Color text_color, Color shadow_color, String message) { |
||||
AttributedString as = new AttributedString(message); |
||||
as.addAttribute(TextAttribute.FONT, font); |
||||
g.setColor(shadow_color); |
||||
Graphics2D g2 = (Graphics2D) g; |
||||
FontRenderContext frc = g2.getFontMetrics(font).getFontRenderContext(); |
||||
GlyphVector gv = font.createGlyphVector(frc, message); |
||||
Shape shape = gv.getOutline((int)(x+xoffset),(int)(y+yoffset)); |
||||
g2.setClip(null); |
||||
g2.setStroke(new BasicStroke(font_thickness + outline_thickness*2)); |
||||
g2.setColor(shadow_color); |
||||
g2.setRenderingHint( |
||||
RenderingHints.KEY_ANTIALIASING, |
||||
RenderingHints.VALUE_ANTIALIAS_ON); |
||||
g2.draw(shape); |
||||
GlyphVector gv2 = font.createGlyphVector(frc, message); |
||||
Shape shape2 = gv2.getOutline((int)(x+xoffset),(int)(y+yoffset)); |
||||
g2.setClip(null); |
||||
g2.setStroke(new BasicStroke(font_thickness)); |
||||
g2.setColor(text_color); |
||||
g2.setRenderingHint( |
||||
RenderingHints.KEY_ANTIALIASING, |
||||
RenderingHints.VALUE_ANTIALIAS_ON); |
||||
g2.draw(shape2); |
||||
g2.setColor(text_color); |
||||
g2.drawString(as.getIterator(),(int)(x+xoffset),(int)(y+yoffset)); |
||||
} |
||||
public static void drawCenteredOutlineText(Graphics g, Font font, double x, double y, int outline_size, Color text_color, Color shadow_color, String message) { |
||||
Rectangle2D textBounds = TextUtils.calculateStringBoundsFont(g,message, font); |
||||
drawOutlineText(g,font,x,y,-textBounds.getWidth()/2,-textBounds.getHeight()/2,1,outline_size,text_color,shadow_color,message); |
||||
} |
||||
public static void drawTextFont(Graphics g, Font font, double x, double y, Color color, String message) { |
||||
if (message.length()>0) { |
||||
AttributedString as = new AttributedString(message); |
||||
as.addAttribute(TextAttribute.FONT, font); |
||||
g.setColor(color); |
||||
g.drawString(as.getIterator(),(int)x,(int)y); |
||||
} |
||||
} |
||||
public static void drawHealthbar(Graphics g, Rectangle bounds, double pct, Color healthbarcol) { |
||||
g.setColor(Color.BLACK); |
||||
g.draw3DRect((int)bounds.getX(), (int)bounds.getY(), (int)bounds.getWidth(), (int)bounds.getHeight(), true); |
||||
g.setColor(healthbarcol); |
||||
g.fill3DRect((int)bounds.getX()+1, (int)bounds.getY()+1, (int)(bounds.getWidth()*pct)-1, (int)bounds.getHeight()-1, true); |
||||
} |
||||
/** |
||||
* Centers the text along the X Axis. |
||||
*/ |
||||
public static void drawCenteredText(Graphics g, Font font, int x, int y, Color color, String text) { |
||||
AttributedString as = new AttributedString(text); |
||||
as.addAttribute(TextAttribute.FONT, font); |
||||
g.setColor(color); |
||||
Rectangle2D textBounds = TextUtils.calculateStringBoundsFont(g,text, font); |
||||
g.drawString(as.getIterator(),(int)(x-textBounds.getWidth()/2),(int)(y+textBounds.getHeight())); |
||||
} |
||||
|
||||
public static Color convertStringToColor(String s) { |
||||
String[] split = s.split(","); |
||||
if (split.length==3) { |
||||
return new Color( |
||||
Math.min(Math.abs(Integer.parseInt(split[0])),255), |
||||
Math.min(Math.abs(Integer.parseInt(split[1])),255), |
||||
Math.min(Math.abs(Integer.parseInt(split[2])),255)); |
||||
} else |
||||
if (split.length==4) { |
||||
return new Color( |
||||
Math.min(Math.abs(Integer.parseInt(split[0])),255), |
||||
Math.min(Math.abs(Integer.parseInt(split[1])),255), |
||||
Math.min(Math.abs(Integer.parseInt(split[2])),255), |
||||
Math.min(Math.abs(Integer.parseInt(split[3])),255)); |
||||
} else { |
||||
System.out.println("WARNING! Invalid Color string specified ("+s+")."); |
||||
return null; |
||||
} |
||||
} |
||||
|
||||
public static void drawImage(Graphics g, Image img, double x, double y, Color blend_col, ImageObserver source) { |
||||
BufferedImage tmp = new BufferedImage(img.getWidth(source),img.getHeight(source),BufferedImage.TYPE_INT_ARGB); |
||||
Graphics2D g2 = tmp.createGraphics(); |
||||
g2.drawImage(img, 0, 0, null); |
||||
g2.setComposite(AlphaComposite.SrcAtop); |
||||
g2.setColor(blend_col); |
||||
g2.fillRect(0, 0, img.getWidth(source), img.getHeight(source)); |
||||
g2.dispose(); |
||||
g.drawImage(tmp,(int)x,(int)y,source); |
||||
} |
||||
|
||||
public static void drawImageScaled(Graphics g, Image img, double x, double y, double xsize, double ysize, Color blend_col, ImageObserver source) { |
||||
BufferedImage tmp = new BufferedImage(img.getWidth(source),img.getHeight(source),BufferedImage.TYPE_INT_ARGB); |
||||
Graphics2D g2 = tmp.createGraphics(); |
||||
g2.drawImage(img, 0, 0, null); |
||||
g2.setComposite(AlphaComposite.SrcAtop); |
||||
g2.setColor(blend_col); |
||||
g2.fillRect(0, 0, img.getWidth(source), img.getHeight(source)); |
||||
g2.dispose(); |
||||
g.drawImage(tmp,(int)x,(int)y,(int)xsize,(int)ysize,source); |
||||
} |
||||
|
||||
public static Color invertColor(Color c) { |
||||
return new Color(255-c.getRed(),255-c.getGreen(),255-c.getBlue(),255); |
||||
} |
||||
} |
@ -0,0 +1,319 @@ |
||||
package sig; |
||||
|
||||
import java.awt.Color; |
||||
import java.awt.Font; |
||||
import java.awt.Graphics2D; |
||||
import java.awt.GraphicsEnvironment; |
||||
import java.awt.font.FontRenderContext; |
||||
import java.awt.geom.Rectangle2D; |
||||
import java.awt.image.BufferedImage; |
||||
import java.io.File; |
||||
import java.io.IOException; |
||||
import java.net.URL; |
||||
import java.text.DecimalFormat; |
||||
import java.text.NumberFormat; |
||||
import java.util.ArrayList; |
||||
import java.util.Arrays; |
||||
import java.util.List; |
||||
|
||||
import javax.imageio.ImageIO; |
||||
|
||||
import org.json.JSONArray; |
||||
import org.json.JSONException; |
||||
import org.json.JSONObject; |
||||
|
||||
import net.dv8tion.jda.core.JDA; |
||||
import net.dv8tion.jda.core.MessageBuilder; |
||||
import net.dv8tion.jda.core.entities.Message; |
||||
import net.dv8tion.jda.core.entities.MessageChannel; |
||||
import sig.gacha.Card; |
||||
import sig.gacha.Member; |
||||
import sig.gacha.Player; |
||||
|
||||
public class GachaBot { |
||||
JDA bot; |
||||
static int cardcount = 0; |
||||
static int membercount = 0; |
||||
public static int databasecheck = 86400; |
||||
public static List<Card> cardlist = new ArrayList<Card>(); |
||||
public static List<Member> memberlist = new ArrayList<Member>(); |
||||
public static Font programFont = new Font("Century Schoolbook L",Font.PLAIN,24); |
||||
public GachaBot(JDA bot) { |
||||
this.bot=bot; |
||||
UpdateCardDatabase(); |
||||
CreateFileDirectories(); |
||||
String fonts[] = |
||||
GraphicsEnvironment.getLocalGraphicsEnvironment().getAvailableFontFamilyNames(); |
||||
|
||||
for ( int i = 0; i < fonts.length; i++ ) |
||||
{ |
||||
System.out.println(fonts[i]); |
||||
} |
||||
} |
||||
|
||||
private void CreateFileDirectories() { |
||||
new File(BandoriBot.BASEDIR+"art/").mkdirs(); |
||||
new File(BandoriBot.BASEDIR+"card_art/").mkdirs(); |
||||
new File(BandoriBot.BASEDIR+"gacha_results/").mkdirs(); |
||||
new File(BandoriBot.BASEDIR+"profiles/").mkdirs(); |
||||
} |
||||
|
||||
public static void tick() { |
||||
databasecheck--; |
||||
if (databasecheck==0) { |
||||
databasecheck=0; |
||||
UpdateCardDatabase(); |
||||
} |
||||
} |
||||
|
||||
public void checkForGacha(MessageChannel channel,String name,Long discordID,String message) { |
||||
System.out.println(message+" | "+message.charAt(0)); |
||||
if (message.length()>0 && message.charAt(0)=='.') { |
||||
//This is a bot message. Try to work with it.
|
||||
String[] wordparse = message.split(" "); |
||||
System.out.println(Arrays.toString(wordparse)); |
||||
switch (wordparse[0]) { |
||||
case ".stats":{ |
||||
Player p = Player.GetPlayerProfile(discordID, name); |
||||
DecimalFormat df = new DecimalFormat("0.0"); |
||||
channel.sendMessage(new MessageBuilder("*Stats for* "+name+":").append('\n') |
||||
.append("```Total Rolls: "+(p.GetPullData()[0]+p.GetPullData()[1]+p.GetPullData()[2])).append('\n') |
||||
.append("4* Cards: "+(p.GetPullData()[2])+" ("+df.format((double)(p.GetPullData()[2])/(p.GetPullData()[0]+p.GetPullData()[1]+p.GetPullData()[2])*100)+"%)").append(" ["+p.GetDupeData()[2]+" dupe"+((p.GetDupeData()[2]==1)?"":"s")+"]").append('\n') |
||||
.append("3* Cards: "+(p.GetPullData()[1])+" ("+df.format((double)(p.GetPullData()[1])/(p.GetPullData()[0]+p.GetPullData()[1]+p.GetPullData()[2])*100)+"%)").append(" ["+p.GetDupeData()[1]+" dupe"+((p.GetDupeData()[1]==1)?"":"s")+"]").append('\n') |
||||
.append("2* Cards: "+(p.GetPullData()[0])+" ("+df.format((double)(p.GetPullData()[0])/(p.GetPullData()[0]+p.GetPullData()[1]+p.GetPullData()[2])*100)+"%)").append(" ["+p.GetDupeData()[0]+" dupe"+((p.GetDupeData()[0]==1)?"":"s")+"]").append('\n') |
||||
.append("```").build()).queue(); |
||||
}break; |
||||
case ".gacha":{ |
||||
//System.out.print("This is a gacha attempt~!");
|
||||
int amt = 1; |
||||
if (wordparse.length>1) { |
||||
try { |
||||
amt = Integer.parseInt(wordparse[1]); |
||||
} catch (NumberFormatException e) { |
||||
|
||||
} |
||||
if (amt!=5 && amt!=10) { |
||||
amt = 1; |
||||
} |
||||
} |
||||
int original_amt = amt; |
||||
BufferedImage img = new BufferedImage(180*((amt==5||amt==10)?5:1),180*((amt==10)?2:1),BufferedImage.TYPE_INT_ARGB); |
||||
Graphics2D g = img.createGraphics(); |
||||
int x_offset = 0; |
||||
int y_offset = 0; |
||||
List<Card> picked_cards = new ArrayList<Card>(); |
||||
Player p = Player.GetPlayerProfile(discordID,name); |
||||
do { |
||||
double rng = Math.random(); |
||||
int star_rating = 2; |
||||
if (rng<0.03) { |
||||
//4-star.
|
||||
star_rating=4; |
||||
} else |
||||
if (rng<0.085){ |
||||
//3-star.
|
||||
star_rating=3; |
||||
} else { |
||||
star_rating=2; |
||||
} |
||||
if (original_amt>1 && amt==1) { |
||||
if (rng<0.03) { |
||||
//4-star.
|
||||
star_rating=4; |
||||
} else { |
||||
star_rating=3; |
||||
} |
||||
} |
||||
Card c = Card.pickRandomCardByStarRating(cardlist, star_rating); |
||||
boolean trained = (star_rating>2 && p.getNumberOfCardsInCollection(c)%2==1); |
||||
picked_cards.add(c); |
||||
System.out.println("Requesting Card "+c+" from "+c.getCardURL(trained)); |
||||
try { |
||||
FileUtils.downloadFileFromUrl(c.getCardURL(trained), "card_art/"+c.getCardID()+((trained)?"_trained":"")+".png"); |
||||
} catch (JSONException | IOException e) { |
||||
e.printStackTrace(); |
||||
} |
||||
File card_file = new File(BandoriBot.BASEDIR+"card_art/"+c.getCardID()+((trained)?"_trained":"")+".png"); |
||||
File star_file = new File(BandoriBot.BASEDIR+"newstar.png"); |
||||
//channel.sendFile(card_file).queue();
|
||||
BufferedImage card_img = null; |
||||
try { |
||||
card_img = ImageIO.read(card_file); |
||||
} catch (IOException e) { |
||||
e.printStackTrace(); |
||||
} |
||||
g.drawImage(card_img, x_offset, y_offset, null); |
||||
card_img.flush(); |
||||
if (!p.hasCardInCollection(c)) { |
||||
try { |
||||
card_img = ImageIO.read(star_file); |
||||
g.drawImage(card_img, x_offset+180-64, y_offset+180-64, null); |
||||
} catch (IOException e) { |
||||
e.printStackTrace(); |
||||
} |
||||
} |
||||
if (p.getNumberOfCardsInCollection(c)>0) { |
||||
g.setFont(programFont); |
||||
FontRenderContext frc = g.getFontMetrics(programFont).getFontRenderContext(); |
||||
String displayString = Integer.toString(p.getNumberOfCardsInCollection(c)+1); |
||||
Rectangle2D size = programFont.getStringBounds(displayString, frc); |
||||
//g.drawString(displayString, (float)(x_offset+180-size.getX()-4), (float)(y_offset+180-size.getY()-4));
|
||||
DrawUtils.drawOutlineText(g, programFont, (float)(x_offset+180-size.getWidth()-12), (float)(y_offset+180-size.getHeight()+20), 1, 2, Color.BLACK, Color.WHITE, displayString); |
||||
} |
||||
x_offset+=180; |
||||
if (x_offset>=900) { |
||||
x_offset=0; |
||||
y_offset+=180; |
||||
} |
||||
card_img.flush(); |
||||
} while (--amt>0); |
||||
//
|
||||
long systemTime = System.currentTimeMillis(); |
||||
File gacha_result = new File(BandoriBot.BASEDIR+"gacha_results/"+systemTime+".png"); |
||||
try { |
||||
ImageIO.write(img, "png", gacha_result); |
||||
} catch (IOException e) { |
||||
e.printStackTrace(); |
||||
} |
||||
Message msg = new MessageBuilder().append("*Gacha Result for "+name+"*").build(); |
||||
channel.sendFile(gacha_result,msg).queue(); |
||||
g.dispose(); |
||||
img.flush(); |
||||
|
||||
//Player p = Player.GetPlayerProfile(discordID,name);
|
||||
Player.ApplyAllCardProfileChanges(bot,channel,name,discordID,message,picked_cards); |
||||
}break; |
||||
case ".display":{ |
||||
if (wordparse.length>1) { //This is a valid ID to try.
|
||||
/*try { |
||||
int card_id = Integer.parseInt(wordparse[1]); |
||||
Card c = Card.findCardByID(cardlist, card_id); |
||||
if (c!=null) { |
||||
//Download the image...
|
||||
try { |
||||
FileUtils.downloadFileFromUrl(c.getCardArtURL(false), "art/"+card_id+".png"); |
||||
channel.sendFile(new File(BandoriBot.BASEDIR+"art/"+card_id+".png")).queue(); |
||||
} catch (JSONException | IOException e) { |
||||
e.printStackTrace(); |
||||
} |
||||
} else { |
||||
channel.sendMessage("*I am sorry, but I cannot find that!!!*").queue(); |
||||
} |
||||
} |
||||
catch (NumberFormatException e) { |
||||
channel.sendMessage("*I am sorry, but I would like a number there instead...*").queue(); |
||||
}*/ |
||||
String character = wordparse[1]; |
||||
Member m = Member.getMemberByName(memberlist, character); |
||||
if (m!=null) { |
||||
int character_id = m.getMemberID(); |
||||
Card c = Card.pickRandomCardByMemberID(cardlist, character_id); |
||||
if (c!=null) { |
||||
//Download the image...
|
||||
try { |
||||
int card_id = c.getCardID(); |
||||
boolean trained = false; |
||||
if (c.getCardStarRating()>2) { |
||||
trained = Math.random()<0.5; |
||||
} |
||||
System.out.println("Requesting Card "+c+" from "+c.getCardArtURL(trained)); |
||||
FileUtils.downloadFileFromUrl(c.getCardArtURL(trained), "art/"+card_id+((trained)?"_trained":"")+".png"); |
||||
channel.sendFile(new File(BandoriBot.BASEDIR+"art/"+card_id+((trained)?"_trained":"")+".png")).queue(); |
||||
} catch (JSONException | IOException e) { |
||||
e.printStackTrace(); |
||||
} |
||||
} else { |
||||
channel.sendMessage("*I am sorry, but something went wrong!*").queue(); |
||||
} |
||||
} else { |
||||
channel.sendMessage("*I am sorry, but I cannot find the person you are looking for! Check your spelling!* :xD:").queue(); |
||||
} |
||||
} |
||||
}break; |
||||
} |
||||
} |
||||
} |
||||
|
||||
private static void UpdateCardDatabase() { |
||||
int cardsLoaded = 0; |
||||
int membersLoaded = 0; |
||||
List<Card> tempcardlist = new ArrayList<Card>(); |
||||
List<Member> tempmemberlist = new ArrayList<Member>(); |
||||
try { |
||||
int pagecount = 1; |
||||
do { |
||||
JSONObject jsondata = FileUtils.readJsonFromUrl("https://bandori.party/api/cards/?page="+pagecount++); |
||||
//jsondata = FileUtils.readJsonFromFile(file);
|
||||
cardcount = jsondata.getInt("count"); |
||||
String nexturl = ""; |
||||
String prevurl = ""; |
||||
if (jsondata.get("next") instanceof String) { |
||||
nexturl = (String)jsondata.get("next"); |
||||
} else { |
||||
nexturl = ""; |
||||
} |
||||
if (jsondata.get("previous") instanceof String) { |
||||
prevurl = (String)jsondata.get("previous"); |
||||
} else { |
||||
prevurl = ""; |
||||
} |
||||
JSONArray carddata = jsondata.getJSONArray("results"); |
||||
//System.out.println(cardcount+";"+nexturl+";"+prevurl+";"+carddata);
|
||||
for (Object obj : carddata) { |
||||
JSONObject card = (JSONObject) obj; |
||||
tempcardlist.add(new Card(card)); |
||||
cardsLoaded++; |
||||
} |
||||
if (nexturl.length()==0) { |
||||
break; |
||||
} |
||||
} while (true); |
||||
System.out.println("Loaded "+cardsLoaded+" / "+cardcount+" cards."); |
||||
} catch (JSONException | IOException e) { |
||||
e.printStackTrace(); |
||||
} |
||||
try { |
||||
int pagecount = 1; |
||||
do { |
||||
JSONObject jsondata = FileUtils.readJsonFromUrl("https://bandori.party/api/members/?page="+pagecount++); |
||||
//jsondata = FileUtils.readJsonFromFile(file);
|
||||
membercount = jsondata.getInt("count"); |
||||
String nexturl = ""; |
||||
String prevurl = ""; |
||||
if (jsondata.get("next") instanceof String) { |
||||
nexturl = (String)jsondata.get("next"); |
||||
} else { |
||||
nexturl = ""; |
||||
} |
||||
if (jsondata.get("previous") instanceof String) { |
||||
prevurl = (String)jsondata.get("previous"); |
||||
} else { |
||||
prevurl = ""; |
||||
} |
||||
JSONArray memberdata = jsondata.getJSONArray("results"); |
||||
//System.out.println(cardcount+";"+nexturl+";"+prevurl+";"+carddata);
|
||||
for (Object obj : memberdata) { |
||||
JSONObject member = (JSONObject) obj; |
||||
tempmemberlist.add(new Member(member)); |
||||
membersLoaded++; |
||||
} |
||||
if (nexturl.length()==0) { |
||||
break; |
||||
} |
||||
} while (true); |
||||
System.out.println("Loaded "+membersLoaded+" / "+membercount+" characters."); |
||||
} catch (JSONException | IOException e) { |
||||
e.printStackTrace(); |
||||
} |
||||
if (cardsLoaded == cardcount) { |
||||
cardlist.clear(); |
||||
cardlist.addAll(tempcardlist); |
||||
System.out.println("Updated all card entries."); |
||||
} |
||||
if (membersLoaded == membercount) { |
||||
memberlist.clear(); |
||||
memberlist.addAll(tempmemberlist); |
||||
System.out.println("Updated all member entries."); |
||||
} |
||||
} |
||||
} |
@ -0,0 +1,135 @@ |
||||
package sig; |
||||
|
||||
import java.awt.Color; |
||||
import java.awt.Font; |
||||
import java.awt.Graphics; |
||||
import java.awt.Point; |
||||
import java.awt.font.FontRenderContext; |
||||
import java.awt.geom.Rectangle2D; |
||||
import java.util.ArrayList; |
||||
import java.util.List; |
||||
|
||||
|
||||
public class TextUtils { |
||||
|
||||
public static Rectangle2D calculateStringBoundsFont(Graphics g, String msg, Font font) { |
||||
FontRenderContext frc = g.getFontMetrics(font).getFontRenderContext(); |
||||
return font.getStringBounds(msg, frc); |
||||
} |
||||
|
||||
public static String replaceFirst(String sourcestring, String findstring, String replacestring) { |
||||
int pos = sourcestring.indexOf(findstring); |
||||
if (pos>=0) { |
||||
String piece1 = sourcestring.substring(0,pos); |
||||
String piece2 = sourcestring.substring(pos+findstring.length(),sourcestring.length()); |
||||
//basemsg = basemsg.replaceFirst(e.getEmoteName(),e.getSpaceFiller());
|
||||
sourcestring = piece1+replacestring+piece2; |
||||
} |
||||
return sourcestring; |
||||
} |
||||
|
||||
public static boolean isAlphanumeric(String str) { |
||||
return str.matches("^[a-zA-Z0-9!\\-.?'\":,\\+ ]+$"); |
||||
} |
||||
|
||||
public static boolean isNumeric(String str) |
||||
{ |
||||
if (str.length()>0) { |
||||
return str.matches("-?\\d+(\\.\\d+)?"); //match a number with optional '-' and decimal.
|
||||
} else { |
||||
return false; |
||||
} |
||||
} |
||||
|
||||
public static boolean isInteger(String s, int radix) { |
||||
if(s.isEmpty()) return false; |
||||
for(int i = 0; i < s.length(); i++) { |
||||
if(i == 0 && s.charAt(i) == '-') { |
||||
if(s.length() == 1) return false; |
||||
else continue; |
||||
} |
||||
if(Character.digit(s.charAt(i),radix) < 0) return false; |
||||
} |
||||
return true; |
||||
} |
||||
|
||||
public static String convertSecondsToTimeFormat(int seconds) { |
||||
StringBuilder sb = new StringBuilder(); |
||||
int sec = seconds%60; |
||||
int min = (seconds/60)%60; |
||||
int hrs = (seconds/3600)%24; |
||||
if (hrs>0) { |
||||
if (hrs>=10) { |
||||
sb.append(hrs); |
||||
} else { |
||||
sb.append(0); |
||||
sb.append(hrs); |
||||
} |
||||
sb.append(":"); |
||||
} |
||||
if (min>=10) { |
||||
sb.append(min); |
||||
} else { |
||||
sb.append(0); |
||||
sb.append(min); |
||||
} |
||||
sb.append(":"); |
||||
if (sec>=10) { |
||||
sb.append(sec); |
||||
} else { |
||||
sb.append(0); |
||||
sb.append(sec); |
||||
} |
||||
return sb.toString(); |
||||
} |
||||
|
||||
/** |
||||
* Converts a three CSV value to RGB value. |
||||
*/ |
||||
public static Color convertStringToColor(String col) { |
||||
String[] split = col.split(","); |
||||
return new Color(Integer.parseInt(split[0]),Integer.parseInt(split[1]),Integer.parseInt(split[2])); |
||||
} |
||||
|
||||
public static List<String> WrapText(Graphics g,String msg, Font font, double width) { |
||||
List<String> displayMessage = new ArrayList<String>(); |
||||
String rawmessage = msg; |
||||
int textWidth = (int)TextUtils.calculateStringBoundsFont(g,rawmessage, font).getWidth(); |
||||
int maxWidth = (int)width; |
||||
do { |
||||
rawmessage = BreakTextAtNextSection(g,rawmessage+" ",font,displayMessage,maxWidth); |
||||
textWidth = (int)TextUtils.calculateStringBoundsFont(g,rawmessage, font).getWidth(); |
||||
} while (textWidth>maxWidth); |
||||
if (rawmessage.length()>0) { |
||||
displayMessage.add(rawmessage); |
||||
} |
||||
return displayMessage; |
||||
//System.out.println(displayMessage+": "+messageDisplaySize);
|
||||
} |
||||
|
||||
private static String BreakTextAtNextSection(Graphics g, String msg, Font font, List<String> list, int maxWidth) { |
||||
int marker = 1; |
||||
int textWidth = (int)TextUtils.calculateStringBoundsFont(g,msg.substring(0, marker), font).getWidth(); |
||||
while (textWidth<maxWidth) { |
||||
if (marker<msg.length()) { |
||||
int tempmarker = msg.indexOf(' ', marker); |
||||
if (tempmarker!=-1) { |
||||
textWidth = (int)TextUtils.calculateStringBoundsFont(g,msg.substring(0, tempmarker), font).getWidth(); |
||||
if (textWidth<maxWidth) { |
||||
marker = tempmarker+1; |
||||
} |
||||
//System.out.println(msg.substring(0, marker)+" | "+textWidth);
|
||||
} else { |
||||
marker=msg.length(); |
||||
break; |
||||
} |
||||
} else { |
||||
break; |
||||
} |
||||
} |
||||
String currentText = msg.substring(0, marker); |
||||
list.add(currentText); |
||||
return msg.substring(marker, msg.length()); |
||||
} |
||||
} |
||||
|
@ -0,0 +1,168 @@ |
||||
package sig.gacha; |
||||
|
||||
import java.lang.reflect.Field; |
||||
import java.util.ArrayList; |
||||
import java.util.List; |
||||
|
||||
import org.json.JSONArray; |
||||
import org.json.JSONObject; |
||||
|
||||
public class Card { |
||||
int id; |
||||
int member; |
||||
int rarity; |
||||
String attribute; |
||||
String name; |
||||
String jap_name; |
||||
String imgURL; |
||||
String imgURL_trained; |
||||
String artURL; |
||||
String artURL_trained; |
||||
String transparentURL; |
||||
String transparentURL_trained; |
||||
String skill_name; |
||||
String jap_skill_name; |
||||
String skill_type; |
||||
String skill_desc; |
||||
int performance_min; |
||||
int performance_max; |
||||
int performance_trained_max; |
||||
int technique_min; |
||||
int technique_max; |
||||
int technique_trained_max; |
||||
int visual_min; |
||||
int visual_max; |
||||
int visual_trained_max; |
||||
JSONArray cameo_members; |
||||
|
||||
public Card(JSONObject data) { |
||||
id = getIntFromJson(data,"id"); |
||||
member = getIntFromJson(data,"member"); |
||||
rarity = getIntFromJson(data,"i_rarity"); |
||||
attribute = getStringFromJson(data,"i_attribute"); |
||||
name = getStringFromJson(data,"name"); |
||||
jap_name = getStringFromJson(data,"japanese_name"); |
||||
imgURL = getStringFromJson(data,"image"); |
||||
imgURL_trained= getStringFromJson(data,"image_trained"); |
||||
artURL = getStringFromJson(data,"art"); |
||||
artURL_trained = getStringFromJson(data,"art_trained"); |
||||
transparentURL = getStringFromJson(data,"transparent"); |
||||
transparentURL_trained = getStringFromJson(data,"transparent_trained"); |
||||
skill_name = getStringFromJson(data,"skill_name"); |
||||
jap_skill_name = getStringFromJson(data,"japanese_skill_name"); |
||||
skill_type = getStringFromJson(data,"i_skill_type"); |
||||
skill_desc = getStringFromJson(data,"skill_details"); |
||||
performance_min = getIntFromJson(data,"performance_min"); |
||||
performance_max = getIntFromJson(data,"performance_max"); |
||||
performance_trained_max = getIntFromJson(data,"performance_trained_max"); |
||||
technique_min = getIntFromJson(data,"technique_min"); |
||||
technique_max = getIntFromJson(data,"technique_max"); |
||||
technique_trained_max = getIntFromJson(data,"technique_trained_max"); |
||||
visual_min = getIntFromJson(data,"visual_min"); |
||||
visual_max = getIntFromJson(data,"visual_max"); |
||||
visual_trained_max = getIntFromJson(data,"visual_trained_max"); |
||||
cameo_members = getJSONArrayFromJson(data,"cameo_members"); |
||||
System.out.println("Card Data: "+this); |
||||
} |
||||
|
||||
public static Card findCardByID(List<Card> database,int cardID) { |
||||
for (Card c : database) { |
||||
if (c.id == cardID) { |
||||
return c; |
||||
} |
||||
} |
||||
return null; |
||||
} |
||||
|
||||
public static Card pickRandomCardByStarRating(List<Card> database,int stars) { |
||||
List<Card> cardList = new ArrayList<Card>(); |
||||
for (Card c : database) { |
||||
if (c.rarity==stars) { |
||||
cardList.add(c); |
||||
} |
||||
} |
||||
return cardList.get((int)(Math.random()*cardList.size())); |
||||
} |
||||
|
||||
public static Card pickRandomCardByMemberID(List<Card> database,int memberID) { |
||||
List<Card> cardList = new ArrayList<Card>(); |
||||
for (Card c : database) { |
||||
if (c.member == memberID) { |
||||
cardList.add(c); |
||||
} |
||||
} |
||||
return cardList.get((int)(Math.random()*cardList.size())); |
||||
} |
||||
|
||||
public String getCardURL(boolean trained) { |
||||
if (trained) { |
||||
return imgURL_trained; |
||||
} else { |
||||
return imgURL; |
||||
} |
||||
} |
||||
|
||||
public String getCardArtURL(boolean trained) { |
||||
if (trained) { |
||||
return artURL_trained; |
||||
} else { |
||||
return artURL; |
||||
} |
||||
} |
||||
|
||||
public int getCardID() { |
||||
return id; |
||||
} |
||||
|
||||
public int getCardStarRating() { |
||||
return rarity; |
||||
} |
||||
|
||||
int getIntFromJson(JSONObject data, String key) { |
||||
if (data.has(key) && data.get(key) instanceof Integer) { |
||||
return data.getInt(key); |
||||
} |
||||
return -1; |
||||
} |
||||
String getStringFromJson(JSONObject data, String key) { |
||||
if (data.has(key) && data.get(key) instanceof String) { |
||||
return data.getString(key); |
||||
} |
||||
return ""; |
||||
} |
||||
JSONArray getJSONArrayFromJson(JSONObject data, String key) { |
||||
if (data.has(key) && data.get(key) instanceof JSONArray) { |
||||
return data.getJSONArray(key); |
||||
} |
||||
JSONArray empty = new JSONArray(); |
||||
return empty; |
||||
} |
||||
|
||||
public String toString() { |
||||
StringBuilder sb = new StringBuilder(); |
||||
sb.append(this.getClass().getName()+"("); |
||||
boolean first=false; |
||||
for (Field f : this.getClass().getDeclaredFields()) { |
||||
if (!first) { |
||||
try { |
||||
sb.append(f.getName()+"="+f.get(this)); |
||||
first=true; |
||||
} catch (IllegalArgumentException e) { |
||||
e.printStackTrace(); |
||||
} catch (IllegalAccessException e) { |
||||
e.printStackTrace(); |
||||
} |
||||
} else { |
||||
try { |
||||
sb.append(","+f.getName()+"="+f.get(this)); |
||||
} catch (IllegalArgumentException e) { |
||||
e.printStackTrace(); |
||||
} catch (IllegalAccessException e) { |
||||
e.printStackTrace(); |
||||
} |
||||
} |
||||
} |
||||
sb.append(")"); |
||||
return sb.toString(); |
||||
} |
||||
} |
@ -0,0 +1,78 @@ |
||||
package sig.gacha; |
||||
|
||||
import java.util.List; |
||||
|
||||
import org.json.JSONObject; |
||||
|
||||
public class Member { |
||||
int id; |
||||
String name; |
||||
String jap_name; |
||||
String imageURL; |
||||
String square_imageURL; |
||||
String band; |
||||
String school; |
||||
String school_year; |
||||
String va; |
||||
String jap_va; |
||||
String birthday; |
||||
String food_likes; |
||||
String food_dislikes; |
||||
String horoscope; |
||||
String hobbies; |
||||
String desc; |
||||
|
||||
public Member(JSONObject data) { |
||||
id = getIntFromJson(data,"id"); |
||||
name = getStringFromJson(data,"name"); |
||||
jap_name = getStringFromJson(data,"japanese_name"); |
||||
imageURL = getStringFromJson(data,"image"); |
||||
square_imageURL = getStringFromJson(data,"square_image"); |
||||
band = getStringFromJson(data,"i_band"); |
||||
school = getStringFromJson(data,"school"); |
||||
school_year = getStringFromJson(data,"i_school_year"); |
||||
va = getStringFromJson(data,"romaji_CV"); |
||||
jap_va = getStringFromJson(data,"CV"); |
||||
birthday = getStringFromJson(data,"birthday"); |
||||
food_likes = getStringFromJson(data,"food_likes"); |
||||
food_dislikes = getStringFromJson(data,"food_dislikes"); |
||||
horoscope = getStringFromJson(data,"i_astrological_sign"); |
||||
hobbies = getStringFromJson(data,"hobbies"); |
||||
desc = getStringFromJson(data,"description"); |
||||
} |
||||
|
||||
public static Member getMemberByName(List<Member> database, String name) { |
||||
for (Member m : database) { |
||||
if (m.name.split(" ")[0].equalsIgnoreCase(name)) { |
||||
return m; |
||||
} |
||||
} |
||||
return null; |
||||
} |
||||
|
||||
public static Member getMemberByID(List<Member> database, int id) { |
||||
for (Member m : database) { |
||||
if (m.id==id) { |
||||
return m; |
||||
} |
||||
} |
||||
return null; |
||||
} |
||||
|
||||
public int getMemberID() { |
||||
return id; |
||||
} |
||||
|
||||
int getIntFromJson(JSONObject data, String key) { |
||||
if (data.has(key) && data.get(key) instanceof Integer) { |
||||
return data.getInt(key); |
||||
} |
||||
return -1; |
||||
} |
||||
String getStringFromJson(JSONObject data, String key) { |
||||
if (data.has(key) && data.get(key) instanceof String) { |
||||
return data.getString(key); |
||||
} |
||||
return ""; |
||||
} |
||||
} |
@ -0,0 +1,220 @@ |
||||
package sig.gacha; |
||||
|
||||
import java.io.File; |
||||
import java.io.IOException; |
||||
import java.util.ArrayList; |
||||
import java.util.HashMap; |
||||
import java.util.List; |
||||
|
||||
import org.json.JSONException; |
||||
|
||||
import net.dv8tion.jda.core.JDA; |
||||
import net.dv8tion.jda.core.MessageBuilder; |
||||
import net.dv8tion.jda.core.entities.Message; |
||||
import net.dv8tion.jda.core.entities.MessageChannel; |
||||
import sig.BandoriBot; |
||||
import sig.FileUtils; |
||||
import sig.GachaBot; |
||||
|
||||
public class Player { |
||||
long discordID; |
||||
String discordName; |
||||
int pulls4; |
||||
int pulls3; |
||||
int pulls2; |
||||
int dupepulls4; |
||||
int dupepulls3; |
||||
int dupepulls2; |
||||
HashMap<Integer,Integer> card_collection = new HashMap<Integer,Integer>(); |
||||
|
||||
public Player(long discordID, String discordName) { |
||||
this.discordID = discordID; |
||||
this.discordName = discordName; |
||||
pulls4=0; |
||||
pulls3=0; |
||||
pulls2=0; |
||||
dupepulls4=0; |
||||
dupepulls3=0; |
||||
dupepulls2=0; |
||||
//SavePlayerProfile();
|
||||
} |
||||
|
||||
public void SavePlayerProfile() { |
||||
String[] format = GetFileData(); |
||||
FileUtils.writetoFile(format, BandoriBot.BASEDIR+"profiles/"+discordID); |
||||
} |
||||
|
||||
public int[] GetPullData() { |
||||
return new int[]{pulls2,pulls3,pulls4}; |
||||
} |
||||
|
||||
public int[] GetDupeData() { |
||||
return new int[]{dupepulls2,dupepulls3,dupepulls4}; |
||||
} |
||||
|
||||
private String[] GetFileData() { |
||||
List<String> fileFormat = new ArrayList<String>(); |
||||
fileFormat.add(Long.toString(discordID)); |
||||
fileFormat.add(discordName); |
||||
fileFormat.add(Integer.toString(pulls4)); |
||||
fileFormat.add(Integer.toString(pulls3)); |
||||
fileFormat.add(Integer.toString(pulls2)); |
||||
for (Integer card_id : card_collection.keySet()) { |
||||
Integer amt = card_collection.get(card_id); |
||||
fileFormat.add(card_id+";"+amt); |
||||
} |
||||
return fileFormat.toArray(new String[fileFormat.size()]); |
||||
} |
||||
|
||||
public boolean hasCardInCollection(Card c) { |
||||
return card_collection.containsKey(c.id); |
||||
} |
||||
|
||||
public int getNumberOfCardsInCollection(Card c) { |
||||
if (card_collection.containsKey(c.id)) { |
||||
return card_collection.get(c.id); |
||||
} else { |
||||
return 0; |
||||
} |
||||
} |
||||
|
||||
public void addCardToCollection(Card c) { |
||||
switch (c.rarity) { |
||||
case 3:{ |
||||
pulls3++; |
||||
}break; |
||||
case 4:{ |
||||
pulls4++; |
||||
}break; |
||||
default:{ |
||||
pulls2++; |
||||
} |
||||
} |
||||
if (card_collection.containsKey(c.id)) { |
||||
card_collection.put(c.id,card_collection.get(c.id)+1); |
||||
switch (c.rarity) { |
||||
case 3:{ |
||||
dupepulls3++; |
||||
}break; |
||||
case 4:{ |
||||
dupepulls4++; |
||||
}break; |
||||
default:{ |
||||
dupepulls2++; |
||||
} |
||||
} |
||||
} else { |
||||
card_collection.put(c.id, 1); |
||||
} |
||||
} |
||||
|
||||
public static Player GetPlayerProfile(Long discordID,String discordName) { |
||||
File f = new File(BandoriBot.BASEDIR+"profiles/"+discordID); |
||||
if (f.exists()) { |
||||
return GetPlayerProfile(discordID); |
||||
} else { |
||||
return new Player(discordID,discordName); |
||||
} |
||||
} |
||||
|
||||
private static Player GetPlayerProfile(long discordID) { |
||||
String[] filedata = FileUtils.readFromFile(BandoriBot.BASEDIR+"profiles/"+discordID); |
||||
int i = 0; |
||||
long tempid = Long.parseLong(filedata[i++]); |
||||
String myname = filedata[i++]; |
||||
Player p = new Player(tempid,myname); |
||||
p.pulls4 = Integer.parseInt(filedata[i++]); |
||||
p.pulls3 = Integer.parseInt(filedata[i++]); |
||||
p.pulls2 = Integer.parseInt(filedata[i++]); |
||||
while (i<filedata.length) { |
||||
String s = filedata[i++]; |
||||
String[] parse = s.split(";"); |
||||
Card c = Card.findCardByID(GachaBot.cardlist, Integer.parseInt(parse[0])); |
||||
//p.addCardToCollection(c);
|
||||
int cardcount = Integer.parseInt(parse[1]); |
||||
p.card_collection.put(c.id, cardcount); |
||||
if (cardcount>1) { |
||||
switch (c.rarity) { |
||||
case 3:{ |
||||
p.dupepulls3+=cardcount-1; |
||||
}break; |
||||
case 4:{ |
||||
p.dupepulls4+=cardcount-1; |
||||
}break; |
||||
default:{ |
||||
p.dupepulls2+=cardcount-1; |
||||
} |
||||
} |
||||
} |
||||
System.out.println("Loaded card "+c.id+" to profile "+p.discordName); |
||||
} |
||||
return p; |
||||
} |
||||
|
||||
public static void ApplyAllCardProfileChanges(JDA bot, MessageChannel channel, String name, Long discordID, |
||||
String message, List<Card> cards) { |
||||
Player p = Player.GetPlayerProfile(discordID,name); |
||||
for (Card c : cards) { |
||||
p.addCardToCollection(c); |
||||
PerformRewards(bot,channel,p,c); |
||||
} |
||||
p.SavePlayerProfile(); |
||||
} |
||||
|
||||
private static void PerformRewards(JDA bot, MessageChannel channel, Player p, Card c) { |
||||
int card_amt = p.card_collection.get(c.id); |
||||
if (c.rarity==4 && card_amt>=1 && |
||||
card_amt<3) { |
||||
//Download the image...
|
||||
try { |
||||
int card_id = c.getCardID(); |
||||
boolean trained = (card_amt==2)?true:false; |
||||
System.out.println("Requesting Card "+c+" from "+c.getCardArtURL(trained)); |
||||
FileUtils.downloadFileFromUrl(c.getCardArtURL(trained), "art/"+card_id+((trained)?"_trained":"")+".png"); |
||||
Message msg; |
||||
if (card_amt==1) { |
||||
msg = new MessageBuilder().append("*Congratulations for unlocking a new* 4\\* **"+p.discordName+"**!").append('\n'). |
||||
append("**"+Member.getMemberByID(GachaBot.memberlist, c.member).name+"** ["+c.name+"]").build(); |
||||
} else { |
||||
msg = new MessageBuilder().append("**"+p.discordName+"** unlocked the trained version of **"+Member.getMemberByID(GachaBot.memberlist, c.member).name+"** ["+c.name+"]! **Congratulations!**").build(); |
||||
} |
||||
channel.sendFile(new File(BandoriBot.BASEDIR+"art/"+card_id+((trained)?"_trained":"")+".png"),msg).queue(); |
||||
} catch (JSONException | IOException e) { |
||||
e.printStackTrace(); |
||||
} |
||||
} else |
||||
if (c.rarity==3 && card_amt>=5 && |
||||
card_amt<11) { |
||||
//Download the image...
|
||||
try { |
||||
int card_id = c.getCardID(); |
||||
boolean trained = (card_amt==10)?true:false; |
||||
System.out.println("Requesting Card "+c+" from "+c.getCardArtURL(trained)); |
||||
FileUtils.downloadFileFromUrl(c.getCardArtURL(trained), "art/"+card_id+((trained)?"_trained":"")+".png"); |
||||
Message msg; |
||||
if (card_amt==5) { |
||||
msg = new MessageBuilder().append("**Congratulations for collecting 5 **"+Member.getMemberByID(GachaBot.memberlist, c.member).name+"** ["+c.name+"] **"+p.discordName+"**!").build(); |
||||
} else { |
||||
msg = new MessageBuilder().append("**Congratulations for collecting 10 **"+Member.getMemberByID(GachaBot.memberlist, c.member).name+"** ["+c.name+"] **"+p.discordName+"**!").build(); |
||||
} |
||||
channel.sendFile(new File(BandoriBot.BASEDIR+"art/"+card_id+((trained)?"_trained":"")+".png"),msg).queue(); |
||||
} catch (JSONException | IOException e) { |
||||
e.printStackTrace(); |
||||
} |
||||
} else |
||||
if (c.rarity==2 && card_amt==100) { |
||||
//Download the image...
|
||||
try { |
||||
int card_id = c.getCardID(); |
||||
boolean trained = false; |
||||
System.out.println("Requesting Card "+c+" from "+c.getCardArtURL(trained)); |
||||
FileUtils.downloadFileFromUrl(c.getCardArtURL(trained), "art/"+card_id+((trained)?"_trained":"")+".png"); |
||||
Message msg; |
||||
msg = new MessageBuilder().append("**Congratulations for collecting 100 **"+Member.getMemberByID(GachaBot.memberlist, c.member).name+"** ["+c.name+"] **"+p.discordName+"**!").build(); |
||||
channel.sendFile(new File(BandoriBot.BASEDIR+"art/"+card_id+((trained)?"_trained":"")+".png"),msg).queue(); |
||||
} catch (JSONException | IOException e) { |
||||
e.printStackTrace(); |
||||
} |
||||
} |
||||
} |
||||
} |
After Width: | Height: | Size: 20 KiB |
After Width: | Height: | Size: 18 KiB |
Before Width: | Height: | Size: 73 KiB After Width: | Height: | Size: 72 KiB |
Before Width: | Height: | Size: 55 KiB After Width: | Height: | Size: 55 KiB |
After Width: | Height: | Size: 83 KiB |
After Width: | Height: | Size: 52 KiB |
After Width: | Height: | Size: 115 KiB |
Before Width: | Height: | Size: 82 KiB After Width: | Height: | Size: 82 KiB |
Before Width: | Height: | Size: 77 KiB After Width: | Height: | Size: 75 KiB |
After Width: | Height: | Size: 78 KiB |
After Width: | Height: | Size: 19 KiB |