Merge branch 'devel'
This commit is contained in:
commit
3cac9bb0e5
@ -42,7 +42,7 @@ dependencies {
|
|||||||
// Use MySQL Connector-J
|
// Use MySQL Connector-J
|
||||||
compile 'mysql:mysql-connector-java'
|
compile 'mysql:mysql-connector-java'
|
||||||
compile 'org.reflections:reflections:0.9.11'
|
compile 'org.reflections:reflections:0.9.11'
|
||||||
|
compile 'org.apache.commons:commons-lang3:3.7'
|
||||||
|
|
||||||
testCompile('org.springframework.boot:spring-boot-starter-test')
|
testCompile('org.springframework.boot:spring-boot-starter-test')
|
||||||
testCompile('com.jayway.jsonpath:json-path')
|
testCompile('com.jayway.jsonpath:json-path')
|
||||||
|
@ -12,6 +12,7 @@ public interface Commande {
|
|||||||
void executed(boolean success, MessageReceivedEvent event);
|
void executed(boolean success, MessageReceivedEvent event);
|
||||||
boolean isPrivateUsable();
|
boolean isPrivateUsable();
|
||||||
boolean isAdminCmd();
|
boolean isAdminCmd();
|
||||||
|
boolean isNSFW();
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -77,4 +77,9 @@ public class Cat implements Commande {
|
|||||||
public boolean isAdminCmd() {
|
public boolean isAdminCmd() {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isNSFW() {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -44,4 +44,9 @@ public class DayTrigger implements Commande{
|
|||||||
public boolean isAdminCmd() {
|
public boolean isAdminCmd() {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isNSFW() {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -38,4 +38,9 @@ public class Error implements Commande{
|
|||||||
public boolean isAdminCmd() {
|
public boolean isAdminCmd() {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isNSFW() {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -68,4 +68,9 @@ public class Flush implements Commande{
|
|||||||
public boolean isAdminCmd() {
|
public boolean isAdminCmd() {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isNSFW() {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -6,6 +6,7 @@ import net.Broken.RestApi.CommandInterface;
|
|||||||
import net.Broken.Tools.EmbedMessageUtils;
|
import net.Broken.Tools.EmbedMessageUtils;
|
||||||
import net.Broken.Tools.MessageTimeOut;
|
import net.Broken.Tools.MessageTimeOut;
|
||||||
import net.Broken.Tools.PrivateMessage;
|
import net.Broken.Tools.PrivateMessage;
|
||||||
|
import net.Broken.Tools.TableRenderer;
|
||||||
import net.dv8tion.jda.core.EmbedBuilder;
|
import net.dv8tion.jda.core.EmbedBuilder;
|
||||||
import net.dv8tion.jda.core.Permission;
|
import net.dv8tion.jda.core.Permission;
|
||||||
import net.dv8tion.jda.core.entities.ChannelType;
|
import net.dv8tion.jda.core.entities.ChannelType;
|
||||||
@ -26,6 +27,7 @@ import java.util.Map;
|
|||||||
*/
|
*/
|
||||||
public class Help implements Commande {
|
public class Help implements Commande {
|
||||||
Logger logger = LogManager.getLogger();
|
Logger logger = LogManager.getLogger();
|
||||||
|
private int cellLenght = 25;
|
||||||
@Override
|
@Override
|
||||||
public boolean called(String[] args, MessageReceivedEvent event) {
|
public boolean called(String[] args, MessageReceivedEvent event) {
|
||||||
return true;
|
return true;
|
||||||
@ -114,7 +116,12 @@ public class Help implements Commande {
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
StringBuilder txt= new StringBuilder();
|
TableRenderer table = new TableRenderer();
|
||||||
|
table.setHeader("Command","PU");
|
||||||
|
|
||||||
|
TableRenderer nsfwTable = new TableRenderer();
|
||||||
|
nsfwTable.setHeader("NSFW Only\u00A0", "PU");
|
||||||
|
List<String> noPu = new ArrayList<>();
|
||||||
|
|
||||||
boolean isAdmin;
|
boolean isAdmin;
|
||||||
if(event.isFromType(ChannelType.PRIVATE))
|
if(event.isFromType(ChannelType.PRIVATE))
|
||||||
@ -124,17 +131,28 @@ public class Help implements Commande {
|
|||||||
|
|
||||||
|
|
||||||
for (Map.Entry<String, Commande> e : MainBot.commandes.entrySet()) {
|
for (Map.Entry<String, Commande> e : MainBot.commandes.entrySet()) {
|
||||||
if(!e.getValue().isAdminCmd() || isAdmin)
|
if(!e.getValue().isAdminCmd() || isAdmin){
|
||||||
txt.append("\n- ").append(e.getKey());
|
if(e.getValue().isPrivateUsable())
|
||||||
|
table.addRow(e.getKey(), "XX");
|
||||||
|
else if(e.getValue().isNSFW())
|
||||||
|
nsfwTable.addRow(e.getKey(),"");
|
||||||
|
else
|
||||||
|
noPu.add(e.getKey());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
for(String key : noPu)
|
||||||
|
table.addRow(key, "");
|
||||||
|
|
||||||
|
String txt = table.build();
|
||||||
|
txt += "\n\n";
|
||||||
|
txt += nsfwTable.build();
|
||||||
|
|
||||||
if(!event.isFromType(ChannelType.PRIVATE)){
|
if(!event.isFromType(ChannelType.PRIVATE)){
|
||||||
Message rest = event.getTextChannel().sendMessage(new EmbedBuilder().setTitle("Command envoyées par message privé").setColor(Color.green).build()).complete();
|
Message rest = event.getTextChannel().sendMessage(new EmbedBuilder().setTitle("Command envoyées par message privé").setColor(Color.green).build()).complete();
|
||||||
List<Message> messages = new ArrayList<Message>(){{
|
new MessageTimeOut(MainBot.messageTimeOut, rest, event.getMessage()).start();
|
||||||
add(rest);
|
|
||||||
add(event.getMessage());
|
|
||||||
}};
|
|
||||||
new MessageTimeOut(messages,MainBot.messageTimeOut).start();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -144,10 +162,13 @@ public class Help implements Commande {
|
|||||||
else
|
else
|
||||||
role = "Non Admin";
|
role = "Non Admin";
|
||||||
|
|
||||||
PrivateMessage.send(event.getAuthor(),EmbedMessageUtils.getHelpList(role, txt.toString()),logger);
|
try {
|
||||||
|
PrivateMessage.send(event.getAuthor(), EmbedMessageUtils.getHelpList(role, txt),logger);
|
||||||
|
} catch (FileNotFoundException e) {
|
||||||
|
logger.catching(e);
|
||||||
|
PrivateMessage.send(event.getAuthor(), EmbedMessageUtils.getInternalError(), logger);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
@ -169,4 +190,9 @@ public class Help implements Commande {
|
|||||||
public boolean isAdminCmd() {
|
public boolean isAdminCmd() {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isNSFW() {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -209,4 +209,9 @@ public class Move implements Commande {
|
|||||||
public boolean isAdminCmd() {
|
public boolean isAdminCmd() {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isNSFW() {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -172,6 +172,11 @@ public class Music implements Commande {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isNSFW() {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
public AudioM getAudioManager(){
|
public AudioM getAudioManager(){
|
||||||
return audio;
|
return audio;
|
||||||
}
|
}
|
||||||
|
@ -26,4 +26,9 @@ public class Ass extends NumberedCommande {
|
|||||||
public boolean isAdminCmd() {
|
public boolean isAdminCmd() {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isNSFW() {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -25,4 +25,9 @@ public class Boobs extends NumberedCommande {
|
|||||||
public boolean isAdminCmd() {
|
public boolean isAdminCmd() {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isNSFW() {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -26,8 +26,6 @@ public class Madame implements Commande{
|
|||||||
@Override
|
@Override
|
||||||
public void action(String[] args, MessageReceivedEvent event) {
|
public void action(String[] args, MessageReceivedEvent event) {
|
||||||
this.event = event;
|
this.event = event;
|
||||||
|
|
||||||
if(event.getTextChannel().isNSFW()) {
|
|
||||||
Redirection redirect = new Redirection();
|
Redirection redirect = new Redirection();
|
||||||
boolean success=false;
|
boolean success=false;
|
||||||
boolean error=false;
|
boolean error=false;
|
||||||
@ -64,13 +62,6 @@ public class Madame implements Commande{
|
|||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
else
|
|
||||||
{
|
|
||||||
event.getTextChannel().sendMessage(event.getAuthor().getAsMention()+"\n:warning: **__Channel règlementé! Go sur over18!__**:warning: ").queue();
|
|
||||||
|
|
||||||
logger.warn("Erreur chanel.");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void executed(boolean success, MessageReceivedEvent event) {
|
public void executed(boolean success, MessageReceivedEvent event) {
|
||||||
@ -87,22 +78,10 @@ public class Madame implements Commande{
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
private boolean isAdvertisementUrl(String url){
|
public boolean isNSFW() {
|
||||||
//Scan url
|
|
||||||
if(url.toLowerCase().contains("club") && (url.toLowerCase().contains("rejoindre") || url.toLowerCase().contains("rejoignez"))){
|
|
||||||
logger.debug("Advertisement detected with \"club\" and \"rejoidre\" or \"rejoignez\"");
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
else if(url.contains("samedi") && url.contains("dimanche")){
|
|
||||||
logger.debug("Advertisement detected with \"samedi\" and \"dimanche\"");
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
else{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
private boolean scanPageForTipeee(String url) throws StringIndexOutOfBoundsException, IOException{
|
private boolean scanPageForTipeee(String url) throws StringIndexOutOfBoundsException, IOException{
|
||||||
String content = FindContentOnWebPage.getUrlSource(url);
|
String content = FindContentOnWebPage.getUrlSource(url);
|
||||||
|
@ -11,40 +11,6 @@ public class Pipe extends NumberedCommande {
|
|||||||
super(LogManager.getLogger(), "http://feelation.com/","featured-img","img");
|
super(LogManager.getLogger(), "http://feelation.com/","featured-img","img");
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
System.out.println("ok");
|
|
||||||
String pipeLine=null;
|
|
||||||
URL pipeURL = new URL(redirect.get("http://feelation.com/random"));
|
|
||||||
URLConnection cc = pipeURL.openConnection();
|
|
||||||
BufferedReader in = new BufferedReader(new InputStreamReader(cc.getInputStream(), "UTF-8"));
|
|
||||||
String inputLine;
|
|
||||||
|
|
||||||
|
|
||||||
while ((inputLine = in.readLine()) != null)
|
|
||||||
{
|
|
||||||
System.out.println(inputLine);
|
|
||||||
if(inputLine.contains("class=\"post photo\""))
|
|
||||||
{
|
|
||||||
String[] splited = inputLine.split("<");
|
|
||||||
for(String aString:splited)
|
|
||||||
{
|
|
||||||
if(aString.startsWith("<img src"))
|
|
||||||
{
|
|
||||||
pipeLine=aString;
|
|
||||||
pipeLine=inputLine.replaceAll("<img src=\"","");
|
|
||||||
pipeLine=pipeLine.substring(0,pipeLine.indexOf("\""));
|
|
||||||
System.out.println(pipeLine);
|
|
||||||
break;
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
in.close();
|
|
||||||
event.getTextChannel().sendMessage(redirect.get("http://feelation.com/random")).queue();
|
|
||||||
*/
|
|
||||||
@Override
|
@Override
|
||||||
public String toString() {
|
public String toString() {
|
||||||
return "Pipe";
|
return "Pipe";
|
||||||
@ -59,4 +25,9 @@ public class Pipe extends NumberedCommande {
|
|||||||
public boolean isAdminCmd() {
|
public boolean isAdminCmd() {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isNSFW() {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -20,8 +20,6 @@ public class SM implements Commande {
|
|||||||
@Override
|
@Override
|
||||||
public void action(String[] args, MessageReceivedEvent event) {
|
public void action(String[] args, MessageReceivedEvent event) {
|
||||||
Redirection redirect= new Redirection();
|
Redirection redirect= new Redirection();
|
||||||
if(event.getTextChannel().getName().equals("nsfw-over18"))
|
|
||||||
{
|
|
||||||
event.getTextChannel().sendMessage(event.getAuthor().getAsMention() + "\n:warning: SM n'est plus disponible pour le moment. Pour plus d'info: https://lc.cx/cbSw :warning: ").queue();
|
event.getTextChannel().sendMessage(event.getAuthor().getAsMention() + "\n:warning: SM n'est plus disponible pour le moment. Pour plus d'info: https://lc.cx/cbSw :warning: ").queue();
|
||||||
// try {
|
// try {
|
||||||
// event.getTextChannel().sendMessage(redirect.get("https://bonjourfetish.tumblr.com/random")).queue();
|
// event.getTextChannel().sendMessage(redirect.get("https://bonjourfetish.tumblr.com/random")).queue();
|
||||||
@ -29,14 +27,6 @@ public class SM implements Commande {
|
|||||||
// logger.warn("Erreur de redirection.");
|
// logger.warn("Erreur de redirection.");
|
||||||
// event.getTextChannel().sendMessage(event.getAuthor().getAsMention() + "\n:warning: **__Erreur de redirection (5 essais), Réessayez__**:warning: ").queue();
|
// event.getTextChannel().sendMessage(event.getAuthor().getAsMention() + "\n:warning: **__Erreur de redirection (5 essais), Réessayez__**:warning: ").queue();
|
||||||
// }
|
// }
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
event.getTextChannel().sendMessage(event.getAuthor().getAsMention()+"\n:warning: **__Channel règlementé! Go sur over18!__**:warning: ").queue();
|
|
||||||
|
|
||||||
logger.warn("Erreur chanel.");
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -54,4 +44,9 @@ public class SM implements Commande {
|
|||||||
public boolean isAdminCmd() {
|
public boolean isAdminCmd() {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isNSFW() {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -29,11 +29,7 @@ public class Ping implements Commande {
|
|||||||
event.getPrivateChannel().sendMessage(":arrow_right: Pong! `" + ping+ "ms`").queue();
|
event.getPrivateChannel().sendMessage(":arrow_right: Pong! `" + ping+ "ms`").queue();
|
||||||
else {
|
else {
|
||||||
Message rest = event.getTextChannel().sendMessage(event.getAuthor().getAsMention()+"\n:arrow_right: Pong! `" + ping + "ms`").complete();
|
Message rest = event.getTextChannel().sendMessage(event.getAuthor().getAsMention()+"\n:arrow_right: Pong! `" + ping + "ms`").complete();
|
||||||
List<Message> messages = new ArrayList<Message>(){{
|
new MessageTimeOut(MainBot.messageTimeOut, event.getMessage(), rest).start();
|
||||||
add(rest);
|
|
||||||
add(event.getMessage());
|
|
||||||
}};
|
|
||||||
new MessageTimeOut(messages, MainBot.messageTimeOut).start();
|
|
||||||
}
|
}
|
||||||
LogManager.getLogger().debug("pong");
|
LogManager.getLogger().debug("pong");
|
||||||
}
|
}
|
||||||
@ -41,7 +37,6 @@ public class Ping implements Commande {
|
|||||||
@Override
|
@Override
|
||||||
public void executed(boolean success, MessageReceivedEvent event)
|
public void executed(boolean success, MessageReceivedEvent event)
|
||||||
{
|
{
|
||||||
return;
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -54,4 +49,9 @@ public class Ping implements Commande {
|
|||||||
public boolean isAdminCmd() {
|
public boolean isAdminCmd() {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isNSFW() {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -92,6 +92,11 @@ public class Spam implements Commande {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isNSFW() {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
public void pardon(MessageReceivedEvent event, String[] args){
|
public void pardon(MessageReceivedEvent event, String[] args){
|
||||||
|
|
||||||
Guild serveur = event.getGuild();
|
Guild serveur = event.getGuild();
|
||||||
|
@ -109,6 +109,11 @@ public class SpamInfo implements Commande{
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isNSFW() {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
public String formatSecond(int second){
|
public String formatSecond(int second){
|
||||||
long days = TimeUnit.SECONDS.toDays(second);
|
long days = TimeUnit.SECONDS.toDays(second);
|
||||||
second -= TimeUnit.DAYS.toSeconds(days);
|
second -= TimeUnit.DAYS.toSeconds(days);
|
||||||
|
@ -101,6 +101,7 @@ public class MainBot {
|
|||||||
{
|
{
|
||||||
Commande cmdObj = commandes.get(cmd.commande);
|
Commande cmdObj = commandes.get(cmd.commande);
|
||||||
if(!cmdObj.isAdminCmd() || cmd.event.getMember().hasPermission(Permission.ADMINISTRATOR)){
|
if(!cmdObj.isAdminCmd() || cmd.event.getMember().hasPermission(Permission.ADMINISTRATOR)){
|
||||||
|
|
||||||
if(cmd.event.isFromType(ChannelType.PRIVATE) && commandes.get(cmd.commande).isPrivateUsable())
|
if(cmd.event.isFromType(ChannelType.PRIVATE) && commandes.get(cmd.commande).isPrivateUsable())
|
||||||
{
|
{
|
||||||
|
|
||||||
@ -109,9 +110,16 @@ public class MainBot {
|
|||||||
}
|
}
|
||||||
else if (!cmd.event.isFromType(ChannelType.PRIVATE))
|
else if (!cmd.event.isFromType(ChannelType.PRIVATE))
|
||||||
{
|
{
|
||||||
|
if(!cmdObj.isNSFW() || cmd.event.getTextChannel().isNSFW()){
|
||||||
commandes.get(cmd.commande).action(cmd.args, cmd.event);
|
commandes.get(cmd.commande).action(cmd.args, cmd.event);
|
||||||
commandes.get(cmd.commande).executed(true, cmd.event);
|
commandes.get(cmd.commande).executed(true, cmd.event);
|
||||||
}
|
}
|
||||||
|
else{
|
||||||
|
Message msg = cmd.event.getTextChannel().sendMessage(cmd.event.getAuthor().getAsMention() + "\n:warning: **__Channel règlementé! Go sur over18!__**:warning: ").complete();
|
||||||
|
new MessageTimeOut(messageTimeOut, msg, cmd.event.getMessage()).start();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
else
|
else
|
||||||
cmd.event.getPrivateChannel().sendMessage(EmbedMessageUtils.getNoPrivate()).queue();
|
cmd.event.getPrivateChannel().sendMessage(EmbedMessageUtils.getNoPrivate()).queue();
|
||||||
}
|
}
|
||||||
@ -121,11 +129,7 @@ public class MainBot {
|
|||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
Message msg = cmd.event.getTextChannel().sendMessage(EmbedMessageUtils.getUnautorized()).complete();
|
Message msg = cmd.event.getTextChannel().sendMessage(EmbedMessageUtils.getUnautorized()).complete();
|
||||||
List<Message> messages = new ArrayList<Message>(){{
|
new MessageTimeOut(messageTimeOut, msg, cmd.event.getMessage()).start();
|
||||||
add(msg);
|
|
||||||
add(cmd.event.getMessage());
|
|
||||||
}};
|
|
||||||
new MessageTimeOut(messages, messageTimeOut).start();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -15,7 +15,7 @@ import java.net.URL;
|
|||||||
* Created by seb65 on 07/11/2016.
|
* Created by seb65 on 07/11/2016.
|
||||||
*/
|
*/
|
||||||
public abstract class NumberedCommande implements Commande{
|
public abstract class NumberedCommande implements Commande{
|
||||||
Logger logger = LogManager.getLogger();
|
private Logger logger = LogManager.getLogger();
|
||||||
public String HELP="T'es sérieux la?";
|
public String HELP="T'es sérieux la?";
|
||||||
int minNumber = 1;
|
int minNumber = 1;
|
||||||
int maxNumber = -1;
|
int maxNumber = -1;
|
||||||
@ -49,23 +49,15 @@ public abstract class NumberedCommande implements Commande{
|
|||||||
{
|
{
|
||||||
if(args.length == 0)
|
if(args.length == 0)
|
||||||
{
|
{
|
||||||
if(event.getTextChannel().getName().equals("nsfw-over18")) {
|
|
||||||
Redirection redirect= new Redirection();
|
|
||||||
int randomResult = (int) (minNumber + (Math.random() * (maxNumber - minNumber)));
|
int randomResult = (int) (minNumber + (Math.random() * (maxNumber - minNumber)));
|
||||||
String result = FindContentOnWebPage.doYourJob(baseURL + randomResult + "-2", divClass, htmlType);
|
String result = FindContentOnWebPage.doYourJob(baseURL + randomResult + "-2", divClass, htmlType);
|
||||||
event.getTextChannel().sendMessage(event.getAuthor().getAsMention()+"\n"+result).queue();
|
event.getTextChannel().sendMessage(event.getAuthor().getAsMention()+"\n"+result).queue();
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
event.getTextChannel().sendMessage(event.getAuthor().getAsMention()+"\n:warning: **__Channel règlementé! Go sur over18!__**:warning: ").queue();
|
|
||||||
|
|
||||||
logger.warn("Erreur chanel.");
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if(args[0].toLowerCase().equals("update"))
|
switch (args[0].toLowerCase()) {
|
||||||
{
|
case "update":
|
||||||
logger.info("update commande from " + event.getMessage().getAuthor().getName());
|
logger.info("update commande from " + event.getMessage().getAuthor().getName());
|
||||||
event.getTextChannel().sendMessage(event.getAuthor().getAsMention() + "\n:arrow_right: Updating...").queue();
|
event.getTextChannel().sendMessage(event.getAuthor().getAsMention() + "\n:arrow_right: Updating...").queue();
|
||||||
|
|
||||||
@ -75,19 +67,17 @@ public abstract class NumberedCommande implements Commande{
|
|||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
}
|
}
|
||||||
if(newNumber == maxNumber)
|
if (newNumber == maxNumber) {
|
||||||
{
|
|
||||||
event.getTextChannel().sendMessage(event.getAuthor().getAsMention() + "\n:arrow_right: Aucune nouvelle image n'a était trouver :cry:").queue();
|
event.getTextChannel().sendMessage(event.getAuthor().getAsMention() + "\n:arrow_right: Aucune nouvelle image n'a était trouver :cry:").queue();
|
||||||
}
|
} else if (newNumber - maxNumber == 1)
|
||||||
else if(newNumber-maxNumber == 1) event.getTextChannel().sendMessage(event.getAuthor().getAsMention()+"\n:arrow_right: "+(newNumber-maxNumber)+" nouvelle image a été trouvé :kissing_heart:").queue();
|
event.getTextChannel().sendMessage(event.getAuthor().getAsMention() + "\n:arrow_right: " + (newNumber - maxNumber) + " nouvelle image a été trouvé :kissing_heart:").queue();
|
||||||
else
|
else
|
||||||
event.getTextChannel().sendMessage(event.getAuthor().getAsMention() + "\n:arrow_right: " + (newNumber - maxNumber) + " nouvelles images on été trouvé :kissing_heart:").queue();
|
event.getTextChannel().sendMessage(event.getAuthor().getAsMention() + "\n:arrow_right: " + (newNumber - maxNumber) + " nouvelles images on été trouvé :kissing_heart:").queue();
|
||||||
logger.info((newNumber - maxNumber) + " new image(s) found.");
|
logger.info((newNumber - maxNumber) + " new image(s) found.");
|
||||||
maxNumber = newNumber;
|
maxNumber = newNumber;
|
||||||
}
|
break;
|
||||||
else if(args[0].toLowerCase().equals("get")) {
|
case "get":
|
||||||
if (args.length >= 2)
|
if (args.length >= 2) {
|
||||||
{
|
|
||||||
|
|
||||||
int number = -1;
|
int number = -1;
|
||||||
try {
|
try {
|
||||||
@ -109,16 +99,15 @@ public abstract class NumberedCommande implements Commande{
|
|||||||
logger.catching(e);
|
logger.catching(e);
|
||||||
event.getTextChannel().sendMessage(event.getAuthor().getAsMention() + "\n:warning: **__Erreur__** :warning:\n:arrow_right: Erreur interne...").queue();
|
event.getTextChannel().sendMessage(event.getAuthor().getAsMention() + "\n:warning: **__Erreur__** :warning:\n:arrow_right: Erreur interne...").queue();
|
||||||
}
|
}
|
||||||
}
|
} else {
|
||||||
else{
|
|
||||||
event.getTextChannel().sendMessage(event.getAuthor().getAsMention() + "\n:warning: **__Erreur__** :warning:\n:arrow_right: Erreur d'argument. `//help " + this.toString().toLowerCase() + "` pour plus d'info ").queue();
|
event.getTextChannel().sendMessage(event.getAuthor().getAsMention() + "\n:warning: **__Erreur__** :warning:\n:arrow_right: Erreur d'argument. `//help " + this.toString().toLowerCase() + "` pour plus d'info ").queue();
|
||||||
logger.warn("Bad Argument: " + event.getMessage().getContent() + " From " + event.getAuthor().getName());
|
logger.warn("Bad Argument: " + event.getMessage().getContent() + " From " + event.getAuthor().getName());
|
||||||
}
|
}
|
||||||
}
|
break;
|
||||||
else
|
default:
|
||||||
{
|
|
||||||
event.getTextChannel().sendMessage(event.getAuthor().getAsMention() + "\n:warning: **__Erreur__** :warning:\n:arrow_right: Erreur d'argument. `//help " + this.toString().toLowerCase() + "` pour plus d'info ").queue();
|
event.getTextChannel().sendMessage(event.getAuthor().getAsMention() + "\n:warning: **__Erreur__** :warning:\n:arrow_right: Erreur d'argument. `//help " + this.toString().toLowerCase() + "` pour plus d'info ").queue();
|
||||||
logger.warn("Bad Argument: " + event.getMessage().getContent() + " From " + event.getAuthor().getName());
|
logger.warn("Bad Argument: " + event.getMessage().getContent() + " From " + event.getAuthor().getName());
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
|
@ -15,6 +15,7 @@ public class EmbedMessageUtils {
|
|||||||
return new EmbedBuilder().setTitle(":warning: Commande inconnue! :warning:").setDescription(":arrow_right: Utilisez `//help` pour voirs les commandes disponible.").setColor(Color.orange).setFooter("bot.seb6596.ovh", MainBot.jda.getSelfUser().getAvatarUrl()).build();
|
return new EmbedBuilder().setTitle(":warning: Commande inconnue! :warning:").setDescription(":arrow_right: Utilisez `//help` pour voirs les commandes disponible.").setColor(Color.orange).setFooter("bot.seb6596.ovh", MainBot.jda.getSelfUser().getAvatarUrl()).build();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static EmbedBuilder getError(String message) {
|
public static EmbedBuilder getError(String message) {
|
||||||
EmbedBuilder temp = new EmbedBuilder().setTitle(":warning: Error! :warning:").setColor(Color.red).setDescription(message);
|
EmbedBuilder temp = new EmbedBuilder().setTitle(":warning: Error! :warning:").setColor(Color.red).setDescription(message);
|
||||||
return temp;
|
return temp;
|
||||||
@ -45,7 +46,6 @@ public class EmbedMessageUtils {
|
|||||||
return new EmbedBuilder().setTitle(":mute: Spam Hunter :mute:").setDescription(autor.getAsMention() + " est de retour, fais gaffe!\nJe te surveille!").setImage("https://media.giphy.com/media/3o7TKwBctlv08kY08M/giphy.gif").setFooter("Spam info disponible via '//spaminfo' en privé", null).setColor(Color.orange).build();
|
return new EmbedBuilder().setTitle(":mute: Spam Hunter :mute:").setDescription(autor.getAsMention() + " est de retour, fais gaffe!\nJe te surveille!").setImage("https://media.giphy.com/media/3o7TKwBctlv08kY08M/giphy.gif").setFooter("Spam info disponible via '//spaminfo' en privé", null).setColor(Color.orange).build();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public static MessageEmbed getHelp(String command) throws FileNotFoundException {
|
public static MessageEmbed getHelp(String command) throws FileNotFoundException {
|
||||||
String name = command.substring(0, 1).toUpperCase() + command.substring(1).toLowerCase();
|
String name = command.substring(0, 1).toUpperCase() + command.substring(1).toLowerCase();
|
||||||
String message = new ResourceLoader().getFile("Help/"+name+"/fr/main.md");
|
String message = new ResourceLoader().getFile("Help/"+name+"/fr/main.md");
|
||||||
@ -79,7 +79,6 @@ public class EmbedMessageUtils {
|
|||||||
return new EmbedBuilder().setTitle(":warning: Flush Error :warning: ").setDescription(message).setColor(Color.red).setFooter("'//help flush' pour plus d'info ", MainBot.jda.getSelfUser().getAvatarUrl()).build();
|
return new EmbedBuilder().setTitle(":warning: Flush Error :warning: ").setDescription(message).setColor(Color.red).setFooter("'//help flush' pour plus d'info ", MainBot.jda.getSelfUser().getAvatarUrl()).build();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public static MessageEmbed getRegister(String message) {
|
public static MessageEmbed getRegister(String message) {
|
||||||
return new EmbedBuilder().setTitle(":pencil: Web Registration :pencil:").setDescription(message).setColor(Color.green).setFooter("bot.seb6596.ovh", MainBot.jda.getSelfUser().getAvatarUrl()).build();
|
return new EmbedBuilder().setTitle(":pencil: Web Registration :pencil:").setDescription(message).setColor(Color.green).setFooter("bot.seb6596.ovh", MainBot.jda.getSelfUser().getAvatarUrl()).build();
|
||||||
}
|
}
|
||||||
@ -98,9 +97,12 @@ public class EmbedMessageUtils {
|
|||||||
return buildStandar(getError("Vous n'avez pas l'autorisation de faire ça!"));
|
return buildStandar(getError("Vous n'avez pas l'autorisation de faire ça!"));
|
||||||
}
|
}
|
||||||
|
|
||||||
public static MessageEmbed getHelpList(String role, String list){
|
public static MessageEmbed getHelpList(String role, String list) throws FileNotFoundException {
|
||||||
return new EmbedBuilder().setTitle("Command du bot ("+role+")").setDescription(list).setFooter("Utilise '//help <commande>' pour plus de détails.",null).setColor(Color.green).setThumbnail(MainBot.jda.getSelfUser().getAvatarUrl()).build();
|
String message = new ResourceLoader().getFile("Help/main.md");
|
||||||
|
message = message.replace("@list", list);
|
||||||
|
return new EmbedBuilder().setTitle("Command du bot ("+role+")").setDescription(message).setFooter("Utilise '//help <commande>' pour plus de détails.",null).setColor(Color.green).setThumbnail(MainBot.jda.getSelfUser().getAvatarUrl()).build();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
@ -5,6 +5,8 @@ import net.dv8tion.jda.core.exceptions.ErrorResponseException;
|
|||||||
import org.apache.logging.log4j.LogManager;
|
import org.apache.logging.log4j.LogManager;
|
||||||
import org.apache.logging.log4j.Logger;
|
import org.apache.logging.log4j.Logger;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Arrays;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
public class MessageTimeOut extends Thread{
|
public class MessageTimeOut extends Thread{
|
||||||
@ -16,6 +18,11 @@ public class MessageTimeOut extends Thread{
|
|||||||
this.second = second;
|
this.second = second;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public MessageTimeOut(int second, Message... messages) {
|
||||||
|
this.messages = Arrays.asList(messages);
|
||||||
|
this.second = second;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void run() {
|
public void run() {
|
||||||
logger.debug("Timer for message deletion stated...");
|
logger.debug("Timer for message deletion stated...");
|
||||||
|
108
src/main/java/net/Broken/Tools/TableRenderer.java
Normal file
108
src/main/java/net/Broken/Tools/TableRenderer.java
Normal file
@ -0,0 +1,108 @@
|
|||||||
|
package net.Broken.Tools;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
import java.util.stream.IntStream;
|
||||||
|
|
||||||
|
import org.apache.commons.lang3.StringUtils;
|
||||||
|
|
||||||
|
public class TableRenderer {
|
||||||
|
|
||||||
|
private int width;
|
||||||
|
private List<Object> header;
|
||||||
|
private List<List<Object>> table = new ArrayList<>();
|
||||||
|
|
||||||
|
private String empty = "";
|
||||||
|
|
||||||
|
public TableRenderer() {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setHeader(Object... header) {
|
||||||
|
this.header = Arrays.asList(header);
|
||||||
|
if (header.length > this.width)
|
||||||
|
this.width = header.length;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void addRow(Object... header) {
|
||||||
|
List<Object> objects = Arrays.asList(header);
|
||||||
|
table.add(objects);
|
||||||
|
if (header.length > this.width)
|
||||||
|
this.width = header.length;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setEmptyString(String str) {
|
||||||
|
this.empty = str;
|
||||||
|
}
|
||||||
|
|
||||||
|
private String[][] normalizeTable() {
|
||||||
|
int height = header == null ? table.size() : (table.size() + 1);
|
||||||
|
String[][] normalized = new String[height][width];
|
||||||
|
|
||||||
|
int vIndex = 0;
|
||||||
|
if (header != null) {
|
||||||
|
for (int hIndex = 0; hIndex < width; hIndex++) {
|
||||||
|
if (header.size() > hIndex)
|
||||||
|
normalized[vIndex][hIndex] = header.get(hIndex).toString();
|
||||||
|
else
|
||||||
|
normalized[vIndex][hIndex] = this.empty;
|
||||||
|
}
|
||||||
|
vIndex++;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (List<Object> obj : table) {
|
||||||
|
for (int hIndex = 0; hIndex < width; hIndex++) {
|
||||||
|
if (obj.size() > hIndex)
|
||||||
|
normalized[vIndex][hIndex] = obj.get(hIndex).toString();
|
||||||
|
else
|
||||||
|
normalized[vIndex][hIndex] = this.empty+"s";
|
||||||
|
}
|
||||||
|
vIndex++;
|
||||||
|
}
|
||||||
|
|
||||||
|
return normalized;
|
||||||
|
}
|
||||||
|
|
||||||
|
private int[] getCollumnWidths(String[][] table, int padding) {
|
||||||
|
int collums[] = new int[width];
|
||||||
|
for (int vIndex = 0; vIndex < table.length; vIndex++)
|
||||||
|
for (int hIndex = 0; hIndex < width; hIndex++)
|
||||||
|
if (table[vIndex][hIndex].length() + padding > collums[hIndex])
|
||||||
|
collums[hIndex] = table[vIndex][hIndex].length() + padding;
|
||||||
|
collums[collums.length-1] -= padding;
|
||||||
|
return collums;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private String buildElement(String element, int width, String emptyChar) {
|
||||||
|
String result = element;
|
||||||
|
if (result.length() < width)
|
||||||
|
result += StringUtils.repeat(emptyChar, width - result.length());
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
private String buildLine(String[] strings, int[] widths, boolean header) {
|
||||||
|
String line = IntStream.range(0, strings.length)
|
||||||
|
.mapToObj((i) -> buildElement(strings[i], widths[i], " "))
|
||||||
|
.collect(Collectors.joining("│ "));
|
||||||
|
line = "│ "+ line + " │";
|
||||||
|
if (header) {
|
||||||
|
String seperator = IntStream.range(0, strings.length)
|
||||||
|
.mapToObj((i) -> buildElement("", widths[i], "═"))
|
||||||
|
.collect(Collectors.joining("╪"));
|
||||||
|
line += "\n" + "╪═" + seperator + "══╪";
|
||||||
|
}
|
||||||
|
|
||||||
|
return line;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String build() {
|
||||||
|
String[][] table = normalizeTable();
|
||||||
|
int[] widths = getCollumnWidths(table, 1);
|
||||||
|
return IntStream.range(0, table.length)
|
||||||
|
.mapToObj(i -> buildLine(table[i], widths, header != null && i==0))
|
||||||
|
.collect(Collectors.joining("\n"));
|
||||||
|
}
|
||||||
|
}
|
4
src/main/resources/Help/Cat/en/main.md
Normal file
4
src/main/resources/Help/Cat/en/main.md
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
|
||||||
|
Hey look! A cat!
|
||||||
|
And he's different everytime !
|
||||||
|
That is so cute! :cat:
|
2
src/main/resources/Help/Default/en/main.md
Normal file
2
src/main/resources/Help/Default/en/main.md
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
This command doesn't have any help at the moment.
|
||||||
|
To help us improve: https://github.com/BrokenFire/BrokenDiscordBot
|
3
src/main/resources/Help/Flush/en/main.md
Normal file
3
src/main/resources/Help/Flush/en/main.md
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
|
||||||
|
`//flush <number>`
|
||||||
|
:arrow_right: *Erase the n last posts (Max = 100)*
|
2
src/main/resources/Help/Move/en/main.md
Normal file
2
src/main/resources/Help/Move/en/main.md
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
`//move <@user> <@targeted_role>`
|
||||||
|
:arrow_right: *Move an user to the targeted role.*
|
@ -1,2 +1,2 @@
|
|||||||
`//move <@utilisateur> <@rôleCible>`
|
`//move <@utilisateur> <@rôleCible>`
|
||||||
:arrow_right: *Deplacement d'un utilisateur vers un rôle cible, attention à bien faire des montions.*
|
:arrow_right: *Deplacement d'un utilisateur vers un rôle cible, attention à bien faire les mentions.*
|
26
src/main/resources/Help/Music/en/main.md
Normal file
26
src/main/resources/Help/Music/en/main.md
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
`//music play <url>`
|
||||||
|
:arrow_right: *Let's dance! Sets the vocal chat to use.*
|
||||||
|
|
||||||
|
`//music pause`
|
||||||
|
:arrow_right: *Pause the current track.*
|
||||||
|
|
||||||
|
`//music resume`
|
||||||
|
:arrow_right: *Resume the current track.*
|
||||||
|
|
||||||
|
`//music next`
|
||||||
|
:arrow_right: *Skip the current track.*
|
||||||
|
|
||||||
|
`//music stop`
|
||||||
|
:arrow_right: *Stop the current track and empty the playlist.*
|
||||||
|
|
||||||
|
`//music info`
|
||||||
|
:arrow_right: *Show info of the current track.*
|
||||||
|
|
||||||
|
`//music flush`
|
||||||
|
:arrow_right: *Delete the current playlist.*
|
||||||
|
|
||||||
|
`//music list`
|
||||||
|
:arrow_right: *Show information of the current playlist.*
|
||||||
|
|
||||||
|
`//music add(Next) <url>`
|
||||||
|
:arrow_right: *Add the url to the current playlist.*
|
@ -1,5 +1,5 @@
|
|||||||
`//music play <url>`
|
`//music play <url>`
|
||||||
:arrow_right: *Let's dance! Deffinit le chat vocal à utiliser.*
|
:arrow_right: *Let's dance! Definit le chat vocal à utiliser.*
|
||||||
|
|
||||||
`//music pause`
|
`//music pause`
|
||||||
:arrow_right: *Mise en pause de la piste en cours.*
|
:arrow_right: *Mise en pause de la piste en cours.*
|
||||||
@ -8,10 +8,10 @@
|
|||||||
:arrow_right: *Reprise de la lecture de la piste en cours.*
|
:arrow_right: *Reprise de la lecture de la piste en cours.*
|
||||||
|
|
||||||
`//music next`
|
`//music next`
|
||||||
:arrow_right: *Change le piste en cours.*
|
:arrow_right: *Change la piste en cours.*
|
||||||
|
|
||||||
`//music stop`
|
`//music stop`
|
||||||
:arrow_right: *Arrête la piste en cours.*
|
:arrow_right: *Arrête la piste en cours et supprime la playlist.*
|
||||||
|
|
||||||
`//music info`
|
`//music info`
|
||||||
:arrow_right: *Affiche les infos de la piste en cours.*
|
:arrow_right: *Affiche les infos de la piste en cours.*
|
||||||
@ -23,4 +23,4 @@
|
|||||||
:arrow_right: *Affiche la playlist en cours.*
|
:arrow_right: *Affiche la playlist en cours.*
|
||||||
|
|
||||||
`//music add(Next) <url>`
|
`//music add(Next) <url>`
|
||||||
:arrow_right: *Ajoute l'url à la playlist en cour.*
|
:arrow_right: *Ajoute l'url à la playlist en cours.*
|
2
src/main/resources/Help/Ping/en/main.md
Normal file
2
src/main/resources/Help/Ping/en/main.md
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
`//ping`
|
||||||
|
:arrow_right: *Send back the bot's ping*
|
8
src/main/resources/Help/Spam/en/main.md
Normal file
8
src/main/resources/Help/Spam/en/main.md
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
`//spam extermine <@user> <multiplier>`
|
||||||
|
:arrow_right: *Penalize a spammer.*
|
||||||
|
|
||||||
|
`//spam pardon <@user>`
|
||||||
|
:arrow_right: *Forgive a spammer*
|
||||||
|
|
||||||
|
`//spam reset <@user>`
|
||||||
|
:arrow_right: *Reset the user's multiplier.*
|
2
src/main/resources/Help/SpamInfo/en/main.md
Normal file
2
src/main/resources/Help/SpamInfo/en/main.md
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
`//spaminfo <@user> `
|
||||||
|
:arrow_right: *Show punishment's information against the spam of the mentioned user (the author if there is no mention)*
|
5
src/main/resources/Help/main.md
Normal file
5
src/main/resources/Help/main.md
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
```
|
||||||
|
@list
|
||||||
|
```
|
||||||
|
|
||||||
|
_PU = Private Usable (Utilisable en Message Privée)_
|
@ -1,5 +1,5 @@
|
|||||||
|
|
||||||
Une tentative d'association à etait demandé.
|
Une tentative d'association a été demandée.
|
||||||
|
|
||||||
Voici le code de vérification:
|
Voici le code de vérification:
|
||||||
**%code**
|
**%code**
|
||||||
|
Loading…
Reference in New Issue
Block a user