Skip to content

Commit

Permalink
Merge pull request #3 from ymrl/feature/kancolleWidghet
Browse files Browse the repository at this point in the history
艦これウィジェットへの対応
  • Loading branch information
ymrl committed Sep 27, 2013
2 parents 99ddd14 + efd7f56 commit e2c2f14
Show file tree
Hide file tree
Showing 12 changed files with 242 additions and 97 deletions.
16 changes: 16 additions & 0 deletions assets/iframe-replace.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
<html>
<head>
<meta charset="UTF-8" />
<script src="./jquery-2.0.3.min.js"></script>
<script src="./content-views.js"></script>
<script src="./content-messaging.js"></script>
<script src="./iframe-replace.js"></script>
<style>
body{margin:0;padding:0;}
</style>
<title>禁これ</title>
</head>
<body>
<div id="area-game"></div>
</body>
</html>
9 changes: 7 additions & 2 deletions assets/manifest.json
Original file line number Diff line number Diff line change
Expand Up @@ -5,13 +5,18 @@
"description": "艦これのプレイ可能時間を制限します",
"icons": {"128":"icon_128.png"},
"background": {
"scripts": ["background.js"],
"scripts": ["consts.js","lib.js","background.js"],
"persistent": false
},
"content_scripts": [
{
"matches":["http://www.dmm.com/netgame/social/-/gadgets/=/app_id=854854/"],
"js":["content.js"]
"js":["content-messaging.js","content-views.js","content.js"]
},
{
"matches":["http://osapi.dmm.com/gadgets/*"],
"js":["content-messaging.js","iframe-content.js"],
"run_at":"document_start"
}
],
"options_page":"options.html"
Expand Down
2 changes: 2 additions & 0 deletions assets/options.html
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,8 @@
<title>禁これ オプション</title>
<link rel="stylesheet" type="text/css" href="./options.css" />
<script type="text/javascript" src="./jquery-2.0.3.min.js"></script>
<script type="text/javascript" src="./consts.js" /></script>
<script type="text/javascript" src="./lib.js" /></script>
<script type="text/javascript" src="./options.js" /></script>
</head>
<body>
Expand Down
48 changes: 22 additions & 26 deletions src/background.coffee
Original file line number Diff line number Diff line change
@@ -1,39 +1,35 @@
DAYS = ["mo", "tu", "we", "th", "fr", "sa", "su"]

loadSchedule = ()->
if localStorage.schedule
return JSON.parse(localStorage.schedule)
else
return null
loadConfig = ()->
if localStorage.config
return JSON.parse(localStorage.config)
else
return null
checkTimeForResponse = (req,sender,sendResponse,option)->
playable = Kincolle.Schedule.isDatePlayable(new Date())
if option && option.from is "iframe"
Kincolle.Temp.set("iframe-url",option.url)
if Kincolle.Temp.get("playableOnce")
playable = true
sendResponse
type: "checkTime"
playable: playable
config: Kincolle.Config.load()

checkTime = ()->
schedule = loadSchedule()
if !schedule
return true
else
now = new Date()
day = DAYS[now.getDay() - 1]
hour = now.getHours()
return schedule["#{day}#{hour}"]
playableOnceForResponse = (req,sender,sendResponse,option)->
Kincolle.Temp.set('playableOnce',true)
sendResponse
type: "playableOnce"

checkTimeForResponse = (req,sender,sendResponse)->
getIframeURLForResponse = (req,sender,sendResponse,option)->
sendResponse
type: "checkTime"
playable: checkTime()
config: loadConfig()
type: "getIFrameURL"
url: Kincolle.Temp.get("iframe-url")

chrome.runtime.onInstalled.addListener ()->
if !localStorage.schedule
chrome.tabs.create({url:chrome.runtime.getURL("options.html")})

