aboutsummaryrefslogtreecommitdiffstats
path: root/app/scripts/notice-controller.js
blob: 14a63eae7e757cbbf3f7eaf8ba84a9d300492a0c (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
const EventEmitter = require('events').EventEmitter
const semver = require('semver')
const extend = require('xtend')
const ObservableStore = require('obs-store')
const hardCodedNotices = require('../../notices/notices.json')
const uniqBy = require('lodash.uniqby')

module.exports = class NoticeController extends EventEmitter {

  constructor (opts) {
    super()
    this.noticePoller = null
    this.firstVersion = opts.firstVersion
    this.version = opts.version
    const initState = extend({
      noticesList: [],
    }, opts.initState)
    this.store = new ObservableStore(initState)
    this.memStore = new ObservableStore({})
    this.store.subscribe(() => this._updateMemstore())
  }

  getNoticesList () {
    return this.store.getState().noticesList
  }

  getUnreadNotices () {
    const notices = this.getNoticesList()
    return notices.filter((notice) => notice.read === false)
  }

  getLatestUnreadNotice () {
    const unreadNotices = this.getUnreadNotices()
    return unreadNotices[unreadNotices.length - 1]
  }

  async setNoticesList (noticesList) {
    this.store.updateState({ noticesList })
    return true
  }

  markNoticeRead (noticeToMark, cb) {
    cb = cb || function (err) { if (err) throw err }
    try {
      var notices = this.getNoticesList()
      var index = notices.findIndex((currentNotice) => currentNotice.id === noticeToMark.id)
      notices[index].read = true
      notices[index].body = ''
      this.setNoticesList(notices)
      const latestNotice = this.getLatestUnreadNotice()
      cb(null, latestNotice)
    } catch (err) {
      cb(err)
    }
  }

  async updateNoticesList () {
    const newNotices = await this._retrieveNoticeData()
    const oldNotices = this.getNoticesList()
    const combinedNotices = this._mergeNotices(oldNotices, newNotices)
    const filteredNotices = this._filterNotices(combinedNotices)
    const result = this.setNoticesList(filteredNotices)
    this._updateMemstore()
    return result
  }

  startPolling () {
    if (this.noticePoller) {
      clearInterval(this.noticePoller)
    }
    this.noticePoller = setInterval(() => {
      this.noticeController.updateNoticesList()
    }, 300000)
  }

  _mergeNotices (oldNotices, newNotices) {
    return uniqBy(oldNotices.concat(newNotices), 'id')
  }

  _filterNotices (notices) {
    return notices.filter((newNotice) => {
      if ('version' in newNotice) {
        const satisfied = semver.satisfies(this.version, newNotice.version)
        return satisfied
      }
      if ('firstVersion' in newNotice) {
        const satisfied = semver.satisfies(this.firstVersion, newNotice.firstVersion)
        return satisfied
      }
      return true
    })
  }

  _mapNoticeIds (notices) {
    return notices.map((notice) => notice.id)
  }

  async _retrieveNoticeData () {
    // Placeholder for the API.
    return hardCodedNotices
  }

  _updateMemstore () {
    const lastUnreadNotice = this.getLatestUnreadNotice()
    const noActiveNotices = !lastUnreadNotice
    this.memStore.updateState({ lastUnreadNotice, noActiveNotices })
  }

}
d---------garnaxfs141logstatsplain d---------gdesklets-irc185logstatsplain d---------gruftistats178logstatsplain d---------gseen.mod146logstatsplain d---------hybserv217logstatsplain d---------icbirc141logstatsplain d---------ii141logstatsplain d---------infobot178logstatsplain d---------inspircd178logstatsplain d---------insub146logstatsplain d---------irc178logstatsplain d---------irc2dc141logstatsplain d---------ircII178logstatsplain d---------ircd-hybrid-ru297logstatsplain d---------ircd-hybrid217logstatsplain d---------ircd-ratbox-devel178logstatsplain d---------ircd-ratbox178logstatsplain d---------ircd-ru217logstatsplain d---------ircd-rusnet297logstatsplain d---------irchat-jp109logstatsplain d---------irchat-pj-emacs21146logstatsplain d---------irchat-pj-xemacs21-mule36logstatsplain d---------ircproxy226logstatsplain d---------ircservices178logstatsplain d---------iroffer-dinoex185logstatsplain d---------iroffer-lamm185logstatsplain d---------iroffer185logstatsplain d---------irssi-dcc_send_limiter109logstatsplain d---------irssi-devel178logstatsplain d---------irssi-fish141logstatsplain d---------irssi-otr141logstatsplain d---------irssi-scripts146logstatsplain d---------irssi-xmpp-devel109logstatsplain d---------irssi-xmpp109logstatsplain d---------irssi178logstatsplain d---------irssistats178logstatsplain d---------keitairc109logstatsplain d---------keitairc2146logstatsplain d---------kmyirc178logstatsplain d---------konversation-kde4146logstatsplain d---------konversation178logstatsplain d---------kvirc-devel178logstatsplain d---------kvirc178logstatsplain d---------kwirc146logstatsplain d---------libircclient146logstatsplain d---------lostirc178logstatsplain d---------miau146logstatsplain d---------muh146logstatsplain d---------nefarious178logstatsplain d---------nethirc146logstatsplain d---------netwalker-ircc178logstatsplain d---------ngircd178logstatsplain d---------ninja178logstatsplain d---------onis146logstatsplain d---------p5-AnyEvent-IRC146logstatsplain d---------p5-Bot-BasicBot146logstatsplain d---------p5-IRC-Bot-Hangman146logstatsplain d---------p5-IRC146logstatsplain d---------p5-POE-Component-IRC-Object146logstatsplain d---------p5-POE-Component-IRC-Plugin-Bollocks146logstatsplain d---------p5-POE-Component-IRC-Plugin-CoreList146logstatsplain d---------p5-POE-Component-IRC-Plugin-POE-Knee146logstatsplain d---------p5-POE-Component-IRC-Plugin-QueryDNS146logstatsplain d---------p5-POE-Component-IRC-Plugin-QueryDNSBL146logstatsplain d---------p5-POE-Component-IRC-Plugin-RSS-Headlines146logstatsplain d---------p5-POE-Component-IRC146logstatsplain d---------p5-POE-Component-Server-IRC146logstatsplain d---------p5-POE-Filter-IRCD146logstatsplain d---------p5-Parse-IRC146logstatsplain d---------party178logstatsplain d---------pear-Net_SmartIRC109logstatsplain d---------pircbot146logstatsplain d---------pisg146logstatsplain d---------psybnc178logstatsplain d---------ptlink-ircd217logstatsplain d---------ptlink-services217logstatsplain d---------pure-emacs21146logstatsplain d---------pure-xemacs21-mule36logstatsplain d---------py-gozerbot178logstatsplain d---------py-irclib146logstatsplain d---------py-supybot-plugins146logstatsplain d---------py-supybot185logstatsplain d---------quassel146logstatsplain d---------quirc178logstatsplain d---------ratbox-respond178logstatsplain d---------ratbox-services178logstatsplain d---------rbot178logstatsplain d---------riece-emacs2136logstatsplain d---------riece185logstatsplain d---------roxirc146logstatsplain d---------ruby-irc146logstatsplain d---------ruby-rica146logstatsplain d---------ruby-rice146logstatsplain d---------scrollz146logstatsplain d---------sic178logstatsplain d---------simpleirc141logstatsplain d---------sirc178logstatsplain d---------slirc178logstatsplain d---------solid-ircd178logstatsplain d---------srvx141logstatsplain d---------talksoup146logstatsplain d---------thales178logstatsplain