Skip to content

Commit

Permalink
Added support for multiple app tokens
Browse files Browse the repository at this point in the history
GitHub issue #29
  • Loading branch information
FlyingDiver committed Feb 12, 2021
1 parent 10de64d commit 8c2ff1d
Show file tree
Hide file tree
Showing 6 changed files with 176 additions and 20 deletions.
7 changes: 6 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -96,4 +96,9 @@ ENV/
.ropeproject

# PyCharm project data
.idea
.idea
.DS_Store

Pushover.indigoPlugin.zip

Multiple_API_Tokens.py
2 changes: 1 addition & 1 deletion Pushover.indigoPlugin/Contents/Info.plist
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
<plist version="1.0">
<dict>
<key>PluginVersion</key>
<string>1.5.4</string>
<string>1.6.0</string>
<key>ServerApiVersion</key>
<string>2.0</string>
<key>IwsApiVersion</key>
Expand Down
20 changes: 20 additions & 0 deletions Pushover.indigoPlugin/Contents/Server Plugin/Actions.xml
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,11 @@
<Name>Send Pushover Notification</Name>
<CallbackMethod>send</CallbackMethod>
<ConfigUI>
<Field id="appToken" type="menu">
<Label>App Token:</Label>
<List method="get_app_tokens" dynamicReload="true" class="self" filter=""/>
<CallbackMethod>menuChanged</CallbackMethod>
</Field>
<Field id="msgTitle" type="textfield" default="">
<Label>Title:</Label>
</Field>
Expand All @@ -12,6 +17,21 @@
</Field>
<Field id="msgBody" type="textfield" default="">
<Label>Message:</Label>















</Field>
<Field id="hlpMsgBody" type="label" fontSize="mini" alignWithControl="true">
<Label>Required, can also contain variable and device state substitutions</Label>
Expand Down
35 changes: 35 additions & 0 deletions Pushover.indigoPlugin/Contents/Server Plugin/MenuItems.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
<MenuItems>
<MenuItem id="manageTokens">
<Name>Manage App Tokens...</Name>
<ConfigUI>
<Field id="appName" type="textfield">
<Label>App Name:</Label>
</Field>
<Field id="appToken" type="textfield">
<Label>App Token:</Label>
</Field>
<Field id="hlpApiToken" type="label" fontSize="mini" alignWithControl="true">
<Label>Created at https://pushover.net/apps/clone/indigo_domotics</Label>
</Field>
<Field id="addToken" type="button">
<Label/>
<Title>Add/Update Token</Title>
<CallbackMethod>addToken</CallbackMethod>
</Field>
<Field id="appTokenList" type="list" rows="15">
<Label>Available App Tokens:</Label>
<List class="self" method="get_app_tokens" dynamicReload="true"/>
</Field>
<Field id="deleteTokens" type="button">
<Label/>
<Title>Delete Tokens</Title>
<CallbackMethod>deleteTokens</CallbackMethod>
</Field>
</ConfigUI>
</MenuItem>
<MenuItem id="listTokens">
<CallbackMethod>listTokens</CallbackMethod>
<Name>Print App Token List to Log</Name>
</MenuItem>

</MenuItems>
16 changes: 13 additions & 3 deletions Pushover.indigoPlugin/Contents/Server Plugin/PluginConfig.xml
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
<?xml version="1.0"?>
<PluginConfig>
<Field id="apiToken" type="textfield" default="">
<Field id="apiToken" type="textfield" default="" hidden="true">
<Label>API Token:</Label>
</Field>
<Field id="hlpApiToken" type="label" fontSize="mini" alignWithControl="true">
<Field id="hlpApiToken" type="label" fontSize="mini" alignWithControl="true" hidden="true">
<Label>Required, can be created at https://pushover.net/apps/clone/indigo_domotics</Label>
</Field>
<Field id="userKey" type="textfield" default="">
Expand All @@ -12,7 +12,17 @@
<Field id="hlpUserKey" type="label" fontSize="mini" alignWithControl="true">
<Label>Required, can be found at https://pushover.net/dashboard</Label>
</Field>
<Field hidden="false" type="checkbox" id="debug"><Label>Debug</Label><Description></Description></Field>
<Field id="logLevel" type="menu" defaultValue="20">
<Label>Event Logging Level:</Label>
<List>
<Option value="5" >Detailed Debugging Messages</Option>
<Option value="10">Debugging Messages</Option>
<Option value="20">Informational Messages</Option>
<Option value="30">Warning Messages</Option>
<Option value="40">Error Messages</Option>
<Option value="50">Critical Errors Only</Option>
</List>
</Field>

<SupportURL>https://github.com/IndigoDomotics/indigo-pushover/issues</SupportURL>
</PluginConfig>
116 changes: 101 additions & 15 deletions Pushover.indigoPlugin/Contents/Server Plugin/plugin.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,21 +3,36 @@

import os
import requests
import logging
import json

class Plugin(indigo.PluginBase):