chrome.runtime.onMessage.addListener (req,sender,sendResponse)->
if req.type is "checkTime"
return checkTimeForResponse(req,sender,sendResponse)
return checkTimeForResponse(req,sender,sendResponse,req.option)
else if req.type is "playableOnce"
return playableOnceForResponse(req,sender,sendResponse,req.option)
else if req.type is "getIframeURL"
return getIframeURLForResponse(req,sender,sendResponse,req.option)
else
sendResponse
type: "error"
Expand Down
2 changes: 2 additions & 0 deletions src/consts.coffee
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
window.Kincolle ||= {}
Kincolle.DAY_KEYS = ["mo", "tu", "we", "th", "fr", "sa", "su"]
23 changes: 23 additions & 0 deletions src/content-messaging.coffee
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
window.Kincolle ||={}

Kincolle.ContentMessaging ||={}
Kincolle.ContentMessaging.isPlayable = (playable,unplayable,option)->
chrome.runtime.sendMessage {type:"checkTime",option:option},(res)->
if res.playable
playable(res.config)
else
unplayable(res.config)

Kincolle.ContentMessaging.getNextPeriod = (now)->
next = new Date(now.getTime() + 60*60*1000)
next.setMilliseconds(0)
next.setSeconds(0)
next.setMinutes(0)
return next
Kincolle.ContentMessaging.playableOnce = (callback,option)->
chrome.runtime.sendMessage {type:"playableOnce",option:option},(res)->
callback(res.config)

Kincolle.ContentMessaging.getIframeURL = (callback,option)->
chrome.runtime.sendMessage {type:"getIframeURL",option:option},(res)->
callback(res.url)
40 changes: 40 additions & 0 deletions src/content-views.coffee
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
window.Kincolle ||= {}
Kincolle.Views ||= {}

Kincolle.Views.generatePlaceHolder =(w,h,config)->
p = document.createElement('div')
s = p.style
s.width = "#{w}px"
s.height = "#{h}px"
s.background = "#000"
s.color = "#fff"
p.appendChild Kincolle.Views.generateMessage()
if(config && config.useGGKSMKK)
p.appendChild Kincolle.Views.generateIgnoreButton(config.click)
return p

Kincolle.Views.generateMessage = ->
m = document.createElement('div')
m.textContent = "提督、今日はお休みではなかったのですか?"
s = m.style
s.font = "28px sans-serif"
s.textAlign = "center"
s.padding = "15px 0 10px"
return m

Kincolle.Views.generateIgnoreButton = (click)->
w = document.createElement('div')
w.style.textAlign = "center"
b = document.createElement('button')
w.appendChild(b)
b.innerText = "月月火水木金金"
if click
b.addEventListener 'click',click
s = b.style
s.padding = "8px"
s.background = "#000"
s.color = "#fff"
s.border = "1px solid #fff"
s.font = "16px sans-serif"
return w

75 changes: 18 additions & 57 deletions src/content.coffee
Original file line number Diff line number Diff line change
Expand Up @@ -12,9 +12,9 @@ removeChildrenOfTree = (tree)->
hideGame = (config)->
visible = false
tree = document.querySelector('#area-game')
width = tree.clientWidth
height = tree.clientHeight
placeHolder = generatePlaceHolder(width,height,config)
width = 916
height = 610
placeHolder = Kincolle.Views.generatePlaceHolder(width,height,config)
treeContent = removeChildrenOfTree(tree)
tree.appendChild(placeHolder)

Expand All @@ -25,60 +25,21 @@ showGame = ->
for c in treeContent
tree.appendChild(c)

generatePlaceHolder = (w,h,config)->
p = document.createElement('div')
s = p.style
s.width = "#{w}px"
#s.height = "#{h}px"
s.height = "610px"
s.background = "#000"
s.color = "#fff"
p.appendChild generateMessage()
if(config && config.useGGKSMKK)
p.appendChild generateIgnoreButton()
return p

generateMessage = ->
m = document.createElement('div')
m.textContent = "提督、今日はお休みではなかったのですか?"
s = m.style
s.font = "28px sans-serif"
s.textAlign = "center"
s.padding = "15px 0 10px"
return m

