package io.shockah.skylark.history.db; import java.util.Date; import java.util.stream.Collectors; import org.pircbotx.hooks.Event; import org.pircbotx.hooks.events.ActionEvent; import org.pircbotx.hooks.events.JoinEvent; import org.pircbotx.hooks.events.KickEvent; import org.pircbotx.hooks.events.MessageEvent; import org.pircbotx.hooks.events.ModeEvent; import org.pircbotx.hooks.events.NickChangeEvent; import org.pircbotx.hooks.events.NoticeEvent; import org.pircbotx.hooks.events.PartEvent; import org.pircbotx.hooks.events.QuitEvent; import org.pircbotx.hooks.events.UserModeEvent; import org.pircbotx.hooks.types.GenericChannelUserEvent; import com.j256.ormlite.dao.Dao; import com.j256.ormlite.field.DataType; import com.j256.ormlite.field.DatabaseField; import com.j256.ormlite.table.DatabaseTable; import io.shockah.skylark.Bot; import io.shockah.skylark.db.DatabaseManager; import io.shockah.skylark.db.DbObject; import io.shockah.skylark.event.OutActionEvent; import io.shockah.skylark.event.OutMessageEvent; import io.shockah.skylark.event.OutNoticeEvent; import io.shockah.skylark.history.HistoryPlugin; @DatabaseTable(tableName = "io_shockah_skylark_history_line") public class Line extends DbObject<Line> { public static final String SERVER_COLUMN = "server"; public static final String CHANNEL_COLUMN = "channel"; public static final String TYPE_COLUMN = "type"; public static final String CONTENT_COLUMN = "content"; public static final String DATE_COLUMN = "date"; public static final String NICK_COLUMN = "nick"; public static final String NICK2_COLUMN = "nick2"; public static enum Type { Message, Notice, Join, Part, Quit, NickChange, Kick, Action, Mode, UserMode; } @DatabaseField(canBeNull = false, columnName = SERVER_COLUMN) public String server; @DatabaseField(canBeNull = false, columnName = CHANNEL_COLUMN) public String channel; @DatabaseField(canBeNull = false, columnName = TYPE_COLUMN) public Type type; @DatabaseField(canBeNull = true, columnName = NICK_COLUMN) public String nick; @DatabaseField(canBeNull = true, columnName = NICK2_COLUMN) public String nick2; @DatabaseField(dataType = DataType.LONG_STRING, canBeNull = true, columnName = CONTENT_COLUMN) public String content; @DatabaseField(canBeNull = false, columnName = DATE_COLUMN) public Date date; @Deprecated //ORMLite-only protected Line() { } public Line(Dao<Line, Integer> dao) { super(dao); } @Override public String toString() { return toString(0, 0, 0); } public String toString(Integer idColumnLength, Integer datetimeColumnLength, int nickLength) { StringBuilder sb = new StringBuilder(); if (idColumnLength != null) { StringBuilder sb2 = new StringBuilder(); sb2.append(String.format("#%d", getId())); while (sb2.length() < idColumnLength) sb2.insert(0, ' '); if (sb.length() != 0) sb.append(' '); sb.append(sb2); } if (datetimeColumnLength != null) { HistoryPlugin plugin = getDatabaseManager().app.pluginManager.getPluginWithClass(HistoryPlugin.class); StringBuilder sb2 = new StringBuilder(); sb2.append(plugin.dateFormat.format(date)); while (sb2.length() < datetimeColumnLength) sb2.insert(0, ' '); if (sb.length() != 0) sb.append(' '); sb.append(String.format("[%s UTC]", sb2)); } switch (type) { case Message: case Notice: { { String prefix, suffix; switch (type) { case Message: prefix = "<"; suffix = ">"; break; case Notice: prefix = suffix = "-"; break; default: throw new IllegalArgumentException(); } StringBuilder sb2 = new StringBuilder(); sb2.append(String.format("%s%s%s", prefix, nick, suffix)); while (sb2.length() < nickLength) sb2.insert(0, ' '); if (sb.length() != 0) sb.append(' '); sb.append(sb2); } if (sb.length() != 0) sb.append(' '); sb.append(content); } break; default: { { StringBuilder sb2 = new StringBuilder(); sb2.append("*"); while (sb2.length() < nickLength) sb2.insert(0, ' '); if (sb.length() != 0) sb.append(' '); sb.append(sb2); } if (sb.length() != 0) sb.append(' '); switch (type) { case Join: sb.append(String.format("%s has joined %s", nick, channel)); break; case Part: sb.append(String.format("%s has left %s", nick, channel)); break; case Quit: sb.append(String.format("%s has quit (%s)", nick, content)); break; case NickChange: sb.append(String.format("%s is now known as %s", nick, nick2)); break; case Kick: sb.append(String.format("%s has kicked %s from %s (%s)", nick, nick2, channel, content)); break; case Action: sb.append(String.format("%s %s", nick, content)); break; case Mode: sb.append(String.format("%s sets %s", nick, content)); break; case UserMode: sb.append(String.format("%s sets %s on %s", nick, content, nick2)); break; default: throw new IllegalStateException(); } } } return sb.toString(); } private static void fillFromEvent(Line line, Event e) { line.server = e.<Bot>getBot().manager.name; line.date = new Date(e.getTimestamp()); } private static void fillFromGenericChannelUserEvent(Line line, GenericChannelUserEvent e) { fillFromEvent(line, (Event)e); line.channel = e.getChannel().getName(); line.nick = e.getUser() == null ? e.getUserHostmask().getNick() : e.getUser().getNick(); } public static Line createFrom(DatabaseManager manager, MessageEvent e) { return manager.create(Line.class, obj -> { fillFromGenericChannelUserEvent(obj, e); obj.type = Type.Message; obj.content = e.getMessage(); }); } public static Line createFrom(DatabaseManager manager, OutMessageEvent e) { return manager.create(Line.class, obj -> { fillFromGenericChannelUserEvent(obj, e); obj.type = Type.Message; obj.content = e.getMessage(); }); } public static Line createFrom(DatabaseManager manager, ActionEvent e) { return manager.create(Line.class, obj -> { fillFromGenericChannelUserEvent(obj, e); obj.type = Type.Action; obj.content = e.getMessage(); }); } public static Line createFrom(DatabaseManager manager, OutActionEvent e) { return manager.create(Line.class, obj -> { fillFromGenericChannelUserEvent(obj, e); obj.type = Type.Action; obj.content = e.getMessage(); }); } public static Line createFrom(DatabaseManager manager, NoticeEvent e) { return manager.create(Line.class, obj -> { fillFromGenericChannelUserEvent(obj, e); obj.type = Type.Notice; obj.content = e.getMessage(); }); } public static Line createFrom(DatabaseManager manager, OutNoticeEvent e) { return manager.create(Line.class, obj -> { fillFromGenericChannelUserEvent(obj, e); obj.type = Type.Notice; obj.content = e.getMessage(); }); } public static Line createFrom(DatabaseManager manager, JoinEvent e) { return manager.create(Line.class, obj -> { fillFromGenericChannelUserEvent(obj, e); obj.type = Type.Join; }); } public static Line createFrom(DatabaseManager manager, PartEvent e) { return manager.create(Line.class, obj -> { fillFromGenericChannelUserEvent(obj, e); obj.type = Type.Part; }); } public static Line[] createFrom(DatabaseManager manager, QuitEvent e) { return e.getUser().getChannels().stream() .map(channel -> createFrom(manager, e, channel.getName())) .collect(Collectors.toList()).toArray(new Line[0]); } public static Line createFrom(DatabaseManager manager, QuitEvent e, String channel) { return manager.create(Line.class, obj -> { fillFromEvent(obj, e); obj.channel = channel; obj.nick = e.getUser().getNick(); obj.content = e.getReason(); obj.type = Type.Quit; }); } public static Line[] createFrom(DatabaseManager manager, NickChangeEvent e) { return e.getUser().getChannels().stream() .map(channel -> createFrom(manager, e, channel.getName())) .collect(Collectors.toList()).toArray(new Line[0]); } public static Line createFrom(DatabaseManager manager, NickChangeEvent e, String channel) { return manager.create(Line.class, obj -> { fillFromEvent(obj, e); obj.channel = channel; obj.nick = e.getOldNick(); obj.nick2 = e.getNewNick(); obj.type = Type.Quit; }); } public static Line createFrom(DatabaseManager manager, KickEvent e) { return manager.create(Line.class, obj -> { fillFromGenericChannelUserEvent(obj, e); obj.type = Type.Kick; obj.nick2 = e.getRecipient().getNick(); obj.content = e.getReason(); }); } public static Line createFrom(DatabaseManager manager, ModeEvent e) { return manager.create(Line.class, obj -> { fillFromGenericChannelUserEvent(obj, e); obj.type = Type.Mode; obj.content = e.getMode(); }); } public static Line[] createFrom(DatabaseManager manager, UserModeEvent e) { return e.getUser().getChannels().stream() .map(channel -> createFrom(manager, e, channel.getName())) .collect(Collectors.toList()).toArray(new Line[0]); } public static Line createFrom(DatabaseManager manager, UserModeEvent e, String channel) { return manager.create(Line.class, obj -> { fillFromEvent(obj, e); obj.channel = channel; obj.nick = e.getUser().getNick(); obj.nick2 = e.getRecipient().getNick(); obj.type = Type.UserMode; obj.content = e.getMode(); }); } }