package io.shockah.skylark.history;
import java.util.Collections;
import java.util.Date;
import java.util.List;
import java.util.regex.Pattern;
import org.pircbotx.Channel;
import com.j256.ormlite.stmt.Where;
import io.shockah.skylark.Bot;
import io.shockah.skylark.db.DbObject;
import io.shockah.skylark.history.db.Line;
public class HistoryQuery extends AbstractHistoryQuery {
public String nick;
public Integer lines;
public Integer seconds;
public Pattern pattern;
public boolean fromStart = false;
public HistoryQuery(Channel channel) {
super(channel);
}
@SuppressWarnings("unchecked")
@Override
public List<Line> query(HistoryPlugin plugin) {
if (lines == null && seconds == null)
throw new IllegalArgumentException("You must specify either the line count or timeframe.");
Line firstLine;
if (fromStart && seconds != null) {
firstLine = plugin.manager.app.databaseManager.queryFirst(Line.class, (qb, where) -> {
where.equals(Line.SERVER_COLUMN, channel.<Bot>getBot().manager.name);
where.equals(Line.CHANNEL_COLUMN, channel.getName());
qb.orderBy(DbObject.ID_COLUMN, true);
});
} else {
firstLine = null;
}
List<Line> results = plugin.manager.app.databaseManager.query(Line.class, qb -> {
Where<Line, Integer> where = qb.where();
where.eq(Line.SERVER_COLUMN, channel.<Bot>getBot().manager.name);
where.and();
where.eq(Line.CHANNEL_COLUMN, channel.getName());
if (nick != null) {
where.and();
where.or(
where.eq(Line.NICK_COLUMN, nick),
where.eq(Line.NICK2_COLUMN, nick)
);
}
if (pattern != null) {
where.and();
where.rawComparison(Line.CONTENT_COLUMN, "REGEXP", pattern.pattern());
}
if (seconds != null) {
if (fromStart) {
if (firstLine != null) {
where.and();
where.le(Line.DATE_COLUMN, new Date(firstLine.date.getTime() + seconds * 1000l));
}
} else {
where.and();
where.ge(Line.DATE_COLUMN, new Date(new Date().getTime() - seconds * 1000l));
}
}
qb.orderBy(DbObject.ID_COLUMN, fromStart);
if (lines != null)
qb.limit((long)lines);
});
if (!fromStart)
Collections.reverse(results);
return results;
}
}