Last active
December 18, 2015 00:38
-
-
Save nilgradisnik/5697834 to your computer and use it in GitHub Desktop.
Bitstamp current price checker. Ubuntu unity appindicator.
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
nohup.out | |
*.png |
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
#!/usr/bin/env python | |
# Bitstamp current price checker | |
# Nil Gradisnik <[email protected]> | |
# Thanks to http://conjurecode.com/create-indicator-applet-for-ubuntu-unity-with-python/ | |
import sys | |
import gtk | |
import gobject | |
import appindicator | |
import requests | |
import simplejson as json | |
APP_NAME = "Bitstamp indicator" | |
APP_VERSION = "1.1" | |
ICON_NAME = "" | |
PING_FREQUENCY = 30 # seconds | |
BITSTAMP_TICKER = "https://www.bitstamp.net/api/ticker/" | |
class BitstampPrice: | |
def __init__(self): | |
self.ind = appindicator.Indicator("bitstamp-indicator", ICON_NAME, appindicator.CATEGORY_APPLICATION_STATUS) | |
self.ind.set_status(appindicator.STATUS_ACTIVE) | |
self.ind.set_label("syncing", "$888.88") | |
self.menu_setup() | |
self.ind.set_menu(self.menu) | |
def menu_setup(self): | |
self.menu = gtk.Menu() | |
self.bid_item = gtk.MenuItem("Bid:") | |
self.bid_item.show() | |
self.high_item = gtk.MenuItem("High:") | |
self.high_item.show() | |
self.low_item = gtk.MenuItem("Low:") | |
self.low_item.show() | |
self.ask_item = gtk.MenuItem("Ask:") | |
self.ask_item.show() | |
self.volume_item = gtk.MenuItem("Volume:") | |
self.volume_item.show() | |
separator_item = gtk.SeparatorMenuItem() | |
separator_item.show() | |
preferences_item = gtk.MenuItem("Preferences") | |
preferences_item.connect("activate", self.preferences) | |
preferences_item.show() | |
about_item = gtk.MenuItem("About") | |
about_item.connect("activate", self.about) | |
about_item.show() | |
quit_item = gtk.MenuItem("Quit") | |
quit_item.connect("activate", self.quit) | |
quit_item.show() | |
self.menu.append(self.bid_item) | |
self.menu.append(self.high_item) | |
self.menu.append(self.low_item) | |
self.menu.append(self.ask_item) | |
self.menu.append(self.volume_item) | |
self.menu.append(separator_item) | |
self.menu.append(preferences_item) | |
self.menu.append(about_item) | |
self.menu.append(quit_item) | |
def main(self): | |
self.check_price() | |
self.ping_frequency = PING_FREQUENCY | |
self.timeout_id = gobject.timeout_add(self.ping_frequency * 1000, self.check_price) | |
gtk.main() | |
def check_price(self): | |
data = self.price_checker() | |
if data: | |
self.set_label(data["last"]) | |
self.bid_item.get_child().set_text("Bid:\t\t"+"$"+data["bid"]) | |
self.high_item.get_child().set_text("High:\t\t"+"$"+data["high"]) | |
self.low_item.get_child().set_text("Low:\t\t"+"$"+data["low"]) | |
self.ask_item.get_child().set_text("Ask:\t\t"+"$"+data["ask"]) | |
vol = "%.2f" % float(data["volume"]) | |
self.volume_item.get_child().set_text("Volume:\t"+vol+" BTC") | |
else: | |
self.set_label(None) | |
return True | |
def set_label(self, price): | |
self.ind.set_label("$"+price if price else "error") | |
def price_checker(self): | |
try: | |
res = requests.get(BITSTAMP_TICKER) | |
return res.json() | |
except Exception as e: | |
print e | |
return None | |
def about(self, widget): | |
about = gtk.AboutDialog() | |
about.set_name(APP_NAME) | |
about.set_comments("Simple Bitstamp price indicator") | |
about.set_copyright("Copyright (C) 2013 Nil Gradisnik") | |
about.set_version(APP_VERSION) | |
about.set_website("http://bitstamp.net") | |
about.set_authors(["Nil Gradisnik <[email protected]>"]) | |
about.set_logo_icon_name(ICON_NAME) | |
res = about.run() | |
if res == -4 or -6: # close events | |
about.destroy() | |
def preferences(self, widget): | |
dialog = gtk.Dialog(APP_NAME+" Preferences") | |
dialog.set_has_separator(True) | |
dialog.add_button("Close", 1) | |
label_refresh = gtk.Label("Refresh every") | |
label_refresh.show() | |
label_seconds = gtk.Label("seconds") | |
label_seconds.show() | |
spin = gtk.SpinButton() | |
spin.set_increments(1, 1) | |
spin.set_range(3, 120) | |
spin.set_value(self.ping_frequency) | |
spin.show() | |
hbox = gtk.HBox() | |
hbox.add(label_refresh) | |
hbox.add(spin) | |
hbox.add(label_seconds) | |
hbox.set_spacing(10) | |
hbox.set_border_width(20) | |
hbox.show() | |
dialog.vbox.add(hbox) | |
res = dialog.run() | |
if res == 1: | |
gobject.source_remove(self.timeout_id) | |
self.ping_frequency = spin.get_value_as_int() | |
self.timeout_id = gobject.timeout_add(self.ping_frequency * 1000, self.check_price) | |
dialog.destroy() | |
def quit(self, widget): | |
sys.exit(0) | |
if __name__ == "__main__": | |
indicator = BitstampPrice() | |
indicator.main() |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment