package cn.jcenterhome.service;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import cn.jcenterhome.util.BeanFactory;
import cn.jcenterhome.util.Common;
import cn.jcenterhome.util.JavaCenterHome;
public class PmService {
private DataBaseService dataBaseService = (DataBaseService) BeanFactory.getBean("dataBaseService");
private final int PMLIMIT1DAY_ERROR = -1;
private final int PMFLOODCTRL_ERROR = -2;
private final int PMMSGTONOTFRIEND = -3;
private final int PMSENDREGDAYS = -4;
private Map<String, Object> user = null;
public List<Map<String, Object>> getPmByToUid(int uid, int toUid, int startTime, int endTime) {
List<Map<String, Object>> arr1 = dataBaseService.executeQuery("SELECT * FROM "
+ JavaCenterHome.getTableName("pms") + " WHERE msgfromid='" + uid + "' AND msgtoid='" + toUid
+ "' AND dateline>='" + startTime + "' AND dateline<'" + endTime
+ "' AND related>'0' AND delstatus IN (0,2) ORDER BY dateline");
List<Map<String, Object>> arr2 = dataBaseService.executeQuery("SELECT * FROM "
+ JavaCenterHome.getTableName("pms") + " WHERE msgfromid='" + toUid + "' AND msgtoid='" + uid
+ "' AND dateline>='" + startTime + "' AND dateline<'" + endTime
+ "' AND related>'0' AND delstatus IN (0,1) ORDER BY dateline");
Set<Map<String, Object>> set = new HashSet<Map<String, Object>>();
set.addAll(arr1);
set.addAll(arr2);
List<Map<String, Object>> arr = new ArrayList<Map<String, Object>>(set);
Collections.sort(arr, new Comparator<Map<String, Object>>() {
public int compare(Map<String, Object> c1, Map<String, Object> c2) {
if (c1.get("dateline") == c2.get("dateline")) {
return 0;
}
return ((Integer) c1.get("dateline") < (Integer) c2.get("dateline")) ? -1 : 1;
}
});
return arr;
}
public void setPmStatus(int uid, int toUid, int pmid, int status) {
int oldStatus = 0;
int newStatus = 0;
if (status == 0) {
oldStatus = 1;
newStatus = 0;
} else {
oldStatus = 0;
newStatus = 1;
}
if (toUid > 0) {
dataBaseService.executeUpdate("UPDATE " + JavaCenterHome.getTableName("pms") + " SET new='"
+ newStatus + "' WHERE msgfromid IN (" + toUid + ") AND msgtoid='" + uid + "' AND new='"
+ oldStatus + "'");
}
if (pmid > 0) {
dataBaseService.executeUpdate("UPDATE " + JavaCenterHome.getTableName("pms") + " SET new='"
+ newStatus + "' WHERE pmid IN (" + pmid + ") AND msgtoid='" + uid + "' AND new='"
+ oldStatus + "'");
}
}
public List<Map<String, Object>> getPmByPmid(int uid, int pmid) {
List<Map<String, Object>> arr = dataBaseService.executeQuery("SELECT * FROM "
+ JavaCenterHome.getTableName("pms") + " WHERE pmid='" + pmid + "' AND (msgtoid IN ('" + uid
+ "','0') OR msgfromid='" + uid + "')");
return arr;
}
public Map getBlackls(int uid, Object uids) {
Map blackLs = null;
if (Common.empty(uids)) {
List<Map<String, Object>> list = dataBaseService.executeQuery("SELECT blacklist FROM "
+ JavaCenterHome.getTableName("member") + " WHERE uid='" + uid + "'");
if (list.size() > 0) {
blackLs = list.get(0);
}
} else {
blackLs = new HashMap();
List<Map<String, Object>> list = dataBaseService
.executeQuery("SELECT uid, blacklist FROM " + JavaCenterHome.getTableName("member")
+ " WHERE uid IN (" + Common.sImplode(uids) + ")");
for (Map<String, Object> data : list) {
blackLs.put(data.get("uid"), ((String) data.get("blacklist")).split(","));
}
}
return blackLs;
}
public List<Map<String, Object>> getPmList(int uid, int pmNum, String folder, String filter, int start,
int ppp) {
ppp = ppp > 0 ? ppp : 10;
String sql = null;
if ("newbox".equals(folder)) {
folder = "inbox";
filter = "newpm";
}
if ("inbox".equals(folder) || "outbox".equals(folder)) {
String filterAdd = null;
if (filter.equals("newpm")) {
filterAdd = "pm.msgtoid='"
+ uid
+ "' AND (pm.related='0' AND pm.msgfromid>'0' OR pm.msgfromid='0') AND pm.folder='inbox' AND pm.new='1'";
} else if (filter.equals("systempm")) {
filterAdd = "pm.msgtoid='" + uid + "' AND pm.msgfromid='0' AND pm.folder='inbox'";
} else if (filter.equals("privatepm")) {
filterAdd = "pm.msgtoid='" + uid
+ "' AND pm.related='0' AND pm.msgfromid>'0' AND pm.folder='inbox'";
} else if (filter.equals("announcepm")) {
filterAdd = "pm.msgtoid='0' AND pm.folder='inbox'";
} else {
filterAdd = "pm.msgtoid='" + uid + "' AND pm.related='0' AND pm.folder='inbox'";
}
sql = "SELECT m.username as msgfrom,pm.* FROM " + JavaCenterHome.getTableName("pms")
+ " pm LEFT JOIN " + JavaCenterHome.getTableName("space")
+ " m ON pm.msgfromid = m.uid WHERE " + filterAdd + " ORDER BY pm.dateline DESC LIMIT "
+ start + ", " + ppp;
} else if ("searchbox".equals(folder)) {
String filterAdd = "msgtoid='" + uid + "' AND folder='inbox' AND message LIKE '%"
+ (Common.addCSlashes(filter, new char[] {'%', '_'}).replace("_", "\\_")) + "%'";
sql = "SELECT * FROM " + JavaCenterHome.getTableName("pms") + " WHERE " + filterAdd
+ " ORDER BY dateline DESC LIMIT " + start + ", " + ppp;
}
List<Map<String, Object>> list = null;
if (sql != null) {
int time = Common.time();
int today = time - time % 86400;
list = dataBaseService.executeQuery(sql);
int dateRange = 0;
for (Map<String, Object> data : list) {
dateRange = 5;
if ((Integer) data.get("dateline") >= today) {
dateRange = 1;
} else if ((Integer) data.get("dateline") >= today - 86400) {
dateRange = 2;
} else if ((Integer) data.get("dateline") >= today - 172800) {
dateRange = 3;
} else if ((Integer) data.get("dateline") >= today - 604800) {
dateRange = 4;
}
data.put("daterange", dateRange);
data.put("subject", Common.htmlSpecialChars((String) data.get("subject")));
if ("announcepm".equals(filter)) {
data.remove("msgfromid");
data.remove("msgfrom");
}
data.put("touid",
uid == (data.get("msgfromid") == null ? 0 : (Integer) data.get("msgfromid")) ? data
.get("msgtoid") : data.get("msgfromid"));
}
}
if (folder == "inbox") {
dataBaseService.executeUpdate("DELETE FROM " + JavaCenterHome.getTableName("newpm")
+ " WHERE uid='" + uid + "'");
}
return list == null ? new ArrayList<Map<String, Object>>() : list;
}
public String removeCode(String str, int length) {
return Common.trim(Common.cutstr(str.replaceAll(
"\\[(email|code|quote|img)=?.*\\].*?\\[\\/(email|code|quote|img)\\](?is)", "").replaceAll(
"(?is)\\[/?(b|i|url|u|color|size|font|align|list|indent|float)=?[^]]*\\]", "").replaceAll(
"\r\n", ""), length));
}
public int getNum(int uid, String folder, String filter) {
int num = 0;
String sql = null;
if ("newbox".equals(folder)) {
sql = "SELECT COUNT(*) FROM " + JavaCenterHome.getTableName("pms") + " WHERE msgtoid='" + uid
+ "' AND (related='0' AND msgfromid>'0' OR msgfromid='0') AND folder='inbox' AND new='1'";
} else if ("outbox".equals(folder) || "inbox".equals(folder)) {
String filterAdd = null;
if (filter.equals("newpm")) {
filterAdd = "msgtoid='"
+ uid
+ "' AND (related='0' AND msgfromid>'0' OR msgfromid='0') AND folder='inbox' AND new='1'";
} else if (filter.equals("systempm")) {
filterAdd = "msgtoid='" + uid + "' AND msgfromid='0' AND folder='inbox'";
} else if (filter.equals("privatepm")) {
filterAdd = "msgtoid='" + uid + "' AND related='0' AND msgfromid>'0' AND folder='inbox'";
} else if (filter.equals("announcepm")) {
filterAdd = "msgtoid='0' AND folder='inbox'";
} else {
filterAdd = "msgtoid='" + uid + "' AND related='0' AND folder='inbox'";
}
sql = "SELECT COUNT(*) FROM " + JavaCenterHome.getTableName("pms") + " WHERE " + filterAdd;
}
if (sql != null) {
num = dataBaseService.findRows(sql);
}
return num;
}
public int getPageStart(int page, int ppp, int totalnum) {
double totalpage = Math.ceil((double) totalnum / (double) ppp);
page = (int) Math.max(1, Math.min(totalpage, page));
return (page - 1) * ppp;
}
public int jcSendPm(HttpServletRequest request, HttpServletResponse response, int fromUid, String msgto,
String subject, String message, int replyPmId, boolean isUserName, boolean isAddrbook) throws Exception {
Map<String, Object> user = null;
this.user = new HashMap<String, Object>();
if (fromUid > 0) {
List<Map<String, Object>> userList = dataBaseService
.executeQuery("SELECT uid,username,dateline FROM " + JavaCenterHome.getTableName("space")
+ " WHERE uid='" + fromUid + "'");
if (userList.size() == 0) {
return 0;
}
user = userList.get(0);
this.user.put("uid", user.get("uid"));
this.user.put("username", Common.addSlashes((String) user.get("username")));
} else {
user = new HashMap<String, Object>();
user.put("dateline", 0);
this.user.put("uid", 0);
this.user.put("username", "");
}
if (replyPmId > 0) {
isUserName = true;
List<Map<String, Object>> pms = getPmByPmid((Integer) this.user.get("uid"), replyPmId);
if (pms.size() > 0) {
if (pms.get(0).get("msgfromid") == this.user.get("uid")) {
List<Map<String, Object>> userList = dataBaseService
.executeQuery("SELECT uid,username,dateline FROM "
+ JavaCenterHome.getTableName("space") + " WHERE uid='"
+ pms.get(0).get("msgtoid") + "'");
if (userList.size() > 0) {
user = userList.get(0);
}
msgto = (String) user.get("username");
} else {
msgto = (String) pms.get(0).get("msgfrom");
}
}
}
Object[] msgtoArr = Common.uniqueArray(msgto.split(","));
if (isUserName) {
msgtoArr = name2id(msgtoArr).toArray();
}
Map blackLs = new HashMap();
if (Common.empty(msgtoArr)) {
List<Map<String, Object>> blackList = dataBaseService.executeQuery("SELECT blacklist FROM "
+ JavaCenterHome.getTableName("member") + " WHERE uid='" + this.user.get("uid") + "'");
if (blackList.size() > 0) {
blackLs = blackList.get(0);
blackLs.put("blacklist", blackLs.get("blacklist").toString().split(","));
}
} else {
List<Map<String, Object>> blackList = dataBaseService.executeQuery("SELECT uid, blacklist FROM "
+ JavaCenterHome.getTableName("member") + " WHERE uid IN (" + Common.sImplode(msgtoArr)
+ ")");
for (Map<String, Object> data : blackList) {
blackLs.put(data.get("uid"), data.get("blacklist").toString().split(","));
}
}
if (fromUid > 0) {
Map sConfig = (Map) request.getAttribute("sConfig");
if (!Common.empty(sConfig.get("pmsendregdays"))) {
if ((Integer) user.get("dateline") > Common.time()
- ((Integer) sConfig.get("pmsendregdays") * 86400)) {
return PMSENDREGDAYS;
}
}
if (!isAddrbook && msgtoArr.length > 1 && !isFriend(fromUid, msgtoArr)) {
return PMMSGTONOTFRIEND;
}
boolean pmlimit1day = false;
if (!Common.empty(sConfig.get("pmlimit1day"))) {
pmlimit1day = getPmCountByFromUid((Integer) this.user.get("uid"), 86400) > (Integer) sConfig
.get("pmlimit1day");
}
if (pmlimit1day
|| (!Common.empty(sConfig.get("pmfloodctrl")) && getPmCountByFromUid((Integer) this.user
.get("uid"), (Integer) sConfig.get("pmfloodctrl")) > 0)) {
if (!isFriend(fromUid, msgtoArr)) {
if (!isReplyPm(fromUid, msgtoArr)) {
if (pmlimit1day) {
return PMLIMIT1DAY_ERROR;
} else {
return PMFLOODCTRL_ERROR;
}
}
}
}
}
int lastPmId = 0;
for (Object uid : msgtoArr) {
uid = Common.intval(uid.toString());
if (fromUid == 0 || !Common.in_array((String[]) blackLs.get(uid), "{ALL}")) {
blackLs.put(uid, name2id((String[]) blackLs.get(uid)));
if (fromUid == 0 || blackLs.get(uid) != null
&& !((List) blackLs.get(uid)).contains(this.user.get("uid"))) {
lastPmId = sendPm(request, response, subject, message, this.user, (Integer) uid,
replyPmId);
}
}
}
return lastPmId;
}
private int getPmCountByFromUid(int uid, int timeOffSet) {
int dateline = Common.time() - timeOffSet;
return dataBaseService.findRows("SELECT COUNT(*) FROM " + JavaCenterHome.getTableName("pms")
+ " WHERE msgfromid='" + uid + "' AND dateline>'" + dateline + "'");
}
private boolean isFriend(int uid, Object[] friendIds) {
if (dataBaseService.findRows("SELECT COUNT(*) FROM " + JavaCenterHome.getTableName("friend")
+ " WHERE uid=" + uid + " AND fuid IN (" + Common.sImplode(friendIds) + ") AND status='1'") == friendIds.length) {
return true;
} else {
return false;
}
}
private boolean isReplyPm(int uid, Object[] touIds) {
List<Map<String, Object>> pmList = dataBaseService.executeQuery("SELECT msgfromid, msgtoid FROM "
+ JavaCenterHome.getTableName("pms") + " WHERE msgfromid IN ('"
+ Common.implode(touIds, "', '") + "') AND msgtoid='" + uid + "' AND related=1");
Map pmReply = new HashMap();
for (Map<String, Object> data : pmList) {
pmReply.put(data.get("msgfromid"), data);
}
for (Object val : touIds) {
if (pmReply.get(val) == null) {
return false;
}
}
return true;
}
private List<Integer> name2id(Object[] userNamesArr) {
for (int i = 0; i < userNamesArr.length; i++) {
userNamesArr[i] = Common.addSlashes(Common.stripSlashes(userNamesArr[i].toString()));
}
List<Map<String, Object>> uids = dataBaseService.executeQuery("SELECT uid FROM "
+ JavaCenterHome.getTableName("space") + " WHERE username IN("
+ Common.sImplode(userNamesArr) + ")");
List<Integer> arr = new ArrayList<Integer>(uids.size());
for (Map<String, Object> value : uids) {
arr.add((Integer) value.get("uid"));
}
return arr;
}
private int sendPm(HttpServletRequest request, HttpServletResponse response, String subject,
String message, Map<String, Object> msgFrom, int msgTo, int related) throws Exception {
if (!Common.empty(msgFrom.get("uid")) && (Integer) msgFrom.get("uid") == msgTo) {
return 0;
}
message = Common.getStr(message, -1, false, false, true, 0, 0, request, response);
subject = Common.getStr(subject, -1, false, false, true, 0, 0, request, response);
String box = "inbox";
if ("".equals(subject) && related == 0) {
subject = removeCode(message, 75);
} else {
subject = Common.cutstr(subject, 75, "");
}
int lastPmId = 0;
Map<String, Object> sGlobal = (Map<String, Object>) request.getAttribute("sGlobal");
int timeStamp = (Integer) sGlobal.get("timestamp");
if (!Common.empty(msgFrom.get("uid"))) {
int sessionExist = dataBaseService.findRows("SELECT COUNT(*) FROM "
+ JavaCenterHome.getTableName("pms") + " WHERE msgfromid='" + msgFrom.get("uid")
+ "' AND msgtoid='" + msgTo + "' AND folder='inbox' AND related='0'");
if (sessionExist == 0 || sessionExist > 1) {
if (sessionExist > 1) {
dataBaseService.executeUpdate("DELETE FROM " + JavaCenterHome.getTableName("pms")
+ " WHERE msgfromid='" + msgFrom.get("uid") + "' AND msgtoid='" + msgTo
+ "' AND folder='inbox' AND related='0'");
}
lastPmId = dataBaseService
.insert("INSERT INTO "
+ JavaCenterHome.getTableName("pms")
+ " (msgfrom,msgfromid,msgtoid,folder,new,subject,dateline,related,message,fromappid) VALUES ('"
+ msgFrom.get("username") + "','" + msgFrom.get("uid") + "','" + msgTo
+ "','" + box + "','1','" + subject + "','" + timeStamp + "','0','" + message
+ "','" + JavaCenterHome.jchConfig.get("JC_APPID") + "')");
} else {
dataBaseService.executeUpdate("UPDATE " + JavaCenterHome.getTableName("pms")
+ " SET subject='" + subject + "', message='" + message + "', dateline='" + timeStamp
+ "', new='1', fromappid='" + JavaCenterHome.jchConfig.get("JC_APPID")
+ "' WHERE msgfromid='" + msgFrom.get("uid") + "' AND msgtoid='" + msgTo
+ "' AND folder='inbox' AND related='0'");
}
sessionExist = dataBaseService.findRows("SELECT COUNT(*) FROM "
+ JavaCenterHome.getTableName("pms") + " WHERE msgfromid='" + msgTo + "' AND msgtoid='"
+ msgFrom.get("uid") + "' AND folder='inbox' AND related='0'");
if (sessionExist == 0) {
dataBaseService
.executeUpdate("INSERT INTO "
+ JavaCenterHome.getTableName("pms")
+ " (msgfrom,msgfromid,msgtoid,folder,new,subject,dateline,related,message,fromappid) VALUES ('"
+ msgFrom.get("username") + "','" + msgTo + "','" + msgFrom.get("uid")
+ "','" + box + "','0','" + subject + "','" + timeStamp + "','0','" + message
+ "','0')");
}
lastPmId = dataBaseService
.insert("INSERT INTO "
+ JavaCenterHome.getTableName("pms")
+ " (msgfrom,msgfromid,msgtoid,folder,new,subject,dateline,related,message,fromappid) VALUES ('"
+ msgFrom.get("username") + "','" + msgFrom.get("uid") + "','" + msgTo + "','"
+ box + "','1','" + subject + "','" + timeStamp + "','1','" + message + "','"
+ JavaCenterHome.jchConfig.get("JC_APPID") + "')");
} else {
lastPmId = dataBaseService
.insert("INSERT INTO "
+ JavaCenterHome.getTableName("pms")
+ " (msgfrom,msgfromid,msgtoid,folder,new,subject,dateline,related,message,fromappid) VALUES ('"
+ msgFrom.get("username") + "','" + msgFrom.get("uid") + "','" + msgTo + "','"
+ box + "','1','" + subject + "','" + timeStamp + "','0','" + message + "','"
+ JavaCenterHome.jchConfig.get("JC_APPID") + "')");
}
dataBaseService.executeUpdate("REPLACE INTO " + JavaCenterHome.getTableName("newpm")
+ " (uid) VALUES ('" + msgTo + "')");
return lastPmId;
}
}