// Path: src/main/java/love/sola/netsupport/config/Settings.java
// public class Settings {
// 
//     public static final int MAX_DESC_LENGTH = 255;
// 
//     public static Settings I;
// 
//     static {
//         I = TableConfig.getSettings();
//     }
// 
//     public String Wechat_AppId;
//     public String Wechat_Secret;
//     public String Wechat_Token;
//     public String Wechat_AesKey;
// 
//     public int Check_Spam_Cache_Expire_Time;
//     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;
//     }
// 
//     @Override
//     public String toString() {
//         return "Settings{" +
//                 "Wechat_AppId='" + Wechat_AppId + '\'' +
//                 ", Wechat_Secret='" + Wechat_Secret + '\'' +
//                 ", Wechat_Token='" + Wechat_Token + '\'' +
//                 ", Wechat_AesKey='" + Wechat_AesKey + '\'' +
//                 ", Check_Spam_Cache_Expire_Time=" + Check_Spam_Cache_Expire_Time +
//                 ", Check_Spam_Interval=" + Check_Spam_Interval +
//                 ", User_Session_Max_Inactive=" + User_Session_Max_Inactive +
//                 ", User_Wechat_Cache_Expire_Time=" + User_Wechat_Cache_Expire_Time +
//                 '}';
//     }
// }
// 
// Path: src/main/java/love/sola/netsupport/pojo/User.java
// @Entity
// @Table(name = "users")
// public class User {
// 
//     //System Accounts
//     public static User OFFICIAL_CHINA_UNICOM_XH;
//     public static User OFFICIAL_CHINA_MOBILE_XH;
//     public static User OFFICIAL_CHINA_MOBILE_FX;
// 
//     public static final String PROPERTY_NAME = "name";
//     public static final String PROPERTY_WECHAT = "wechatId";
//     public static final String PROPERTY_BLOCK = "block";
// 
//     @Id
//     @Column(name = "id", updatable = false, nullable = false)
//     private Long id;
//     @Column(name = "name", updatable = false, nullable = false)
//     private String name;
//     @Convert(converter = ISPConverter.class)
//     private ISP isp;
//     @Column(name = "netaccount")
//     private String netAccount;
//     @Expose(serialize = false)
//     @Column(name = "wechat")
//     private String wechatId;
//     private Integer block;
//     private Integer room;
//     private Long phone;
// 
//     public User() {
//     }
// 
//     public User(Long id, String name, ISP isp, String netAccount, String wechatId, Integer block, Integer room, Long phone) {
//         this.id = id;
//         this.name = name;
//         this.isp = isp;
//         this.netAccount = netAccount;
//         this.wechatId = wechatId;
//         this.block = block;
//         this.room = room;
//         this.phone = phone;
//     }
// 
//     public Long getId() {
//         return id;
//     }
// 
//     public void setId(Long id) {
//         this.id = id;
//     }
// 
//     public String getName() {
//         return name;
//     }
// 
//     public void setName(String name) {
//         this.name = name;
//     }
// 
//     public ISP getIsp() {
//         return isp;
//     }
// 
//     public void setIsp(ISP isp) {
//         this.isp = isp;
//     }
// 
//     public String getNetAccount() {
//         return netAccount;
//     }
// 
//     public void setNetAccount(String netAccount) {
//         this.netAccount = netAccount;
//     }
// 
//     public String getWechatId() {
//         return wechatId;
//     }
// 
//     public void setWechatId(String wechatId) {
//         this.wechatId = wechatId;
//     }
// 
//     public Integer getBlock() {
//         return block;
//     }
// 
//     public void setBlock(Integer block) {
//         this.block = block;
//     }
// 
//     public Integer getRoom() {
//         return room;
//     }
// 
//     public void setRoom(Integer room) {
//         this.room = room;
//     }
// 
//     public Long getPhone() {
//         return phone;
//     }
// 
//     public void setPhone(Long phone) {
//         this.phone = phone;
//     }
// 
//     @Override
//     public String toString() {
//         return "User{" +
//                 "id=" + id +
//                 ", name='" + name + '\'' +
//                 ", isp=" + isp +
//                 ", netAccount='" + netAccount + '\'' +
//                 ", wechatId='" + wechatId + '\'' +
//                 ", block=" + block +
//                 ", room=" + room +
//                 ", phone=" + phone +
//                 '}';
//     }
// }


import com.google.common.cache.CacheBuilder;
import com.google.common.cache.CacheLoader;
import com.google.common.cache.LoadingCache;
import org.hibernate.Session;
import org.hibernate.criterion.Restrictions;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.TimeUnit;
import love.sola.netsupport.config.Settings;
import love.sola.netsupport.pojo.User;
        try {
            User u = cache.get(wechat);
            return u == NULL_USER ? null : u;
        } catch (ExecutionException e) {
            e.printStackTrace();
            return null;
        }
    }

    public static int update(User user) {
        try (Session s = sf.openSession()) {
            s.beginTransaction();
            s.update(user);
            s.getTransaction().commit();
            cache.put(user.getWechatId(), user);
            return 1;
        }
    }

    protected static void init() {
        try (Session s = SQLCore.sf.openSession()) {
            User.OFFICIAL_CHINA_UNICOM_XH = s.get(User.class, 100104L);
            User.OFFICIAL_CHINA_MOBILE_XH = s.get(User.class, 100864L);
            User.OFFICIAL_CHINA_MOBILE_FX = s.get(User.class, 100865L);
        }
    }

    private static LoadingCache<String, User> cache = CacheBuilder.newBuilder()
            .concurrencyLevel(4)
            .maximumSize(4096)