def __init__(self, pluginId, pluginDisplayName, pluginVersion, pluginPrefs):
indigo.PluginBase.__init__(self, pluginId, pluginDisplayName, pluginVersion, pluginPrefs)
self.debug = pluginPrefs.get("debug", False)
try:
self.logLevel = int(self.pluginPrefs[u"logLevel"])
except:
self.logLevel = logging.INFO
self.indigo_log_handler.setLevel(self.logLevel)
self.logger.debug(u"logLevel = {}".format(self.logLevel))


def __del__(self):
indigo.PluginBase.__del__(self)

def startup(self):
self.debugLog(u"startup called")
self.logger.debug(u"startup called")

savedList = self.pluginPrefs.get(u"appTokens", None)
if savedList:
self.appTokenList = json.loads(savedList)
else:
self.appTokenList = {}


def shutdown(self):
self.debugLog(u"shutdown called")
self.logger.debug(u"shutdown called")

def validateActionConfigUi(self, valuesDict, typeId, deviceId):
errorDict = indigo.Dict()
Expand All @@ -39,25 +54,25 @@ def present(self, prop):
# helper functions
def prepareTextValue(self, strInput):

if strInput is None:
return strInput
else:
strInput = strInput.strip()

strInput = self.substitute(strInput)
if not strInput:
return strInput
return self.substitute(strInput.strip())

self.debugLog(strInput)

return strInput

# actions go here
def send(self, pluginAction):
self.logger.debug(u"send pluginAction.props = {}".format(pluginAction.props))

appToken = pluginAction.props.get('appToken', None)
if not appToken:
appToken = self.pluginPrefs['apiToken']
self.logger.debug(u"appToken = {}".format(appToken))

msgBody = self.prepareTextValue(pluginAction.props['msgBody'])

#fill params dictionary with required values
params = {
'token': self.pluginPrefs['apiToken'].strip(),
'token': appToken.strip(),
'user': self.pluginPrefs['userKey'].strip(),
'message': msgBody
}
Expand Down Expand Up @@ -114,15 +129,86 @@ def send(self, pluginAction):
r = requests.post("https://api.pushover.net/1/messages.json", data = params, files = attachment)

if r.status_code == 200:
self.debugLog(u"Result: {}".format(r.text))
self.logger.debug(u"Result: {}".format(r.text))
self.logger.info(u"Pushover notification was sent sucessfully, title: {}, body: {}".format(msgTitle, msgBody))
else:
self.logger.error(u"Post Error - Result: {}".format(r.text))


def cancel(self, pluginAction):

params = {'token': self.pluginPrefs['apiToken'].strip() }
URL = "https://api.pushover.net/1/receipts/cancel_by_tag/" + pluginAction.props['cancelTag'] + ".json"
r = requests.post(URL, data = params)
self.debugLog(u"Result: %s" % r.text)
self.logger.debug(u"Result: %s" % r.text)

########################################
# This is the method that's called by the Add Token button in the menu dialog.
########################################

def addToken(self, valuesDict, typeId=None, devId=None):

appName = valuesDict["appName"]
appToken = valuesDict["appToken"]

tokenItem = {"name" : appName, "token" : appToken}
self.logger.debug(u"Adding Token {}: {}".format(appName, appToken))
self.appTokenList[appName] = appToken
self.listTokens()

indigo.activePlugin.pluginPrefs[u"appTokens"] = json.dumps(self.appTokenList)

return valuesDict

########################################
# This is the method that's called by the Delete Token button
########################################
def deleteTokens(self, valuesDict, typeId=None, devId=None):

for item in valuesDict["appTokenList"]:
self.logger.info(u"Deleting Token {}".format(item))
del self.appTokenList[item]

self.listTokens()
indigo.activePlugin.pluginPrefs[u"appTokens"] = json.dumps(self.appTokenList)


def get_app_tokens(self, filter="", valuesDict=None, typeId="", targetId=0):
returnList = list()
for name in self.appTokenList:
returnList.append((self.appTokenList[name], name))
self.logger.debug(u"get_app_tokens = {}".format(returnList))
return sorted(returnList, key= lambda item: item[1])


########################################

def listTokens(self):
if len(self.appTokenList) == 0:
self.logger.info(u"No App Tokens Devices")
return

fstring = u"{:20} {:^50}"
self.logger.info(fstring.format("App Name", "App Token"))
for name, token in self.appTokenList.iteritems():
self.logger.info(fstring.format(name, token))

########################################
# ConfigUI methods
########################################

def closedPrefsConfigUi(self, valuesDict, userCancelled):
if not userCancelled:
try:
self.logLevel = int(valuesDict[u"logLevel"])
except:
self.logLevel = logging.INFO
self.indigo_log_handler.setLevel(self.logLevel)
self.logger.debug(u"logLevel = {}".format(self.logLevel))

# doesn't do anything, just needed to force other menus to dynamically refresh

def menuChanged(self, valuesDict, typeId, devId):
return valuesDict


0 comments on commit 8c2ff1d

Please sign in to comment.