193 lines
		
	
	
		
			5.6 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			193 lines
		
	
	
		
			5.6 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
| <?php declare(strict_types=1);
 | |
| 
 | |
| class CreateTipEvent extends Event
 | |
| {
 | |
|     public bool $enable;
 | |
|     public string $image;
 | |
|     public string $text;
 | |
| 
 | |
|     public function __construct(bool $enable, string $image, string $text)
 | |
|     {
 | |
|         parent::__construct();
 | |
|         $this->enable = $enable;
 | |
|         $this->image = $image;
 | |
|         $this->text = $text;
 | |
|     }
 | |
| }
 | |
| 
 | |
| class DeleteTipEvent extends Event
 | |
| {
 | |
|     public int $tip_id;
 | |
|     public function __construct(int $tip_id)
 | |
|     {
 | |
|         parent::__construct();
 | |
|         $this->tip_id = $tip_id;
 | |
|     }
 | |
| }
 | |
| 
 | |
| class Tips extends Extension
 | |
| {
 | |
|     /** @var TipsTheme */
 | |
|     protected ?Themelet $theme;
 | |
| 
 | |
|     public function onDatabaseUpgrade(DatabaseUpgradeEvent $event)
 | |
|     {
 | |
|         global $database;
 | |
| 
 | |
|         if ($this->get_version("ext_tips_version") < 1) {
 | |
|             $database->create_table("tips", "
 | |
|                 id SCORE_AIPK,
 | |
|                 enable BOOLEAN NOT NULL DEFAULT FALSE,
 | |
|                 image TEXT NOT NULL,
 | |
|                 text TEXT NOT NULL,
 | |
|             ");
 | |
| 
 | |
|             $database->execute(
 | |
|                 "
 | |
| 					INSERT INTO tips (enable, image, text)
 | |
| 					VALUES (:enable, :image, :text)",
 | |
|                 ["enable"=>true, "image"=>"coins.png", "text"=>"Do you like this extension? Please support us for developing new ones. <a href=\"https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=8235933\" target=\"_blank\">Donate through paypal</a>."]
 | |
|             );
 | |
| 
 | |
|             $this->set_version("ext_tips_version", 2);
 | |
|         }
 | |
|         if ($this->get_version("ext_tips_version") < 2) {
 | |
|             $database->standardise_boolean("tips", "enable");
 | |
|             $this->set_version("ext_tips_version", 2);
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     public function onPageRequest(PageRequestEvent $event)
 | |
|     {
 | |
|         global $page, $user;
 | |
| 
 | |
|         $this->getTip();
 | |
| 
 | |
|         if ($event->page_matches("tips") && $user->can(Permissions::TIPS_ADMIN)) {
 | |
|             switch ($event->get_arg(0)) {
 | |
|                 case "list":
 | |
|                     $this->manageTips();
 | |
|                     $this->getAll();
 | |
|                     break;
 | |
|                 case "save":
 | |
|                     if ($user->check_auth_token()) {
 | |
|                         send_event(new CreateTipEvent(isset($_POST["enable"]), $_POST["image"], $_POST["text"]));
 | |
|                         $page->set_mode(PageMode::REDIRECT);
 | |
|                         $page->set_redirect(make_link("tips/list"));
 | |
|                     }
 | |
|                     break;
 | |
|                 case "status":
 | |
|                     // FIXME: HTTP GET CSRF
 | |
|                     $tipID = int_escape($event->get_arg(1));
 | |
|                     $this->setStatus($tipID);
 | |
|                     $page->set_mode(PageMode::REDIRECT);
 | |
|                     $page->set_redirect(make_link("tips/list"));
 | |
|                     break;
 | |
|                 case "delete":
 | |
|                     // FIXME: HTTP GET CSRF
 | |
|                     $tipID = int_escape($event->get_arg(1));
 | |
|                     send_event(new DeleteTipEvent($tipID));
 | |
|                     $page->set_mode(PageMode::REDIRECT);
 | |
|                     $page->set_redirect(make_link("tips/list"));
 | |
|                     break;
 | |
|             }
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     public function onPageSubNavBuilding(PageSubNavBuildingEvent $event)
 | |
|     {
 | |
|         global $user;
 | |
|         if ($event->parent==="system") {
 | |
|             if ($user->can(Permissions::TIPS_ADMIN)) {
 | |
|                 $event->add_nav_link("tips", new Link('tips/list'), "Tips Editor");
 | |
|             }
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     public function onUserBlockBuilding(UserBlockBuildingEvent $event)
 | |
|     {
 | |
|         global $user;
 | |
|         if ($user->can(Permissions::TIPS_ADMIN)) {
 | |
|             $event->add_link("Tips Editor", make_link("tips/list"));
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     private function manageTips()
 | |
|     {
 | |
|         $data_href = get_base_href();
 | |
|         $url = $data_href."/ext/tips/images/";
 | |
| 
 | |
|         $dirPath = dir('./ext/tips/images');
 | |
|         $images = [];
 | |
|         while (($file = $dirPath->read()) !== false) {
 | |
|             if ($file[0] != ".") {
 | |
|                 $images[] = trim($file);
 | |
|             }
 | |
|         }
 | |
|         $dirPath->close();
 | |
|         sort($images);
 | |
| 
 | |
|         $this->theme->manageTips($url, $images);
 | |
|     }
 | |
| 
 | |
|     public function onCreateTip(CreateTipEvent $event)
 | |
|     {
 | |
|         global $database;
 | |
|         $database->execute(
 | |
|             "
 | |
| 				INSERT INTO tips (enable, image, text)
 | |
| 				VALUES (:enable, :image, :text)",
 | |
|             ["enable"=>$event->enable, "image"=>$event->image, "text"=>$event->text]
 | |
|         );
 | |
|     }
 | |
| 
 | |
|     private function getTip()
 | |
|     {
 | |
|         global $database;
 | |
| 
 | |
|         $data_href = get_base_href();
 | |
|         $url = $data_href."/ext/tips/images/";
 | |
| 
 | |
|         $tip = $database->get_row("
 | |
|             SELECT *
 | |
|             FROM tips
 | |
|             WHERE enable = :true
 | |
|             ORDER BY RAND()
 | |
|             LIMIT 1
 | |
|         ", ["true"=>true]);
 | |
| 
 | |
|         if ($tip) {
 | |
|             $this->theme->showTip($url, $tip);
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     private function getAll()
 | |
|     {
 | |
|         global $database;
 | |
| 
 | |
|         $data_href = get_base_href();
 | |
|         $url = $data_href."/ext/tips/images/";
 | |
| 
 | |
|         $tips = $database->get_all("SELECT * FROM tips ORDER BY id ASC");
 | |
| 
 | |
|         $this->theme->showAll($url, $tips);
 | |
|     }
 | |
| 
 | |
|     private function setStatus(int $tipID)
 | |
|     {
 | |
|         global $database;
 | |
| 
 | |
|         $tip = $database->get_row("SELECT * FROM tips WHERE id = :id ", ["id"=>$tipID]);
 | |
| 
 | |
|         $enable = bool_escape($tip['enable']);
 | |
| 
 | |
|         $database->execute("UPDATE tips SET enable = :enable WHERE id = :id", ["enable"=>$enable, "id"=>$tipID]);
 | |
|     }
 | |
| 
 | |
|     public function onDeleteTip(DeleteTipEvent $event)
 | |
|     {
 | |
|         global $database;
 | |
|         $database->execute("DELETE FROM tips WHERE id = :id", ["id"=>$event->tip_id]);
 | |
|     }
 | |
| }
 |