Last active
April 15, 2016 11:35
-
-
Save UdjinM6/1c20957179ffb1f71485 to your computer and use it in GitHub Desktop.
Fixed: dashninja.pl API usage; Changed: switched to explorer.dash.org to fetch balances
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
from Tkinter import * | |
import urllib2 | |
from datetime import datetime | |
import smtplib | |
import time | |
import os | |
import ConfigParser as con | |
from appdirs import AppDirs | |
import json | |
# $MN$v3 | |
def main(): | |
root = Tk() | |
root.title("$MN$") | |
root.resizable(0,0) | |
def rtnsettingsshow(): | |
btnsettingsshow32.grid_forget() | |
btnsettingshide32.grid(row=3, column=5) | |
lblsettingsMNlist.grid(row=4, column=1, columnspan =2) | |
lstMNlist.grid(row=5, column=1, columnspan =2) | |
btnMNlistremove.grid(row=5, column=5, sticky = S, columnspan =2) | |
entryMNadd.grid(row=6, column=1, columnspan =2) | |
btnMNlistadd.grid(row=6, column=5, columnspan =2) | |
lblnotifyaddress.grid(row=7, column=1) | |
entrynotifyaddress.grid(row=7, column=2, sticky = E) | |
btnnotifyaddresshelp.grid(row=7, column=5, columnspan =2) | |
lblmnbotaddress.grid(row=8, column=1) | |
entrymnbotaddress.grid(row=8, column=2, sticky = E) | |
btnmnbotaddresshelp.grid(row=8, column=5, columnspan =2) | |
lblmnbotpw.grid(row=9, column=1) | |
entrymnbotpw.grid(row=9, column=2, sticky = E) | |
lblIPSetting.grid(row=10,column=1) | |
rdIPON.grid(row=10,column=2, sticky = W) | |
rdIPOFF.grid(row=10,column=2) | |
lblActiveSetting.grid(row=11, column=1) | |
rdActiveON.grid(row=11,column=2, sticky =W) | |
rdActiveOFF.grid(row=11, column=2) | |
lblNotifyActivty.grid(row=12,column=1) | |
rdActivityON.grid(row=12,column=2, sticky =W) | |
rdActivityOFF.grid(row=12,column=2) | |
lblSumSetting.grid(row=13, column=1) | |
rdSumON.grid(row=13,column=2, sticky =W) | |
rdSumOFF.grid(row=13, column=2) | |
btnupdatesettings.grid(row=14, column=5, columnspan =2) | |
def rtnsettingshide(): | |
btnsettingshide32.grid_forget() | |
btnsettingsshow32.grid(row=3, column=5) | |
lblsettingsMNlist.grid_forget() | |
lstMNlist.grid_forget() | |
btnMNlistremove.grid_forget() | |
entryMNadd.grid_forget() | |
btnMNlistadd.grid_forget() | |
lblnotifyaddress.grid_forget() | |
entrynotifyaddress.grid_forget() | |
btnnotifyaddresshelp.grid_forget() | |
lblmnbotaddress.grid_forget() | |
entrymnbotaddress.grid_forget() | |
btnmnbotaddresshelp.grid_forget() | |
lblmnbotpw.grid_forget() | |
entrymnbotpw.grid_forget() | |
lblIPSetting.grid_forget() | |
rdIPON.grid_forget() | |
rdIPOFF.grid_forget() | |
lblActiveSetting.grid_forget() | |
rdActiveON.grid_forget() | |
rdActiveOFF.grid_forget() | |
lblSumSetting.grid_forget() | |
rdSumON.grid_forget() | |
rdSumOFF.grid_forget() | |
lblNotifyActivty.grid_forget() | |
rdActivityON.grid_forget() | |
rdActivityOFF.grid_forget() | |
btnupdatesettings.grid_forget() | |
def rtnabout(): | |
AboutWin = Tk() | |
AboutWin.title('About $MN$') | |
AboutWin.resizable(0,0) | |
lblAbout1 = Label (AboutWin, text="I hope this program is useful to you!") | |
lblAbout1.grid(row=0, column=0) | |
lblAbout2 = Label (AboutWin, text="Instructions on how to begin can be found at:") | |
lblAbout2.grid(row=1, column=0) | |
entryAbout1 = Entry(AboutWin, width=18) | |
entryAbout1.insert(0,"http://goo.gl/kB2HJd") | |
entryAbout1.grid(row=3, column=0) | |
lblAbout3 = Label(AboutWin, text=" ") | |
lblAbout3.grid(row=4, column=0) | |
lblAbout4 = Label(AboutWin, text="Donations are welcome!") | |
lblAbout4.grid(row=5, column=0) | |
entryAbout2 = Entry(AboutWin, width=35) | |
entryAbout2.insert(0,"Xwkrxyd1qkBktWUG8HQxqViPwwoAnGpimd") | |
entryAbout2.grid(row=6, column=0) | |
def rtnMNlistremove(): | |
mnaddremove=lstMNlist.curselection() | |
lstMNlist.delete(mnaddremove, mnaddremove) | |
lstBalanceShow.delete(mnaddremove, mnaddremove) | |
lstMNshow.delete(mnaddremove, mnaddremove) | |
lstTimeShow.delete(mnaddremove, mnaddremove) | |
lstIPshow.delete(mnaddremove, mnaddremove) | |
lstActiveShow.delete(mnaddremove, mnaddremove) | |
MNlistsize=lstMNlist.size() | |
lstMNshow.configure(height=MNlistsize) | |
lstBalanceShow.configure(height=MNlistsize) | |
lstTimeShow.configure(height=MNlistsize) | |
lstActiveShow.configure(height=MNlistsize) | |
lstIPshow.configure(height=MNlistsize) | |
def rtnMNlistadd(): | |
mnaddaddress=entryMNadd.get() | |
lstMNlist.insert(END, mnaddaddress) | |
entryMNadd.delete(0, END) | |
lstMNshow.insert(END, mnaddaddress) | |
lstBalanceShow.insert(END, "-") | |
lstTimeShow.insert(END, "-") | |
lstIPshow.insert(END, "-") | |
lstActiveShow.insert(END, "-") | |
MNlistsize=lstMNlist.size() | |
lstMNshow.configure(height=MNlistsize) | |
lstBalanceShow.configure(height=MNlistsize) | |
lstTimeShow.configure(height=MNlistsize) | |
lstActiveShow.configure(height=MNlistsize) | |
lstIPshow.configure(height=MNlistsize) | |
def rtnnotifyaddresshelp(): | |
NotifyWin = Tk() | |
NotifyWin.title('Notify Help') | |
NotifyWin.resizable(0,0) | |
lblNotify1 = Label (NotifyWin, text="To receive text message notifcations, use this format:") | |
lblNotify1.grid(row=0, column=0) | |
entryNotify1 = Entry(NotifyWin, width=16) | |
entryNotify1.insert(0,"http://goo.gl/ouiYn") | |
entryNotify1.grid(row=3, column=0) | |
def rtnmnbotaddresshelp(): | |
AddressWin = Tk() | |
AddressWin.title('MN BOT Help') | |
AddressWin.resizable(0,0) | |
lblAddress1 = Label (AddressWin, text="Create new gmail account for ONLY this use!!!!") | |
lblAddress1.grid(row=0, column=0) | |
lblAddress2 = Label (AddressWin, text="Must disable a security setting at this link:") | |
lblAddress2.grid(row=1, column=0) | |
entryAddress1 = Entry(AddressWin, width=17) | |
entryAddress1.insert(0,"http://goo.gl/jVIYzu") | |
entryAddress1.grid(row=3, column=0) | |
def rtnupdatesettings(): | |
del MNlist[:] | |
MNlistsize=lstMNlist.size() | |
lpticker=0 | |
while lpticker < MNlistsize: | |
lpdummy=lstMNlist.get(lpticker) | |
MNlist.append(lpdummy) | |
lpticker = lpticker + 1 | |
MNliststring='-'.join(MNlist) | |
notifyaddress=entrynotifyaddress.get() | |
mnbotaddress=entrymnbotaddress.get() | |
mnbotpw=entrymnbotpw.get() | |
dummyIPsetting =sttngIP.get() | |
dummyACTIVEsetting =sttngActive.get() | |
dummySUMsetting =sttngSum.get() | |
dummyNotifyActivitysetting =sttngActivityNotify.get() | |
################################ | |
if dummyIPsetting==1: | |
lstIPshow.grid(row=1, column=3, columnspan =1, rowspan =1, sticky = N) | |
else: | |
lstIPshow.grid_forget() | |
if dummyACTIVEsetting==1: | |
lstActiveShow.grid(row=1, column=4, columnspan =1, rowspan =1, sticky = N) | |
else: | |
lstActiveShow.grid_forget() | |
if dummySUMsetting==1: | |
lblsumshow.grid(row=2,column=5, stick = W) | |
else: | |
lblsumshow.grid_forget() | |
############################### | |
inisettings=con.ConfigParser() | |
inisettings.add_section("settings") | |
inisettings.set("settings","MNlist", MNliststring) | |
inisettings.set("settings","notifyaddress", notifyaddress) | |
inisettings.set("settings","mnbotaddress", mnbotaddress) | |
inisettings.set("settings","mnbotpw", mnbotpw) | |
inisettings.set("settings","ipview", dummyIPsetting) | |
inisettings.set("settings","activeview", dummyACTIVEsetting) | |
inisettings.set("settings","sumview", dummySUMsetting) | |
inisettings.set("settings","notifyactivity", dummyNotifyActivitysetting) | |
dummy=open(pathnameini,"w") | |
inisettings.write(dummy) | |
dummy.close() | |
if sys.platform == 'win32': | |
settingsWin = Tk() | |
settingsWin.title('HEADS UP') | |
settingsWin.resizable(0,0) | |
lblAbout1 = Label (settingsWin, text="Some versions of windows require you to ") | |
lblAbout1.grid(row=0, column=0) | |
lblAbout2 = Label (settingsWin, text="restart the program after changing settings") | |
lblAbout2.grid(row=1, column=0) | |
def rtnpaste1(): | |
clipbrddummy=root.selection_get(selection = "CLIPBOARD") | |
entryMNadd.delete(0, END) | |
entryMNadd.insert(0,clipbrddummy) | |
def popup1(event): | |
menu1.post(event.x_root, event.y_root) | |
def rtnpaste2(): | |
clipbrddummy=root.selection_get(selection = "CLIPBOARD") | |
entrynotifyaddress.delete(0, END) | |
entrynotifyaddress.insert(0,clipbrddummy) | |
def popup2(event): | |
menu2.post(event.x_root, event.y_root) | |
def rtnpaste3(): | |
clipbrddummy=root.selection_get(selection = "CLIPBOARD") | |
entrymnbotaddress.delete(0, END) | |
entrymnbotaddress.insert(0,clipbrddummy) | |
def popup3(event): | |
menu3.post(event.x_root, event.y_root) | |
def rtnpaste4(): | |
clipbrddummy=root.selection_get(selection = "CLIPBOARD") | |
entrymnbotpw.delete(0, END) | |
entrymnbotpw.insert(0,clipbrddummy) | |
def popup4(event): | |
menu4.post(event.x_root, event.y_root) | |
def rtngettime(): | |
ze = datetime.now().strftime('%H:%M:%S') | |
return ze | |
def rtnshowmessage(dummytext): | |
msgscreen = Tk() | |
w = Message(msgscreen, text=dummytext, width=200) | |
w.pack() | |
def rtnupdatesum(): | |
lpticker=0 | |
MNlistsize=lstMNlist.size() | |
drktotal=0 | |
while lpticker < MNlistsize: | |
try: | |
drkaddressbalance=lstBalanceShow.get(lpticker) | |
drkaddint = float(drkaddressbalance) | |
drktotal = drktotal + drkaddint | |
lpticker = lpticker +1 | |
except: | |
lpticker = lpticker + 1 | |
a=("%.2f" % drktotal) | |
lblsumshow.configure(text=float(a)) | |
def rtngetbalance(MNaddress): | |
errorstatus=0 | |
try: | |
urldummy="http://explorer.dash.org/chain/Dash/q/addressbalance/"+MNaddress | |
usockdummy = urllib2.urlopen(urldummy) | |
datastr = usockdummy.read() | |
usockdummy.close() | |
MNbalancedummy = float(datastr) | |
a=("%.2f" % MNbalancedummy) | |
MNbalance=float(a) | |
return MNbalance | |
except urllib2.HTTPError as e: | |
print e.code | |
print e.read | |
except: | |
errorstatus=1 | |
def rtnbalanceupdatecheck(): | |
errorstatus =0 | |
try: | |
MNlistsize=len(MNlist) | |
lpticker=0 | |
while lpticker < MNlistsize: | |
oldbalance=lstBalanceShow.get(lpticker) | |
dummyaddress= MNlist[lpticker] | |
dummybalance=rtngetbalance(dummyaddress) | |
dummytime=rtngettime() | |
lstTimeShow.delete(lpticker) | |
lstTimeShow.insert(lpticker, dummytime) | |
lstBalanceShow.delete(lpticker) | |
lstBalanceShow.insert(lpticker, dummybalance) | |
if dummybalance > oldbalance: | |
dummydifference=dummybalance-oldbalance | |
dummydifferencestring = str(dummydifference) | |
mailstring="MN "+dummyaddress+" WAS PAID!! +"+dummydifferencestring | |
rtnsendmail(mailstring) | |
rtnshowmessage(mailstring) | |
lstBalanceShow.delete(lpticker) | |
lstBalanceShow.insert(lpticker, dummybalance) | |
lpticker = lpticker + 1 | |
time.sleep(.2) | |
rtnupdatesum() | |
except urllib2.HTTPError as e: | |
print e.code | |
print e.read | |
except: | |
errorstatus=1 | |
root.after(60000, rtnbalanceupdatecheck) | |
def rtnsendmail(stringmessage): | |
inigrab=con.ConfigParser() | |
inigrab.read(pathnameini) | |
inivaluemnbotaddress=inigrab.get("settings","mnbotaddress") | |
inivaluemnbotpw=inigrab.get("settings","mnbotpw") | |
inivaluenotify = inigrab.get("settings","notifyaddress") | |
if inivaluemnbotaddress == "" or inivaluemnbotpw == "" or inivaluenotify == "": | |
return; | |
dummyloginlocation = inivaluemnbotaddress.find('@') | |
dummylogin = inivaluemnbotaddress[:dummyloginlocation] | |
server = smtplib.SMTP('smtp.gmail.com:587') | |
server.starttls() | |
server.login(dummylogin,inivaluemnbotpw) | |
server.sendmail(inivaluemnbotaddress, inivaluenotify, stringmessage) | |
server.quit() | |
def rtnOnlinecheck(): | |
try: | |
MNlistsize=len(MNlist) | |
if MNlistsize > 0: | |
reqList = 'pubkeys=["' + '","'.join(MNlist) + '"]' | |
urldummy="https://dashninja.pl/api/masternodes?" + reqList | |
usockdummy = urllib2.urlopen(urldummy) | |
strResult = usockdummy.read() | |
usockdummy.close() | |
lResult = json.loads(strResult)['data'] | |
nResultSize = len(lResult) | |
lpticker=0 | |
while lpticker < nResultSize: | |
tempRes = lResult[lpticker] | |
if tempRes['MasternodePubkey'] in MNlist: | |
indexFound = MNlist.index(tempRes['MasternodePubkey']) | |
lstIPshow.delete(indexFound) | |
lstIPshow.insert(indexFound, tempRes['MasternodeIP']) | |
intActive = int(tempRes['ActiveCount']) | |
intInactive = tempRes['InactiveCount'] | |
intUnlisted = tempRes['UnlistedCount'] | |
dummytotal = intActive + intInactive + intUnlisted | |
dummyActiveRatio = (intActive / dummytotal) * 100 | |
if dummyActiveRatio<=50: | |
mailstring="MN "+tempRes['MasternodePubkey']+" has dropped below 50% activity!!" | |
if inivalueACTIVITYnotify=="1": | |
rtnsendmail(mailstring) | |
rtnshowmessage(mailstring) | |
lstActiveShow.delete(indexFound) | |
lstActiveShow.insert(indexFound, str(dummyActiveRatio) + "%") | |
lpticker = lpticker + 1 | |
except urllib2.HTTPError as e: | |
print e.code | |
print e.read | |
except: | |
errorstatus=1 | |
root.after(180000, rtnOnlinecheck) | |
################################################################## | |
pathname = AppDirs('MN', 'g8F98FF3gjafogj4').user_data_dir | |
if not os.path.exists(pathname): | |
os.makedirs(pathname) | |
if sys.platform == 'win32': | |
pathnameini = pathname + "\\MN.ini" | |
else: | |
pathnameini = pathname + "/MN.conf" | |
inivalueMNlist="" | |
inivaluenotify="" | |
inivaluemnbotaddress="" | |
inivaluemnbotpw="" | |
inivalueIPview=1 | |
inivalueACTIVEview=1 | |
inivalueSUMview=1 | |
inivalueACTIVITYnotify=0 | |
try: | |
inigrab=con.ConfigParser() | |
inigrab.read(pathnameini) | |
inivalueMNlist=inigrab.get("settings","MNlist") | |
inivaluenotify=inigrab.get("settings","notifyaddress") | |
inivaluemnbotaddress=inigrab.get("settings","mnbotaddress") | |
inivaluemnbotpw=inigrab.get("settings","mnbotpw") | |
inivalueIPview=inigrab.get("settings","ipview") | |
inivalueACTIVEview=inigrab.get("settings","activeview") | |
inivalueSUMview=inigrab.get("settings","sumview") | |
inivalueACTIVITYnotify=inigrab.get("settings","notifyactivity") | |
except Exception as e: | |
print e | |
sttngIP = IntVar() | |
sttngActive = IntVar() | |
sttngSum = IntVar() | |
sttngActivityNotify = IntVar() | |
################################################################## | |
lblpad = Label(text=" ") | |
lblpad.grid(row=1, column=0) | |
lstMNshow = Listbox(root, width=40, height=1, borderwidth=0, highlightthickness=0, activestyle='none') | |
lstMNshow.grid(row=1, column=1, columnspan =2, rowspan =2, sticky = N) | |
####################### | |
lstIPshow = Listbox(root, width=15, height=1, borderwidth=0, highlightthickness=0, activestyle='none') | |
if inivalueIPview=="1": | |
lstIPshow.grid(row=1, column=3, columnspan =1, rowspan =1, sticky = N) | |
lstActiveShow = Listbox(root, width=7, height=1, borderwidth=0, highlightthickness=0, activestyle='none') | |
if inivalueACTIVEview=="1": | |
lstActiveShow.grid(row=1, column=4, columnspan =1, rowspan =1, sticky = W) | |
lblsumshow = Label(root) | |
if inivalueSUMview=="1": | |
lblsumshow.grid(row=2,column=5, stick = W) | |
########################## | |
lstBalanceShow = Listbox(root, width=8, height=1, borderwidth=0, highlightthickness=0, activestyle='none') | |
lstBalanceShow.grid(row=1, column=5, rowspan =1, sticky = W) | |
lstTimeShow = Listbox(root, height=1, width= 8, borderwidth=0, highlightthickness=0, activestyle='none') | |
lstTimeShow.grid(row=1, column=6, rowspan =1, sticky = N) | |
btnsettingsshow32 = Button(root, text="Settings", command=rtnsettingsshow) | |
btnsettingsshow32.grid(row=3, column=5) | |
btnsettingshide32 = Button(root, text="Settings", command=rtnsettingshide) | |
btnabout33 = Button(root, text="About", command=rtnabout) | |
btnabout33.grid(row=3, column=6) | |
######################################################### | |
lblsettingsMNlist = Label(root, text="Masternode List") | |
lstMNlist = Listbox(root, width=40, height = 6, selectmode=SINGLE) | |
btnMNlistremove = Button(root, text="Remove", command=rtnMNlistremove) | |
entryMNadd = Entry(root, width=40) | |
btnMNlistadd = Button(root, text=" Add ", command=rtnMNlistadd) | |
lblnotifyaddress = Label(root, text="Notify:") | |
entrynotifyaddress = Entry(root, width=21) | |
btnnotifyaddresshelp = Button(root, text=" ? ", command=rtnnotifyaddresshelp) | |
lblmnbotaddress = Label(root, text="MN BOT Address:") | |
entrymnbotaddress = Entry(root, width=21) | |
btnmnbotaddresshelp = Button(root, text=" ? ", command=rtnmnbotaddresshelp) | |
lblmnbotpw = Label(root, text="MN BOT PW:") | |
entrymnbotpw = Entry(root, width=21, show="*") | |
lblIPSetting = Label(root, text="Show IP:",) | |
rdIPON = Radiobutton(root, text="ON", variable=sttngIP, value=1) | |
rdIPOFF = Radiobutton(root, text="OFF", variable=sttngIP, value=0) | |
lblActiveSetting = Label(root, text="Show Activity:") | |
rdSumON = Radiobutton(root, text="ON", variable=sttngSum, value=1) | |
rdSumOFF = Radiobutton(root, text="OFF", variable=sttngSum, value=0) | |
lblNotifyActivty = Label(root, text="Notify Activity Drop",) | |
rdActiveON = Radiobutton(root, text="ON", variable=sttngActive, value=1) | |
rdActiveOFF = Radiobutton(root, text="OFF", variable=sttngActive, value=0) | |
lblSumSetting = Label(root, text="Show Sum:",) | |
rdActivityON = Radiobutton(root, text="ON", variable=sttngActivityNotify, value=1) | |
rdActivityOFF = Radiobutton(root, text="OFF", variable=sttngActivityNotify, value=0) | |
btnupdatesettings = Button(root, text="Update Settings", command=rtnupdatesettings) | |
###################################################### | |
menu1 = Menu(root, tearoff=0) | |
menu1.add_command(label="Paste", command=rtnpaste1) | |
entryMNadd.bind("<Button-3>", popup1) | |
menu2 = Menu(root, tearoff=0) | |
menu2.add_command(label="Paste", command=rtnpaste2) | |
entrynotifyaddress.bind("<Button-3>", popup2) | |
menu3 = Menu(root, tearoff=0) | |
menu3.add_command(label="Paste", command=rtnpaste3) | |
entrymnbotaddress.bind("<Button-3>", popup3) | |
menu4 = Menu(root, tearoff=0) | |
menu4.add_command(label="Paste", command=rtnpaste4) | |
entrymnbotpw.bind("<Button-3>", popup4) | |
########################################################## | |
entrynotifyaddress.insert(0,inivaluenotify) | |
entrymnbotaddress.insert(0,inivaluemnbotaddress) | |
entrymnbotpw.insert(0,inivaluemnbotpw) | |
sttngIP.set(inivalueIPview) | |
sttngActive.set(inivalueACTIVEview) | |
sttngSum.set(inivalueSUMview) | |
sttngActivityNotify.set(inivalueACTIVITYnotify) | |
MNlist = inivalueMNlist.split('-') | |
MNlistsize=len(MNlist) | |
lstMNlist.delete(0, END) | |
lpticker=0 | |
if MNlistsize == 0: | |
rtnshowmessage("Please configure settings!") | |
else: | |
try: | |
while lpticker < MNlistsize: | |
lpdummy=MNlist[lpticker] | |
dummybalancestring=rtngetbalance(lpdummy) | |
dummybalance=float(dummybalancestring) | |
dummytime=rtngettime() | |
lstMNlist.insert(END, lpdummy) | |
lstMNshow.insert(END, lpdummy) | |
lstBalanceShow.insert(END, dummybalance) | |
lstTimeShow.insert(END, dummytime) | |
lstIPshow.insert(END, "-") | |
lstActiveShow.insert(END, "-") | |
lpticker = lpticker + 1 | |
time.sleep(.2) | |
rtnupdatesum() | |
except: | |
errorstats=1 | |
lstMNshow.configure(height=MNlistsize) | |
lstBalanceShow.configure(height=MNlistsize) | |
lstTimeShow.configure(height=MNlistsize) | |
lstIPshow.configure(height=MNlistsize) | |
lstActiveShow.configure(height=MNlistsize) | |
############################## | |
root.after(3000, rtnOnlinecheck) | |
root.after(60000, rtnbalanceupdatecheck) | |
root.mainloop() | |
if __name__ == '__main__': | |
main() |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment