improve - subscribe event pop up register links automatically

This commit is contained in:
Sola
2015-12-26 00:39:15 +08:00
parent a506a7742f
commit 3e0c907655
9 changed files with 102 additions and 18 deletions

View File

@@ -59,7 +59,7 @@ public class GetUser extends HttpServlet {
return new Response(Response.ResponseCode.UNAUTHORIZED);
}
Operator op = (Operator) session.getAttribute(Attribute.OPERATOR);
if (op.getAccess() != Access.ROOT) {
if (op.getAccess() > Access.LEADER) {
return new Response(Response.ResponseCode.PERMISSION_DENIED);
}

View File

@@ -32,6 +32,7 @@ public class Settings {
public int Check_Spam_Interval;
public int User_Session_Max_Inactive;
public int User_Wechat_Cache_Expire_Time;
//No arg constructor for Yaml.loadAs
public Settings() { I = this; }

View File

@@ -72,6 +72,16 @@ public class TableTicket extends SQLCore {
}
}
@SuppressWarnings("unchecked")
public static List<Ticket> unsolved() {
try (Session s = SQLCore.sf.openSession()) {
return s.createCriteria(Ticket.class)
.add(Restrictions.ne(Ticket.PROPERTY_STATUS, Status.SOLVED))
.createCriteria(Ticket.PROPERTY_USER)
.list();
}
}
@SuppressWarnings("unchecked")
public static List<Object[]> track(int tid) {
try (Session s = SQLCore.sf.openSession()) {

View File

@@ -1,9 +1,16 @@
package love.sola.netsupport.sql;
import com.google.common.cache.CacheBuilder;
import com.google.common.cache.CacheLoader;
import com.google.common.cache.LoadingCache;
import love.sola.netsupport.config.Settings;
import love.sola.netsupport.pojo.User;
import org.hibernate.Session;
import org.hibernate.criterion.Restrictions;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.TimeUnit;
/**
* ***********************************************
* Created by Sola on 2015/11/10.
@@ -28,19 +35,21 @@ public class TableUser extends SQLCore {
}
}
public static User getByWechat(String wechat) {
try (Session s = sf.openSession()) {
return (User) s.createCriteria(User.class).add(Restrictions.eq(User.PROPERTY_WECHAT, wechat)).uniqueResult();
}
}
public static User getByName(String name) {
try (Session s = sf.openSession()) {
return (User) s.createCriteria(User.class).add(Restrictions.eq(User.PROPERTY_NAME, name)).uniqueResult();
}
}
public static User getByWechat(String wechat) {
try {
return cache.get(wechat);
} catch (ExecutionException e) {
e.printStackTrace();
return null;
}
}
public static int update(User user) {
try (Session s = sf.openSession()) {
s.beginTransaction();
@@ -58,4 +67,23 @@ public class TableUser extends SQLCore {
}
}
private static LoadingCache<String, User> cache = CacheBuilder.newBuilder()
.concurrencyLevel(4)
.maximumSize(4096)
.expireAfterWrite(Settings.I.User_Wechat_Cache_Expire_Time, TimeUnit.SECONDS)
.build(new ValueLoader());
private static class ValueLoader extends CacheLoader<String, User> {
@Override
public User load(String key) throws Exception {
return TableUser.getByWechat0(key);
}
}
private static User getByWechat0(String wechat) {
try (Session s = sf.openSession()) {
return (User) s.createCriteria(User.class).add(Restrictions.eq(User.PROPERTY_WECHAT, wechat)).uniqueResult();
}
}
}

View File

@@ -2,6 +2,7 @@ package love.sola.netsupport.wechat;
import love.sola.netsupport.config.Settings;
import love.sola.netsupport.wechat.handler.RegisterHandler;
import love.sola.netsupport.wechat.handler.SubscribeHandler;
import love.sola.netsupport.wechat.matcher.CheckSpamMatcher;
import love.sola.netsupport.wechat.matcher.RegisterMatcher;
import me.chanjar.weixin.common.util.StringUtils;
@@ -56,11 +57,7 @@ public class WxMpServlet extends HttpServlet {
.async(false)
.msgType("event")
.event("subscribe")
.handler((wxMessage, context, wxMpService1, sessionManager)
-> WxMpXmlOutMessage.TEXT()
.fromUser(wxMessage.getToUserName())
.toUser(wxMessage.getFromUserName())
.content(lang("Event_Subscribe")).build())
.handler(new SubscribeHandler())
.end();
wxMpMessageRouter.rule()
.async(false)

View File

@@ -36,12 +36,12 @@ public class RegisterHandler implements WxMpMessageHandler {
WxSession session = WechatSession.get(id, true);
if (u != null) {
session.setAttribute(Attribute.AUTHORIZED, Command.PROFILE);
session.setAttribute(Attribute.WECHAT, wxMessage.getFromUserName());
session.setAttribute(Attribute.WECHAT, fromUser);
session.setAttribute(Attribute.USER, u);
out.content(format("Already_Registered", format("User_Profile_Link", id, u.getName(), u.getIsp().id, u.getNetAccount(), u.getBlock(), u.getRoom(), u.getPhone())));
} else {
session.setAttribute(Attribute.AUTHORIZED, Command.REGISTER);
session.setAttribute(Attribute.WECHAT, wxMessage.getFromUserName());
session.setAttribute(Attribute.WECHAT, fromUser);
out.content(format("User_Register", format("User_Register_Link", id)));
}
return out.build();

View File

@@ -0,0 +1,48 @@
package love.sola.netsupport.wechat.handler;
import love.sola.netsupport.enums.Attribute;
import love.sola.netsupport.pojo.User;
import love.sola.netsupport.sql.TableUser;
import love.sola.netsupport.wechat.Command;
import love.sola.netsupport.wechat.WechatSession;
import me.chanjar.weixin.common.exception.WxErrorException;
import me.chanjar.weixin.common.session.WxSession;
import me.chanjar.weixin.common.session.WxSessionManager;
import me.chanjar.weixin.mp.api.WxMpMessageHandler;
import me.chanjar.weixin.mp.api.WxMpService;
import me.chanjar.weixin.mp.bean.WxMpXmlMessage;
import me.chanjar.weixin.mp.bean.WxMpXmlOutMessage;
import me.chanjar.weixin.mp.bean.outxmlbuilder.TextBuilder;
import java.util.Map;
import static love.sola.netsupport.config.Lang.format;
/**
* ***********************************************
* Created by Sola on 2015/12/25.
* Don't modify this source without my agreement
* ***********************************************
*/
public class SubscribeHandler implements WxMpMessageHandler {
@Override
public WxMpXmlOutMessage handle(WxMpXmlMessage wxMessage, Map<String, Object> context, WxMpService wxMpService, WxSessionManager sessionManager) throws WxErrorException {
TextBuilder out = WxMpXmlOutMessage.TEXT().fromUser(wxMessage.getToUserName()).toUser(wxMessage.getFromUserName());
String fromUser = wxMessage.getFromUserName();
User u = TableUser.getByWechat(fromUser);
String id = WechatSession.genId();
WxSession session = WechatSession.get(id, true);
if (u != null) {
session.setAttribute(Attribute.AUTHORIZED, Command.PROFILE);
session.setAttribute(Attribute.WECHAT, fromUser);
session.setAttribute(Attribute.USER, u);
out.content(format("Event_Subscribe", format("Already_Registered", format("User_Profile_Link", id, u.getName(), u.getIsp().id, u.getNetAccount(), u.getBlock(), u.getRoom(), u.getPhone()))));
} else {
session.setAttribute(Attribute.AUTHORIZED, Command.REGISTER);
session.setAttribute(Attribute.WECHAT, fromUser);
out.content(format("Event_Subscribe", format("User_Register", format("User_Register_Link", id))));
}
return out.build();
}
}

View File

@@ -26,7 +26,6 @@ public class CheckSpamMatcher implements WxMpMessageMatcher {
private LoadingCache<String, Long> cache = CacheBuilder.newBuilder()
.concurrencyLevel(4)
.weakKeys()
.maximumSize(4096)
.expireAfterWrite(Settings.I.Check_Spam_Cache_Expire_Time, TimeUnit.SECONDS)
.build(new ValueLoader());

View File

@@ -11,10 +11,11 @@ REGEX_CANCEL: '^(?i)(Cancel)|(取消)|(撤销)|(qx)|(cx)$'
REGEX_LOGIN: '^(?i)Authme$'
REGEX_PROFILE: '^(?i)(EditProfile)|(修改资料)|(修改信息)|(xgzl)|(xgxx)$'
#Event
Event_Subscribe: "欢迎使用电子科技大学中山学院网络维护科微信自助报修平台。\n\n若您尚未进行过微信绑定请发送'绑定'(bd)进行微信绑定"
#Misc
Invalid_Operation: 'Whoops报修姬找不到你想要的东西啦 (╯‵□′)╯︵┻━┻。'
Message_Spam: '你的打字速度太快了喝一杯82年的Java压压惊吧。'
#Subscribe
Event_Subscribe: "欢迎使用电子科技大学中山学院网络维护科微信自助报修平台。\n\n{0}"
#Register
User_Register: "您尚未进行微信绑定。\n<a href=\"{0}\">>点击这里进行微信绑定操作<</a>"
Already_Registered: '您已进行过微信绑定。若是需要更改个人信息,请<a href="{0}"> >点击此处<</a>。'