VipService.js 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
  1. const db = require('../plugin/DataBase/db')
  2. function nowMs() {
  3. return Date.now()
  4. }
  5. function isVipByUser(user) {
  6. const expire = Number(user?.vip_expire_time || 0)
  7. if (expire > nowMs()) return true
  8. return Number(user?.vip || 0) === 1 && expire === 0
  9. }
  10. async function getUserVipInfo(uuid, executor = db) {
  11. const rows = await executor.query(
  12. 'SELECT vip, vip_expire_time FROM users WHERE uuid = ? LIMIT 1',
  13. [uuid]
  14. )
  15. const user = rows?.[0] || {}
  16. const vipExpireTime = Number(user.vip_expire_time || 0)
  17. return {
  18. vip: isVipByUser(user),
  19. vip_expire_time: vipExpireTime,
  20. legacy_vip: Number(user.vip || 0)
  21. }
  22. }
  23. function calculateNextVipExpire({ currentExpireTime = 0, payTime = nowMs(), validityType, validDays = 0, fixedExpireTime = 0 }) {
  24. const current = Number(currentExpireTime || 0)
  25. const paidAt = Number(payTime || nowMs())
  26. const type = String(validityType || 'none')
  27. if (type === 'days') {
  28. const days = Math.max(0, Number(validDays || 0))
  29. if (days <= 0) return current
  30. const base = current > paidAt ? current : paidAt
  31. return base + days * 24 * 60 * 60 * 1000
  32. }
  33. if (type === 'fixed') {
  34. return Math.max(current, Number(fixedExpireTime || 0))
  35. }
  36. return current
  37. }
  38. module.exports = {
  39. isVipByUser,
  40. getUserVipInfo,
  41. calculateNextVipExpire
  42. }