// Path: src/main/java/love/sola/netsupport/config/Settings.java
// public class Settings {
// 
//     public static final int MAX_DESC_LENGTH = 255;
// 
//     public static Settings I;
// 
//     static {
//         I = TableConfig.getSettings();
//     }
// 
//     public String Wechat_AppId;
//     public String Wechat_Secret;
//     public String Wechat_Token;
//     public String Wechat_AesKey;
// 
//     public int Check_Spam_Cache_Expire_Time;
//     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;
//     }
// 
//     @Override
//     public String toString() {
//         return "Settings{" +
//                 "Wechat_AppId='" + Wechat_AppId + '\'' +
//                 ", Wechat_Secret='" + Wechat_Secret + '\'' +
//                 ", Wechat_Token='" + Wechat_Token + '\'' +
//                 ", Wechat_AesKey='" + Wechat_AesKey + '\'' +
//                 ", Check_Spam_Cache_Expire_Time=" + Check_Spam_Cache_Expire_Time +
//                 ", Check_Spam_Interval=" + Check_Spam_Interval +
//                 ", User_Session_Max_Inactive=" + User_Session_Max_Inactive +
//                 ", User_Wechat_Cache_Expire_Time=" + User_Wechat_Cache_Expire_Time +
//                 '}';
//     }
// }
// 
// Path: src/main/java/love/sola/netsupport/pojo/User.java
// @Entity
// @Table(name = "users")
// public class User {
// 
//     //System Accounts
//     public static User OFFICIAL_CHINA_UNICOM_XH;
//     public static User OFFICIAL_CHINA_MOBILE_XH;
//     public static User OFFICIAL_CHINA_MOBILE_FX;
// 
//     public static final String PROPERTY_NAME = "name";
//     public static final String PROPERTY_WECHAT = "wechatId";
//     public static final String PROPERTY_BLOCK = "block";
// 
//     @Id
//     @Column(name = "id", updatable = false, nullable = false)
//     private Long id;
//     @Column(name = "name", updatable = false, nullable = false)
//     private String name;
//     @Convert(converter = ISPConverter.class)
//     private ISP isp;
//     @Column(name = "netaccount")
//     private String netAccount;
//     @Expose(serialize = false)
//     @Column(name = "wechat")
//     private String wechatId;
//     private Integer block;
//     private Integer room;
//     private Long phone;
// 
//     public User() {
//     }
// 
//     public User(Long id, String name, ISP isp, String netAccount, String wechatId, Integer block, Integer room, Long phone) {
//         this.id = id;
//         this.name = name;
//         this.isp = isp;
//         this.netAccount = netAccount;
//         this.wechatId = wechatId;
//         this.block = block;
//         this.room = room;
//         this.phone = phone;
//     }
// 
//     public Long getId() {
//         return id;
//     }
// 
//     public void setId(Long id) {
//         this.id = id;
//     }
// 
//     public String getName() {
//         return name;
//     }
// 
//     public void setName(String name) {
//         this.name = name;
//     }
// 
//     public ISP getIsp() {
//         return isp;
//     }
// 
//     public void setIsp(ISP isp) {
//         this.isp = isp;
//     }
// 
//     public String getNetAccount() {
//         return netAccount;
//     }
// 
//     public void setNetAccount(String netAccount) {
//         this.netAccount = netAccount;
//     }
// 
//     public String getWechatId() {
//         return wechatId;
//     }
// 
//     public void setWechatId(String wechatId) {
//         this.wechatId = wechatId;
//     }
// 
//     public Integer getBlock() {
//         return block;
//     }
// 
//     public void setBlock(Integer block) {
//         this.block = block;
//     }
// 
//     public Integer getRoom() {
//         return room;
//     }
// 
//     public void setRoom(Integer room) {
//         this.room = room;
//     }
// 
//     public Long getPhone() {
//         return phone;
//     }
// 
//     public void setPhone(Long phone) {
//         this.phone = phone;
//     }
// 
//     @Override
//     public String toString() {
//         return "User{" +
//                 "id=" + id +
//                 ", name='" + name + '\'' +
//                 ", isp=" + isp +
//                 ", netAccount='" + netAccount + '\'' +
//                 ", wechatId='" + wechatId + '\'' +
//                 ", block=" + block +
//                 ", room=" + room +
//                 ", phone=" + phone +
//                 '}';
//     }
// }


// Path: src/main/java/love/sola/netsupport/sql/TableUser.java
import com.google.common.cache.CacheBuilder;
import com.google.common.cache.CacheLoader;
import com.google.common.cache.LoadingCache;
import org.hibernate.Session;
import org.hibernate.criterion.Restrictions;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.TimeUnit;
import love.sola.netsupport.config.Settings;
import love.sola.netsupport.pojo.User;

        try {
            User u = cache.get(wechat);
            return u == NULL_USER ? null : u;
        } catch (ExecutionException e) {
            e.printStackTrace();
            return null;
        }
    }

    public static int update(User user) {
        try (Session s = sf.openSession()) {
            s.beginTransaction();
            s.update(user);
            s.getTransaction().commit();
            cache.put(user.getWechatId(), user);
            return 1;
        }
    }

    protected static void init() {
        try (Session s = SQLCore.sf.openSession()) {
            User.OFFICIAL_CHINA_UNICOM_XH = s.get(User.class, 100104L);
            User.OFFICIAL_CHINA_MOBILE_XH = s.get(User.class, 100864L);
            User.OFFICIAL_CHINA_MOBILE_FX = s.get(User.class, 100865L);
        }
    }

    private static LoadingCache<String, User> cache = CacheBuilder.newBuilder()
            .concurrencyLevel(4)
            .maximumSize(4096)
            .expireAfterAccess(Settings.I.User_Wechat_Cache_Expire_Time, TimeUnit.SECONDS)