diff --git a/sql/2016-05-23-bookmarks.sql b/sql/2016-05-23-bookmarks.sql new file mode 100644 index 0000000..ab5ab19 --- /dev/null +++ b/sql/2016-05-23-bookmarks.sql @@ -0,0 +1,18 @@ +-- Recent additions to add after db init (.gz) +-- mysql yaamp -p < file.sql + +CREATE TABLE `bookmarks` ( + `id` int(11) NOT NULL AUTO_INCREMENT PRIMARY KEY, + `idcoin` int(11) NOT NULL, + `label` varchar(32) NULL, + `address` varchar(128) NOT NULL, + `lastused` int(10) UNSIGNED NOT NULL +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +-- KEYS + +ALTER TABLE `bookmarks` + ADD KEY `bookmarks_coin` (`idcoin`); + +ALTER TABLE `bookmarks` ADD CONSTRAINT fk_bookmarks_coin FOREIGN KEY (`idcoin`) + REFERENCES coins (`id`) ON DELETE CASCADE; diff --git a/web/yaamp/models/db_bookmarksModel.php b/web/yaamp/models/db_bookmarksModel.php new file mode 100644 index 0000000..7443f84 --- /dev/null +++ b/web/yaamp/models/db_bookmarksModel.php @@ -0,0 +1,33 @@ +admin) return; $market = getdbo('db_markets', getiparam('id')); + if(!$market) { + user()->setFlash('error', "invalid market"); + $this->goback(); + return; + } $coin = getdbo('db_coins', $market->coinid); if(isset($_POST['db_markets'])) @@ -46,6 +51,11 @@ class MarketController extends CommonController if(!$this->admin) return; $market = getdbo('db_markets', getiparam('id')); + if(!$market) { + user()->setFlash('error', "invalid market"); + $this->goback(); + return; + } $coin = getdbo('db_coins', $market->coinid); $amount = getparam('amount'); @@ -72,6 +82,9 @@ class MarketController extends CommonController { user()->setFlash('error', $remote->error); $this->redirect(array('site/coin', 'id'=>$coin->id)); + } else { + $market->lastsent = time(); + $market->save(); } $exchange = new db_exchange; diff --git a/web/yaamp/modules/site/SiteController.php b/web/yaamp/modules/site/SiteController.php index 5dbaa6c..ad01f8a 100644 --- a/web/yaamp/modules/site/SiteController.php +++ b/web/yaamp/modules/site/SiteController.php @@ -172,6 +172,94 @@ class SiteController extends CommonController ///////////////////////////////////////////////// + public function actionBookmarkAdd() + { + if(!$this->admin) return; + $coin = getdbo('db_coins', getiparam('id')); + if ($coin) { + $bookmark = new db_bookmarks; + $bookmark->isNewRecord = true; + $bookmark->idcoin = $coin->id; + if (isset($_POST['db_bookmarks'])) { + $bookmark->setAttributes($_POST['db_bookmarks'], false); + if($bookmark->save()) + $this->redirect(array('/site/coin', 'id'=>$coin->id)); + } + $this->render('bookmark', array('bookmark'=>$bookmark, 'coin'=>$coin)); + } else { + $this->goback(); + } + } + + public function actionBookmarkDel() + { + if(!$this->admin) return; + $bookmark = getdbo('db_bookmarks', getiparam('id')); + if ($bookmark) { + $bookmark->delete(); + } + $this->goback(); + } + + public function actionBookmarkEdit() + { + if(!$this->admin) return; + $bookmark = getdbo('db_bookmarks', getiparam('id')); + if($bookmark) { + $coin = getdbo('db_coins', $bookmark->idcoin); + if ($coin && isset($_POST['db_bookmarks'])) { + $bookmark->setAttributes($_POST['db_bookmarks'], false); + if($bookmark->save()) + $this->redirect(array('/site/coin', 'id'=>$coin->id)); + } + $this->render('bookmark', array('bookmark'=>$bookmark, 'coin'=>$coin)); + } else { + user()->setFlash('error', "invalid bookmark"); + $this->goback(); + } + } + + public function actionBookmarkSend() + { + if(!$this->admin) return; + + $bookmark = getdbo('db_bookmarks', getiparam('id')); + if($bookmark) { + $coin = getdbo('db_coins', $bookmark->idcoin); + $amount = getparam('amount'); + + $remote = new Bitcoin($coin->rpcuser, $coin->rpcpasswd, $coin->rpchost, $coin->rpcport); + + $info = $remote->getinfo(); + if(!$info || !$info['balance']) return false; + + $deposit_info = $remote->validateaddress($bookmark->address); + if(!$deposit_info || !isset($deposit_info['isvalid']) || !$deposit_info['isvalid']) { + user()->setFlash('error', "invalid address for {$coin->name}, {$bookmark->address}"); + $this->redirect(array('site/coin', 'id'=>$coin->id)); + } + + $amount = min($amount, $info['balance'] - $info['paytxfee']); + $amount = round($amount, 8); + + $tx = $remote->sendtoaddress($bookmark->address, $amount); + if(!$tx) { + debuglog("unable to send $amount {$coin->symbol} to bookmark {$bookmark->address}"); + debuglog($remote->error); + user()->setFlash('error', $remote->error); + $this->redirect(array('site/coin', 'id'=>$coin->id)); + } else { + debuglog("sent $amount {$coin->symbol} to bookmark {$bookmark->address}"); + $bookmark->lastused = time(); + $bookmark->save(); + } + } + + $this->redirect(array('site/coin', 'id'=>$coin->id)); + } + + ///////////////////////////////////////////////// + public function actionConsole() { if(!$this->admin) return; diff --git a/web/yaamp/modules/site/bookmark.php b/web/yaamp/modules/site/bookmark.php new file mode 100644 index 0000000..03b8cb6 --- /dev/null +++ b/web/yaamp/modules/site/bookmark.php @@ -0,0 +1,28 @@ +id}'>{$coin->name} "; +echo "Bookmark: $bookmark->label
"; + +$this->widget('UniForm'); + +echo CUFHtml::beginForm(); +echo CUFHtml::errorSummary($bookmark); +echo CUFHtml::openTag('fieldset', array('class'=>'inlineLabels')); + +echo CUFHtml::openActiveCtrlHolder($bookmark, 'label'); +echo CUFHtml::activeLabelEx($bookmark, 'label'); +echo CUFHtml::activeTextField($bookmark, 'label', array('maxlength'=>32)); +echo "