generateIgnoreButton = ->
w = document.createElement('div')
b = document.createElement('button')
w.appendChild(b)
b.innerText = "月月火水木金金"
b.addEventListener 'click',(e)->
ggksmkk = true
showGame()
e.preventDefault()
return false
s = b.style
s.padding = "8px"
s.background = "#000"
s.color = "#fff"
s.border = "1px solid #fff"
s.font = "16px sans-serif"
return w


###############
playable = (config)->
if(!visible)
showGame(config)
unplayable = (config)->
if(visible && !ggksmkk)
config.click = (e)->
ggksmkk = true
showGame()
e.preventDefault()
return false
hideGame(config)
requestPlayable = ()->
chrome.runtime.sendMessage {type:"checkTime"},(res)->
if(visible && !res.playable && !ggksmkk)
hideGame(res.config)
else if(!visible && res.playable)
showGame(res.config)
now = new Date()
next = new Date(now.getTime() + 60*60*1000)
next.setMilliseconds(0)
next.setSeconds(0)
next.setMinutes(0)
setTimeout(requestPlayable,next-now)
#setTimeout(requestPlayable,60000)

Kincolle.ContentMessaging.isPlayable playable,unplayable
now = new Date()
next = Kincolle.ContentMessaging.getNextPeriod(now)
setTimeout(requestPlayable,next-now)
requestPlayable()
6 changes: 6 additions & 0 deletions src/iframe-content.coffee
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
unplayable = ()->
window.location.href = chrome.runtime.getURL("iframe-replace.html")
playable = (()->)
Kincolle.ContentMessaging.isPlayable playable,unplayable,
from: "iframe"
url: location.href
33 changes: 33 additions & 0 deletions src/iframe-replace.coffee
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
ggksmkk = false

reload = ()->
Kincolle.ContentMessaging.getIframeURL (url)->
location.href = url

playable = (config)->
reload()

unplayable = (config)->
config.click = (e)->
Kincolle.ContentMessaging.playableOnce (config)->
reload()
e.preventDefault()
return false
width = $(window).innerWidth()
height = $(window).innerHeight()
placeHolder = Kincolle.Views.generatePlaceHolder(width,height,config)
$('#area-game').append(placeHolder)
$(window).on 'resize',(e)->
$(placeHolder).css
width : $(@).width()
height : $(@).height()

requestPlayable = ()->
Kincolle.ContentMessaging.isPlayable playable,unplayable
now = new Date()
next = Kincolle.ContentMessaging.getNextPeriod(now)
setTimeout(requestPlayable,next-now)

$ ->
requestPlayable()

62 changes: 62 additions & 0 deletions src/lib.coffee
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
window.Kincolle ||= {}

Function::property = (prop, desc) ->
Object.defineProperty @prototype, prop, desc

Kincolle.Schedule ||= {}
Kincolle.Schedule.load = ()->
if localStorage.schedule
return JSON.parse(localStorage.schedule)
else
return null

Kincolle.Schedule.save = (data)->
localStorage.schedule = JSON.stringify(data)

Kincolle.Schedule.isDatePlayable =(date)->
schedule = Kincolle.Schedule.load()
if schedule
day = Kincolle.DAY_KEYS[date.getDay() - 1]
hour = date.getHours()
return schedule["#{day}#{hour}"]
else
return true

Kincolle.Config ||= {}
Kincolle.Config.load = ()->
if localStorage.config
return JSON.parse(localStorage.config)
else
return null
Kincolle.Config.save = (config)->
current = Kincolle.Config.load()
if current
for key of config
current[key] = config[key]
config = current
localStorage.config = JSON.stringify(config)

Kincolle.Temp ||= {}
loadTemp = ()->
if localStorage.temp
return JSON.parse(localStorage.temp)
else
return null

Kincolle.Temp.get = (key)->
c = loadTemp()
v = null
if c
v = c[key]
delete(c[key])
localStorage.temp = JSON.stringify(c)
return v

Kincolle.Temp.set = (key,value)->
c = loadTemp()
if !c
c = {}
c[key] = value
localStorage.temp = JSON.stringify(c)


Loading

0 comments on commit e2c2f14

Please sign in to comment.