.

"; +echo CUFHtml::closeCtrlHolder(); + +echo CUFHtml::openActiveCtrlHolder($bookmark, 'address'); +echo CUFHtml::activeLabelEx($bookmark, 'address'); +echo CUFHtml::activeTextField($bookmark, 'address', array('maxlength'=>128)); +echo "

.

"; +echo CUFHtml::closeCtrlHolder(); + +echo CUFHtml::closeTag('fieldset'); +showSubmitButton('Save'); +echo CUFHtml::endForm(); diff --git a/web/yaamp/modules/site/coin.php b/web/yaamp/modules/site/coin.php index 02939b5..1a9ecc3 100644 --- a/web/yaamp/modules/site/coin.php +++ b/web/yaamp/modules/site/coin.php @@ -114,7 +114,7 @@ function main_error() main_timeout = setTimeout(main_refresh, main_delay*2); } -function showSellAmountDialog(marketid, marketname, address) +function showSellAmountDialog(marketname, address, marketid, bookmarkid) { $("#dlgaddr").html(address); $("#sell-amount-dialog").dialog( @@ -130,7 +130,10 @@ function showSellAmountDialog(marketid, marketname, address) "Send / Sell": function() { amount = $('#input_sell_amount').val(); - window.location.href = '/market/sellto?id='+marketid+'&amount='+amount; + if (marketid > 0) + window.location.href = '/market/sellto?id='+marketid+'&amount='+amount; + else + window.location.href = '/site/bookmarkSend?id='+bookmarkid+'&amount='+amount; }, } }); diff --git a/web/yaamp/modules/site/coin_results.php b/web/yaamp/modules/site/coin_results.php index 3e26edc..450002c 100644 --- a/web/yaamp/modules/site/coin_results.php +++ b/web/yaamp/modules/site/coin_results.php @@ -34,6 +34,8 @@ echo ", ".CHtml::link($reserved1, "/site/payments?id=".$coin->id)." $symbol clea ////////////////////////////////////////////////////////////////////////////////////// +$bookmarkAdd = CHtml::link('+', "/site/bookmarkAdd?id=".$coin->id, array('title'=>'Add a bookmark')); + echo << @@ -48,7 +50,7 @@ echo <<Traded - + end; @@ -84,7 +86,7 @@ foreach($list as $market) echo CHtml::link( YAAMP_ALLOW_EXCHANGE ? "sell" : "send", "javascript:;", array( - 'onclick'=>"return showSellAmountDialog({$market->id}, $name, $addr);" + 'onclick'=>"return showSellAmountDialog($name, $addr, {$market->id});" ) ); echo ' '.$market->deposit_address; @@ -120,6 +122,49 @@ foreach($list as $market) echo ""; } +// in the list after the markets, made for quick send between wallets +$list = getdbolist('db_bookmarks', "idcoin={$coin->id} ORDER BY lastused DESC"); + +foreach($list as $bookmark) +{ + echo ''; + + echo ''; + echo ''; + echo ''; + + echo ''; + + echo ''; + echo ''; + + $sent = datetoa2($bookmark->lastused); + echo ''; + echo ''; + echo ''; + + echo ''; + + echo ''; + + echo ""; +} + echo "
Late MessageActions{$bookmarkAdd} Actions
'.$bookmark->label.''; + if (!empty($bookmark->address)) { + $name = CJavaScript::encode($bookmark->label); + $addr = CJavaScript::encode($bookmark->address); + echo CHtml::link( + "send", + "javascript:;", array( + 'onclick'=>"return showSellAmountDialog($name, $addr, 0, {$bookmark->id});" + ) + ); + echo ' '.$bookmark->address; + } + echo ' edit'; + echo ''.(empty($sent) ? "" : "$sent ago").''; + echo 'delete'; + echo '
"; //////////////////////////////////////////////////////////////////////////////////////