├── README.md
├── db.sql
├── init.php
├── lang.php
├── vars.php
├── MainBot.php
├── MashovClass.php
├── LICENSE
└── TheNewBot.php
/README.md:
--------------------------------------------------------------------------------
1 | # MashovSystem
2 | R.I.P Mashov System (Telegram Bots system) - PHP
3 |
4 |
5 | ## Config:
6 | * Create DB from db.sql
7 | * Define DB Config in ```TheNewBot.php```
8 | * Change ```mashov.tg-bots.yehudae.net``` to your mashov system domain
9 | * Set main bot webhook to ```MainBot.php```
10 | * Change ```DATA_PATH``` and ```CONTACT_TOKEN``` and ```WEBMASTER_TG_ID``` in ```init.php```
11 | * Enjoy 😁
12 |
13 | Contact me in mail yehuda.telegram@gmail.com.
14 |
15 | P.S.
16 |
17 | I wrote the code of this system at the beginning of my journey so it is a bit cumbersome and not the most efficient, I apologize 😅🙈🙈
--------------------------------------------------------------------------------
/db.sql:
--------------------------------------------------------------------------------
1 |
2 | CREATE TABLE `BotsData` (
3 | `bot_id` int NOT NULL,
4 | `token` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
5 | `username` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
6 | `creator` int NOT NULL,
7 | `time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP
8 | ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
9 |
10 | ALTER TABLE `BotsData`
11 | ADD PRIMARY KEY (`bot_id`);
12 |
13 | CREATE TABLE `blocks` (
14 | `id` int(30) NOT NULL AUTO_INCREMENT,
15 | `tg_auth` text NOT NULL,
16 | `type` text NOT NULL,
17 | `time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
18 | PRIMARY KEY (`id`)
19 | ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
20 |
--------------------------------------------------------------------------------
/init.php:
--------------------------------------------------------------------------------
1 | SetUpdate($update);
36 | if(isset($chatId) && isset($name))
37 | $bot->SaveID($chatId, $name);
38 |
39 |
40 | if(isset($update['channel_post'])){
41 | $bot->sendMessage($update['channel_post']['chat']['id'], "בוט זה אינו פעיל כרגע בקבוצות / ערוצים. סליחה.");
42 | $bot->leaveChat($update['channel_post']['chat']['id']);
43 | die();
44 | }
45 | if(isset($update['callback_query'])){
46 | $bot->sendMessage($update['callback_query']['message']['chat']['id'], "בוט זה אינו תומך במקלדת צפה. סליחה.");
47 | die();
48 | }
49 |
50 |
51 | if($bot->getBotBlocked()){
52 | $bot->sendMessage($chatId, $lang['botBlocked']);
53 | die();
54 | }
55 |
56 | if($bot->getCreatorBlocked()){
57 | $bot->sendMessage($chatId, $lang['creatorBlocked']);
58 | die();
59 | }
60 |
61 |
62 |
--------------------------------------------------------------------------------
/lang.php:
--------------------------------------------------------------------------------
1 | 5){
74 | $rfid = $message;
75 | $rtx = "^הודעת מערכת^";
76 |
77 | $message = $update['message']['reply_to_message']['text'] ?? null;
78 | //photo
79 | $tphoto = $update['message']['reply_to_message']['photo'] ?? null;
80 | if(isset($tphoto))
81 | $phid = $update['message']['reply_to_message']['photo'][count($tphoto)-1]['file_id'];
82 | //audio
83 | $auid = $update['message']['reply_to_message']['audio']['file_id'] ?? null;
84 | //document
85 | $did = $update['message']['reply_to_message']['document']['file_id'] ?? null;
86 | //video
87 | $vidid = $update['message']['reply_to_message']['video']['file_id'] ?? null;
88 | //voice
89 | $void = $update['message']['reply_to_message']['voice']['file_id'] ?? null;
90 | //video_note
91 | $vnid = $update['message']['reply_to_message']['video_note']['file_id'] ?? null;
92 | //contact
93 | $conid = $update['message']['reply_to_message']['contact']['phone_number'] ?? null;
94 | $conf = $update['message']['reply_to_message']['contact']['first_name'] ?? null;
95 | $conl = $update['message']['reply_to_message']['contact']['last_name'] ?? null;
96 | //location
97 | $locid1 = $update['message']['reply_to_message']['location']['latitude'] ?? null;
98 | $locid2 = $update['message']['reply_to_message']['location']['longitude'] ?? null;
99 | //Sticker
100 | $sti = $update['message']['reply_to_message']['sticker']['file_id'] ?? null;
101 | //poll
102 | $poll = $update['message']['reply_to_message']['poll'] ?? null;
103 | //all media
104 | $cap = $update['message']['reply_to_message']['caption'] ?? null;
105 | }
106 |
107 | $name = trim($fName." ".$lName);
108 |
109 | //CallBeck
110 | if(isset($update['callback_query'])){
111 | $message = $update["callback_query"]["data"] ?? null;
112 | $chatId = $update["callback_query"]["from"]["id"] ?? null;
113 | $messageId = $update["callback_query"]["message"]["message_id"] ?? null;
114 | }
115 |
116 | $chatLinkId = "".$chatId."";
117 | $hiddenUserLink = "";
118 | $editedText = "ההודעה נערכה ✏️\n\n";
119 |
120 |
--------------------------------------------------------------------------------
/MainBot.php:
--------------------------------------------------------------------------------
1 | $id,
41 | 'text' => $message,
42 | 'parse_mode' => $pm,
43 | 'disable_web_page_preview' => true
44 | );
45 | $out = curlPost('sendMessage',$PostData);
46 | return $out;
47 | }
48 | function deleteMessage($id, $messageId){
49 | $data["chat_id"] = $id;
50 | $data["message_id"] = $messageId;
51 | return curlPost("deleteMessage", $data);
52 | }
53 | function getToken($token) {
54 | $searchstring1 = "You can use this token to access HTTP API:";
55 | $searchstring2 = "Use this token to access the HTTP API:";
56 | $searchstring3 = "New token is:";
57 | $endstring = "For a description of the Bot API, see this page: https://core.telegram.org/bots/api";
58 | $pos1 = strpos($token,$searchstring1);
59 | if ($pos1 !== FALSE) {
60 | $pos1 += strlen($searchstring1) + 1;
61 | $length = strpos($token,$endstring);
62 | if ($length !== FALSE) {
63 | $length -= ($pos1 + 2);
64 | $token = substr($token,$pos1,$length);
65 | } else {
66 | $token = substr($token,$pos1);
67 | }}
68 | $pos2 = strpos($token,$searchstring2);
69 | if ($pos2 !== FALSE && !($pos1 !== FALSE)){
70 | $pos2 += strlen($searchstring2) + 1;
71 | $length = strpos($token,$endstring);
72 | if ($length !== FALSE) {
73 | $length -= ($pos2 + 2);
74 | $token = substr($token,$pos2,$length);
75 | } else {
76 | $token = substr($token,$pos2);
77 | }
78 | }
79 | $pos3 = strpos($token,$searchstring3);
80 | if ($pos3 !== FALSE && !($pos1 !== FALSE) && !($pos2 !== FALSE)){
81 | $pos3 += strlen($searchstring3) + 2;
82 | $length = strpos($token,$endstring);
83 | if ($length !== FALSE) {
84 | $length -= ($pos3 + 2);
85 | $token = substr($token,$pos3,$length);
86 | } else {
87 | $token = substr($token,$pos3);
88 | }
89 | }
90 | if(strlen($token) == 45 || strlen($token) == 46)
91 | $bot_info = json_decode(file_get_contents("https://api.telegram.org/bot".$token."/getMe"), true);
92 | else
93 | $bot_info['ok'] = false;
94 | if ($bot_info['ok'] == true) {
95 | $res = [
96 | 'ok' => true,
97 | 'id' => $bot_info['result']['id'],
98 | 'username' => $bot_info['result']['username'],
99 | 'first_name' => $bot_info['result']['first_name'],
100 | 'token' => $token,
101 | ];}
102 | else {
103 | $res = [
104 | 'ok' => false,
105 | 'token' => $token,
106 | ];
107 | }
108 | return $res;
109 | }
110 |
111 | $msg = $update['message']['text'] ?? null;
112 | $userId = $update['message']['chat']['id'] ?? null;
113 | $firstName = $update["message"]["from"]["first_name"] ?? null;
114 | $lastName = $update["message"]["from"]["last_name"] ?? null;
115 | $userName = trim($firstName." ".$lastName);
116 |
117 | if(isset($msg) && $msg != "/start"){
118 | $res = getToken($msg);
119 | if($res['ok']){
120 |
121 | $text = "יש 💪
122 | הצלחנו להוסיף את הבוט שלך למערכת שלנו 🥳
123 |
124 | הנה פרטים שמצאנו על הבוט שלך:
125 | טוקן - ".$res['token']."
126 | שם - ".$res['first_name']."
127 | שם משתמש - @".$res['username']."
128 |
129 | תהנה 😎
130 |
131 | ועוד משהו קטן, אם אתה נתקע אנחנו תמיד פה בשבילך @MashovSupport 😄";
132 |
133 | $BOT = array('token' => $res['token'], 'webHookUrl' => "https://mashov.tg-bots.yehudae.net/NewVersion/TheNewBot.php?id=".$res['id'], 'debug' => false, 'MAIN' => true);
134 |
135 | $_GET['id'] = $res['id'];
136 | $update = null;
137 | include('TheNewBot.php');
138 |
139 | $bot->createBot($userId, $userName);
140 | if($bot->getCreatorBlocked()){
141 | $text = "עדכון קטן,
142 | לצערינו נחסמת⛔️ במערכת משוב עקב דיווחים רבים של משתמשים👥 בנוגע להתחזות ופישינג🐠.
143 |
144 | חושב שחלה טעות? ניתן לפנות ל-@MashovSupport ונבדוק את הסיפור.
145 | ⚠️ הודעה חשובה: אנחנו לא מטפלים בפניות לא מכובדות ופניות דורשות ‼️.
146 |
147 | כל טוב.";
148 | deleteMessage($userId, $resMessage['result']['message_id']);
149 | sendMessage($userId, $text, "html");
150 | }
151 | die();
152 | }
153 | else sendMessage($userId, "לא הצלחתי להבין מה אתה רוצה..", "html");
154 | }
155 | sendMessage($userId, "👋🏼 היי, ברוכים הבאים למערכת משוב😎
156 |
157 | 🤖 רובוט זה נועד בשביל לאפשר למשתמשים ליצור איתך קשר גם כשהם במצב ספאם, ולא יכולים לשלוח הודעות בצ'אט פרטי.
158 |
159 | 📩 על מנת ליצור רובוט משוב משלך, שלח לי בבקשה את ה[טוקן](http://t.me/help_Fatherbot?start=ODUyNjYyMjk1IDE3) שקיבלת מ[בוט פאזר](http://t.me/BotFather).
160 |
161 | ⛔️️ הודעה חשובה!! חל איסור מוחלט להשתמש במערכת המשוב לדברים שאינם חוקיים!! ⛔
162 |
163 | 👤 לכל בעיה/תקלה/הערה/הארה ניתן לפנות לתמיכה @MashovSupport");
--------------------------------------------------------------------------------
/MashovClass.php:
--------------------------------------------------------------------------------
1 | logging($botInfo, false, "BotInfoOutput: Success!", true);
22 | if($botInfo['ok'] == true && $botInfo['result']['is_bot'] == true){
23 | $this->BotToken = $token;
24 | $this->Debug = $Debug;
25 | $this->BotId = $botInfo['result']['id'];
26 | $this->BotName = $botInfo['result']['first_name'];
27 | $this->BotUserName = $botInfo['result']['username'];
28 | $this->DBPerfix = $this->BotId."__";
29 |
30 | $this->DB("init");
31 | return true;
32 | }
33 | else return false;
34 | }
35 |
36 | public function __destruct(){
37 | if(isset($this->DBConn)){
38 | $this->DBConn->close();
39 | }
40 | }
41 |
42 |
43 | protected function DB($mode = "init", $q = null, ...$params){
44 | if($mode == "init" || !isset($this->DBConn)){
45 | $this->DBConn = new mysqli(DB['host'], DB['username'], DB['password'], DB['dbname']);
46 | mysqli_set_charset($this->DBConn, "utf8mb4");
47 | }
48 | }
49 |
50 | public function userExist($id){
51 | $res = $this->DBConn->query("select * from `".$this->DBPerfix."users` WHERE `tg_id` = ".$id.";");
52 |
53 | return $res->num_rows > 0 ? true : false;
54 | }
55 |
56 | public function SaveID($id, $name){
57 | if(!$this->userExist($id)){
58 | $this->DBConn->query("INSERT INTO `".$this->DBPerfix."users`
59 | (`id`, `tg_id`, `name`, `admin`, `blocked`, `tg_block`) VALUES
60 | (NULL, '".$id."', '".$this->DBConn->real_escape_string($name)."', 0, 0, 0)");
61 | }
62 | }
63 |
64 | //Setters && Getters
65 | public function getBotID(){
66 | return $this->BotId;
67 | }
68 | public function getBotUserName(){
69 | return $this->BotUserName;
70 | }
71 | public function getBotName(){
72 | return $this->BotName;
73 | }
74 | public function getBotToken(){
75 | return $this->BotToken;
76 | }
77 |
78 |
79 | //Debug Mode
80 | public function GetDebug(){
81 | return $this->Debug;
82 | }
83 | public function SetDebug($val){
84 | $this->Debug = $val;
85 | }
86 | //WebHook
87 | public function GetWebHook(){
88 | return $this->webHook;
89 | }
90 | public function SetWebHook($val){
91 | $this->webHook = $val;
92 | return $this->Request('setwebhook', array( "url" => $val))['ok'];
93 | }
94 | public function DetWebHook(){
95 | $this->webHook = NULL;
96 | return $this->Request('setwebhook', array("url"))['ok'];
97 | }
98 | //Updates - BETA!
99 | /*public function SetUpdate($update){
100 | $this->Update = $update;
101 | if($this->Debug)
102 | $this->logging($update, false, "Update input:", true);
103 | }
104 | public function GetUpdate(){
105 | return $this->Update;
106 | }*/
107 | //WebPagePreview Mode
108 | public function GetWebPagePreview(){
109 | return $this->webPagePreview;
110 | }
111 | public function SetWebPagePreview($val){
112 | $this->webPagePreview = $val;
113 | }
114 | //Notification Mode
115 | public function GetNotification(){
116 | return $this->Notification;
117 | }
118 | public function SetNotification($val){
119 | $this->Notification = $val;
120 | }
121 | //ParseMode Mode
122 | public function GetParseMode(){
123 | return $this->ParseMode;
124 | }
125 | public function SetParseMode($val){
126 | if($val == null || "markdown" == strtolower($val) || "html" == strtolower($val))
127 | $this->ParseMode = $val;
128 | }
129 |
130 | //SendRequest
131 | protected function Request($method, $data =[] ==null){
132 | $BaseUrl = "https://api.telegram.org/bot".$this->BotToken."/".$method;
133 |
134 | $ch = curl_init();
135 | curl_setopt($ch, CURLOPT_URL, $BaseUrl);
136 | curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
137 | curl_setopt($ch ,CURLOPT_POSTFIELDS, $data);
138 |
139 | $res = curl_exec($ch);
140 |
141 | if(curl_error($ch)){
142 | if($this->GetDebug())
143 | $this->logging(curl_error($ch), "Curl: ".$method, false, false, $data);
144 | curl_close($ch);
145 | }else{
146 | curl_close($ch);
147 | $res = json_decode($res, true);
148 | if($this->GetDebug())
149 | $this->logging($res, "Curl: ".$method, true, true, $data);
150 | return $res;
151 | }
152 | }
153 |
154 | //Logging
155 | public function logging($data, $method = null, $success = false, $array = false, $helpArgs = null){
156 | $tmp = ($this->beautifi ? JSON_PRETTY_PRINT : null ) | JSON_UNESCAPED_UNICODE;
157 | if(!$array)
158 | $data = array("data" => $data);
159 |
160 | $data['added_by_log']['helpArgs'] = $helpArgs;
161 | $data['added_by_log']['date'] = date(DATE_RFC850);
162 | $data['added_by_log']['botUserName'] = $this->BotUserName;
163 | $data['added_by_log']['success'] = ($success ? "Success!" : "Error");
164 | $data['added_by_log']['method'] = $method;
165 |
166 | $data = json_encode($data, $tmp);
167 | file_put_contents($this->BotUserName." - log.log", $data.",\n", FILE_APPEND | LOCK_EX);
168 | }
169 |
170 |
171 | //Methods
172 | public function sendMessage($id, $text, $replyMarkup = null, $replyMessage = null){
173 | $data["chat_id"] = $id;
174 | $data["text"] = $text;
175 | $data["parse_mode"] = $this->ParseMode;
176 | $data["disable_web_page_preview"] = $this->webPagePreview;
177 | $data["disable_notification"] = $this->Notification;
178 | $data["reply_to_message_id"] = $replyMessage;
179 | $data["reply_markup"] = $replyMarkup;
180 | return $this->Request("sendMessage", $data);
181 | }
182 | public function forwardMessage($id, $fromChatId, $messageId){
183 | $data["chat_id"] = $id;
184 | $data["from_chat_id"] = $fromChatId;
185 | $data["disable_notification"] = $this->Notification;
186 | $data["message_id"] = $messageId;
187 | return $this->Request("forwardMessage", $data);
188 | }
189 | public function sendPhoto($id, $photo, $caption = null, $replyMessage = null, $replyMarkup = null){
190 | $data["chat_id"] = $id;
191 | $data["photo"] = $photo;
192 | $data["caption"] = $caption;
193 | $data["disable_notification"] = $this->Notification;
194 | $data["reply_to_message_id"] = $replyMessage;
195 | $data["reply_markup"] = $replyMarkup;
196 | return $this->Request("sendPhoto", $data);
197 | }
198 | public function sendAudio($id, $audio, $duration = null, $performer = null, $title = null, $replyMessage = null, $replyMarkup = null){
199 | $data["chat_id"] = $id;
200 | $data["audio"] = $audio;
201 | $data["duration"] = $duration;
202 | $data["performer"] = $performer;
203 | $data["title"] = $title;
204 | $data["disable_notification"] = $this->Notification;
205 | $data["reply_to_message_id"] = $replyMessage;
206 | $data["reply_markup"] = $replyMarkup;
207 | return $this->Request("sendAudio", $data);
208 | }
209 | public function sendDocument($id, $document, $caption = null, $replyMessage = null, $replyMarkup = null){
210 | $data["chat_id"] = $id;
211 | $data["document"] = $document;
212 | $data["caption"] = $caption;
213 | $data["disable_notification"] = $this->Notification;
214 | $data["reply_to_message_id"] = $replyMessage;
215 | $data["reply_markup"] = $replyMarkup;
216 | return $this->Request("sendDocument", $data);
217 | }
218 | public function sendSticker($id, $sticker, $replyMessage = null, $replyMarkup = null){
219 | $data["chat_id"] = $id;
220 | $data["sticker"] = $sticker;
221 | $data["disable_notification"] = $this->Notification;
222 | $data["reply_to_message_id"] = $replyMessage;
223 | $data["reply_markup"] = $replyMarkup;
224 | return $this->Request("sendSticker", $data);
225 | }
226 | public function sendVideo($id, $video, $duration = null, $width = null, $height = null, $caption = null, $replyMessage = null, $replyMarkup = null){
227 | $data["chat_id"] = $id;
228 | $data["video"] = $video;
229 | $data["duration"] = $duration;
230 | $data["width"] = $width;
231 | $data["height"] = $height;
232 | $data["caption"] = $caption;
233 | $data["disable_notification"] = $this->Notification;
234 | $data["reply_to_message_id"] = $replyMessage;
235 | $data["reply_markup"] = $replyMarkup;
236 | return $this->Request("sendVideo", $data);
237 | }
238 | public function sendVoice($id, $voice, $duration = null, $replyMessage = null, $replyMarkup = null){
239 | $data["chat_id"] = $id;
240 | $data["voice"] = $voice;
241 | $data["duration"] = $duration;
242 | $data["disable_notification"] = $this->Notification;
243 | $data["reply_to_message_id"] = $replyMessage;
244 | $data["reply_markup"] = $replyMarkup;
245 | return $this->Request("sendVoice", $data);
246 | }
247 | public function sendVideoNote($id, $videoNote, $duration = null, $length = null, $thumb = null, $replyMessage = null, $replyMarkup = null){
248 | $data["chat_id"] = $id;
249 | $data["video_note"] = $videoNote;
250 | $data["duration"] = $duration;
251 | $data["length"] = $duration;
252 | $data['thumb'] = $thumb;
253 | $data["disable_notification"] = $this->Notification;
254 | $data["reply_to_message_id"] = $replyMessage;
255 | $data["reply_markup"] = $replyMarkup;
256 | return $this->Request("sendVoice", $data);
257 | }
258 | public function sendLocation($id, $latitude, $longitude, $replyMessage = null, $replyMarkup = null){
259 | $data["chat_id"] = $id;
260 | $data["latitude"] = $latitude;
261 | $data["longitude"] = $longitude;
262 | $data["disable_notification"] = $this->Notification;
263 | $data["reply_to_message_id"] = $replyMessage;
264 | $data["reply_markup"] = $replyMarkup;
265 | return $this->Request("sendLocation", $data);
266 | }
267 | public function sendVenue($id, $latitude, $longitude, $title, $address, $foursquare = null, $replyMessage = null, $replyMarkup = null){
268 | $data["chat_id"] = $id;
269 | $data["latitude"] = $latitude;
270 | $data["longitude"] = $longitude;
271 | $data["title"] = $title;
272 | $data["address"] = $address;
273 | $data["foursquare_id"] = $foursquare;
274 | $data["disable_notification"] = $this->Notification;
275 | $data["reply_to_message_id"] = $replyMessage;
276 | $data["reply_markup"] = $replyMarkup;
277 | return $this->Request("sendVenue", $data);
278 | }
279 | public function sendContact($id, $phoneNumber, $firstName, $lastName = null, $replyMessage = null, $replyMarkup = null){
280 | $data["chat_id"] = $id;
281 | $data["phone_number"] = $phoneNumber;
282 | $data["first_name"] = $firstName;
283 | $data["last_name"] = $lastName;
284 | $data["disable_notification"] = $this->Notification;
285 | $data["reply_to_message_id"] = $replyMessage;
286 | $data["reply_markup"] = $replyMarkup;
287 | return $this->Request("sendContact", $data);
288 | }
289 | public function sendChatAction($id, $action){
290 | if(!in_array($action, ["typing", "upload_photo", "record_video", "upload_video", "record_audio", "upload_audio", "upload_document", "find_location"]))
291 | return false;
292 | $data["chat_id"] = $id;
293 | $data["action"] = $action;
294 | return $this->Request("sendChatAction", $data);
295 | }
296 | public function getUserProfilePhotos($uId, $offset = null, $limit = null){
297 | $data["user_id"] = $uId;
298 | $data['offset'] = $offset;
299 | $data['limit'] = $limit;
300 | return $this->Request("getUserProfilePhotos", $data);
301 | }
302 | public function kickChatMember($id, $uId){
303 | $data["chat_id"] = $id;
304 | $data["user_id"] = $uId;
305 | return $this->Request("kickChatMember", $data);
306 | }
307 | public function unbanChatMember($id, $uId){
308 | $data["chat_id"] = $id;
309 | $data["user_id"] = $uId;
310 | return $this->Request("unbanChatMember", $data);
311 | }
312 | public function getFile($fileId){
313 | $data["file_id"] = $fileId;
314 | return $this->Request("getFile", $data);
315 | }
316 | public function leaveChat($id){
317 | $data["chat_id"] = $id;
318 | return $this->Request("leaveChat", $data);
319 | }
320 | public function getChat($id){
321 | $data["chat_id"] = $id;
322 | return $this->Request("getChat", $data);
323 | }
324 | public function getChatAdministrators($id){
325 | $data["chat_id"] = $id;
326 | return $this->Request("getChatAdministrators", $data);
327 | }
328 | public function getChatMembersCount($id){
329 | $data["chat_id"] = $id;
330 | return $this->Request("getChatMembersCount", $data);
331 | }
332 | public function getChatMember($id, $uId){
333 | $data["chat_id"] = $id;
334 | $data["user_id"] = $uId;
335 | return $this->Request("getChatMember", $data);
336 | }
337 | public function answerCallbackQuery($callback, $text = null, $alert = false){
338 | $data["callback_query_id"] = $callback;
339 | $data["text"] = $text;
340 | $data["show_alert"] = $alert;
341 | return $this->Request("answerCallbackQuery", $data);
342 | }
343 | public function editMessageText($id = null, $messageId = null, $inlineMessage = null, $text, $replyMarkup = null){
344 | $data["chat_id"] = $id;
345 | $data["message_id"] = $messageId;
346 | $data["inline_message_id"] = $inlineMessage;
347 | $data["text"] = $text;
348 | $data["parse_mode"] = $this->ParseMode;
349 | $data["disable_web_page_preview"] = $this->webPagePreview;
350 | $data["reply_markup"] = $replyMarkup;
351 | return $this->Request("editMessageText", $data);
352 | }
353 | public function editMessageCaption($id = null, $messageId = null, $inlineMessage = null, $caption = null, $replyMarkup = null){
354 | $data["chat_id"] = $id;
355 | $data["message_id"] = $messageId;
356 | $data["inline_message_id"] = $inlineMessage;
357 | $data["caption"] = $caption;
358 | $data["reply_markup"] = $replyMarkup;
359 | return $this->Request("editMessageCaption", $data);
360 | }
361 | public function editMessageMedia($id = null, $messageId = null, $inlineMessage = null, $media = null, $replyMarkup = null){
362 | $data["chat_id"] = $id;
363 | $data["message_id"] = $messageId;
364 | $data["inline_message_id"] = $inlineMessage;
365 | $data["media"] = $media;
366 | $data["reply_markup"] = $replyMarkup;
367 | return $this->Request("editMessageMedia", $data);
368 | }
369 | public function editMessageReplyMarkup($id = null, $messageId = null, $inlineMessage = null, $replyMarkup = null){
370 | $data["chat_id"] = $id;
371 | $data["message_id"] = $messageId;
372 | $data["inline_message_id"] = $inlineMessage;
373 | $data["reply_markup"] = $replyMarkup;
374 | return $this->Request("editMessageReplyMarkup", $data);
375 | }
376 | public function deleteMessage($id, $messageId){
377 | $data["chat_id"] = $id;
378 | $data["message_id"] = $messageId;
379 | return $this->Request("deleteMessage", $data);
380 | }
381 | public function answerInlineQuery($inlineMessage, $res, $cacheTime = null, $isPersonal = null, $nextOffset = null, $switchPmText = null, $switchPmParameter = null){
382 | $data["inline_query_id"] = $inlineMessage;
383 | $data["results"] = $res;
384 | $data["cache_time"] = $cacheTime;
385 | $data["is_personal"] = $isPersonal;
386 | $data["next_offset"] = $nextOffset;
387 | $data["switch_pm_text"] = $switchPmText;
388 | $data["switch_pm_parameter"] = $switchPmParameter;
389 | return $this->Request("answerInlineQuery", $data);
390 | }
391 | }
392 |
393 | class MashovBot extends Bot{
394 |
395 | protected $creatorBlocked = false;
396 | protected $botBlocked = false;
397 |
398 | public function __construct($token, $debug){
399 | parent::__construct($token, $debug);
400 | if(defined('BOT') && !isset(BOT['main']))
401 | $this->updateBlockedMode();
402 | }
403 | public function __destruct(){
404 | parent::__destruct();
405 | }
406 |
407 | private function updateBlockedMode(){
408 | if($this->creatorBlocked || $this->botBlocked) return true;
409 |
410 | $result = $this->DBConn->query("SELECT * FROM `blocks`");
411 |
412 | while ($row = $result->fetch_assoc()) {
413 | if($row['tg_auth'] == $this->getCreatorID() || $row['tg_auth'] == $this->getBotToken()){
414 | if($row['tg_auth'] == $this->getCreatorID())
415 | $this->creatorBlocked = true;
416 | elseif($row['tg_auth'] == $this->getBotToken())
417 | $this->botBlocked = true;
418 |
419 | return true;
420 | }
421 | }
422 | return false;
423 | }
424 | public function getBotBlocked(){
425 | return $this->botBlocked;
426 | }
427 | public function getCreatorBlocked(){
428 | return $this->creatorBlocked;
429 | }
430 |
431 | public function createBot($creatorId, $name){
432 | $this->DBConn->query("INSERT INTO `" . (DB['dbname'] ?? "botMashov") . "`.`BotsData` (`bot_id`, `token`, `username`, `creator`, `time`) VALUES ('".$this->BotId."', '".$this->BotToken."', '".$this->BotUserName."', '".$creatorId."', CURRENT_TIMESTAMP);");
433 |
434 | //$this->DBConn->query("DROP TABLE IF EXISTS `" . (DB['dbname'] ?? "botMashov") . "`.`".$this->DBPerfix."users`;");
435 | $this->DBConn->query("CREATE TABLE IF NOT EXISTS `" . (DB['dbname'] ?? "botMashov") . "`.`".$this->DBPerfix."users` (
436 | `id` INT NOT NULL AUTO_INCREMENT ,
437 | `tg_id` INT NOT NULL ,
438 | `name` TEXT NOT NULL ,
439 | `admin` BOOLEAN NOT NULL ,
440 | `blocked` BOOLEAN NOT NULL ,
441 | `tg_block` BOOLEAN NOT NULL ,
442 |
443 | PRIMARY KEY (`id`)) ENGINE = InnoDB;");
444 |
445 | //$this->DBConn->query("DROP TABLE IF EXISTS `" . (DB['dbname'] ?? "botMashov") . "`.`".$this->DBPerfix."message`;");
446 | $this->DBConn->query("CREATE TABLE IF NOT EXISTS `" . (DB['dbname'] ?? "botMashov") . "`.`".$this->DBPerfix."message` (
447 | `message_id` INT(100) NOT NULL ,
448 | `type` TEXT NOT NULL ,
449 | `value` JSON NOT NULL ,
450 | `chat_id` BIGINT NOT NULL ,
451 | `from_id` INT NOT NULL ,
452 | `to_id` JSON NOT NULL ,
453 | `is_edit` BOOLEAN NOT NULL ,
454 |
455 | PRIMARY KEY (`message_id`)) ENGINE = InnoDB;");
456 |
457 |
458 | $this->DBConn->query("DROP TABLE IF EXISTS `" . (DB['dbname'] ?? "botMashov") . "`.`".$this->DBPerfix."data`;");
459 | $this->DBConn->query("CREATE TABLE `" . (DB['dbname'] ?? "botMashov") . "`.`".$this->DBPerfix."data` (
460 | `name` VARCHAR(250) NOT NULL ,
461 | `value` TEXT NOT NULL ,
462 |
463 | PRIMARY KEY (`name`)) ENGINE = InnoDB;");
464 |
465 |
466 | $this->DBConn->query('INSERT INTO `' . (DB['dbname'] ?? "botMashov") . '`.`'.$this->DBPerfix.'data` (`name`, `value`)
467 | VALUES ("token", "'.$this->BotToken.'");');
468 | $this->DBConn->query('INSERT INTO `' . (DB['dbname'] ?? "botMashov") . '`.`'.$this->DBPerfix.'data` (`name`, `value`)
469 | VALUES ("Creator_id", '.$creatorId.');');
470 | $this->DBConn->query('INSERT INTO `' . (DB['dbname'] ?? "botMashov") . '`.`'.$this->DBPerfix.'data` (`name`, `value`)
471 | VALUES ("credit", "yes");');
472 | $this->DBConn->query('INSERT INTO `' . (DB['dbname'] ?? "botMashov") . '`.`'.$this->DBPerfix.'data` (`name`, `value`)
473 | VALUES ("group_id", "");');
474 | $this->DBConn->query('INSERT INTO `' . (DB['dbname'] ?? "botMashov") . '`.`'.$this->DBPerfix.'data` (`name`, `value`)
475 | VALUES ("StartMessage", "");');
476 |
477 | $this->setGroupID("");
478 | $this->setStartMessage("היי ! 👋🏼\nדרך רובוט זה תוכל להתכתב איתי. \nתוכל לשלוח טקסט / מדיה ואני אענה לך בהקדם האפשרי.");
479 |
480 | $this->SetWebHook("https://mashov.telegram-bots.yehudae.ga/NewVersion/TheNewBot.php?id=".$this->BotId);
481 |
482 | $this->SaveID($creatorId, $name);
483 | $this->setAdmin($creatorId, true);
484 | $this->updateBlockedMode();
485 | }
486 |
487 | public static function isBlockForwardMes($str, $entities){
488 | if($str == "⚠️משתמש זה הגדיר בהגדרות הפרטיות שלו שלא ניתן להעביר ממנו הודעות.\nבכדי לענות למשתמש זה אנא השב על ההודעה הזו." && $entities['offset'] == 0 && $entities['length'] == 1 && $entities['type'] == "text_mention" && preg_match('{[\d]}' ,$entities['user']['id'])){
489 | return $entities['user']['id'];
490 | }
491 | elseif(strpos($str, "⚠️הודעה זו הועברה מהמשתמש") == 0 && $entities['offset'] == 0 && $entities['length'] == 1 && $entities['type'] == "text_mention" && preg_match('{[\d]}' ,$entities['user']['id'])){
492 | return $entities['user']['id'];
493 | }
494 | elseif($str == "⚠️משתמש זה הגדיר בהגדרות הפרטיות שלו שלא ניתן להעביר ממנו הודעות.\nבכדי לענות למשתמש זה אנא השב על ההודעה הזו." && $entities['offset'] == 0 && $entities['length'] == 1 && $entities['type'] == "text_link" && strpos($entities['url'], "https://mashov.telegram-bots.yehudae.ga/HiddenSender?id=") === 0){
495 | return str_replace("https://mashov.telegram-bots.yehudae.ga/HiddenSender?id=", "", $entities['url']);
496 | }
497 | elseif(strpos($str, "⚠️הודעה זו הועברה מהמשתמש") == 0 && $entities['offset'] == 0 && $entities['length'] == 1 && $entities['type'] == "text_link" && strpos($entities['url'], "https://mashov.telegram-bots.yehudae.ga/HiddenSender?id=") === 0){
498 | return str_replace("https://mashov.telegram-bots.yehudae.ga/HiddenSender?id=", "", $entities['url']);
499 | }
500 | return false;
501 | }
502 |
503 | public function startMesCredit(){
504 | $results = $this->DBConn->query("SELECT `value` FROM `" . (DB['dbname'] ?? "botMashov") . "`.`".$this->DBPerfix."data` WHERE `name` = 'credit'");
505 | return $results->fetch_array()['value'];
506 | }
507 |
508 | public function setStartMessage($val){
509 | $this->DBConn->query('UPDATE `' . (DB['dbname'] ?? "botMashov") . '`.`'.$this->DBPerfix.'data` SET `value` = "'.$this->DBConn->real_escape_string($val).'"
510 | WHERE `name` = "StartMessage";');
511 | }
512 | public function getStartMessage(){
513 | $results = $this->DBConn->query("SELECT `value` FROM `" . (DB['dbname'] ?? "botMashov") . "`.`".$this->DBPerfix."data` WHERE `name` = 'StartMessage'");
514 | return $results->fetch_array()['value'];
515 | }
516 |
517 | public function setGroupID($val){
518 | $this->DBConn->query('UPDATE `' . (DB['dbname'] ?? "botMashov") . '`.`'.$this->DBPerfix.'data` SET `value` = "'.$this->DBConn->real_escape_string($val).'"
519 | WHERE `name` = "group_id";');
520 | }
521 | public function getGroupID(){
522 | $results = $this->DBConn->query("SELECT `value` FROM `" . (DB['dbname'] ?? "botMashov") . "`.`".$this->DBPerfix."data` WHERE `name` = 'group_id'");
523 | return $results->fetch_array()['value'];
524 | }
525 |
526 | public function getCreatorID(){
527 | $results = $this->DBConn->query("SELECT `value` FROM `" . (DB['dbname'] ?? "botMashov") . "`.`".$this->DBPerfix."data` WHERE `name` = 'Creator_id'");
528 | return $results->fetch_array()['value'];
529 | }
530 |
531 | public function SetUpdate($update, $messageId, $type, $value, $chatId = null, $fromID = null, $toID = null){
532 | $this->Update = $update;
533 | if($this->Debug)
534 | $this->logging($update, false, "Update input:", true);
535 |
536 | if($type == "edited"){
537 | $results = $this->DBConn->query("SELECT `type` FROM `" . (DB['dbname'] ?? "botMashov") . "`.`".$this->DBPerfix."message` WHERE `message_id` = '".$messageId."'");
538 | $type = $results->fetch_array()['type'];
539 |
540 | $value = array($type => $value);
541 | $this->DBConn->query("UPDATE `" . (DB['dbname'] ?? "botMashov") . "`.`".$this->DBPerfix."message` SET
542 | `value` = '".$this->DBConn->real_escape_string(json_encode($value))."', `is_edit` = 1
543 | WHERE `" . (DB['dbname'] ?? "botMashov") . "`.`".$this->DBPerfix."message`.`message_id` = '".$messageId."';");
544 | }
545 | else{
546 | /*if(isset($update['message']['text'])){
547 | $messageId = $update['message']['message_id'];
548 | $value = array("text" => $update['message']['text']);
549 | $chatId = $update['message']['chat']['id'];
550 | $fromID = $update['message']['from']['id'];
551 | //if(!$this->isAdmin($update['message']['from']['id']))
552 | $toID = $this->getAdminIDS();
553 | }*/
554 |
555 | $value = array($type => $value);
556 |
557 | $this->DBConn->query("INSERT INTO `" . (DB['dbname'] ?? "botMashov") . "`.`".$this->DBPerfix."message`
558 | (`message_id`, `type`, `value`, `chat_id`, `from_id`, `to_id`, `is_edit`) VALUES
559 | (".$messageId.", '".$type."', '".$this->DBConn->real_escape_string(json_encode($value))."', '".$chatId."', '".$fromID."', '".json_encode($toID)."', 0);");
560 | }
561 | }
562 |
563 | public function isAdmin($id){
564 | $results = $this->DBConn->query("SELECT `admin` FROM `" . (DB['dbname'] ?? "botMashov") . "`.`".$this->DBPerfix."users` WHERE `tg_id` = '".$id."'");
565 | return $results->fetch_array()['admin'];
566 | }
567 | public function setAdmin($id, $mode){
568 | $this->DBConn->query('UPDATE `' . (DB['dbname'] ?? "botMashov") . '`.`'.$this->DBPerfix.'users` SET `admin` = '.$mode.' WHERE `tg_id` = '.$id.';');
569 | }
570 | public function getAdminIDS(){
571 | $result = $this->DBConn->query("SELECT `tg_id` FROM `" . (DB['dbname'] ?? "botMashov") . "`.`".$this->DBPerfix."users` WHERE `admin` = 1");
572 | $admins = array();
573 | while ($row = $result->fetch_assoc()) {
574 | $admins[] = $row['tg_id'];
575 | }
576 |
577 | return $admins;
578 | }
579 |
580 | public function isBlocked($id){
581 | $results = $this->DBConn->query("SELECT `blocked` FROM `" . (DB['dbname'] ?? "botMashov") . "`.`".$this->DBPerfix."users` WHERE `tg_id` = '".$id."'");
582 | return $results->fetch_array()['blocked'];
583 | }
584 | public function blockUser($id, $mode){
585 | $this->DBConn->query('UPDATE `' . (DB['dbname'] ?? "botMashov") . '`.`'.$this->DBPerfix.'users` SET `blocked` = '.$mode.' WHERE `tg_id` = '.$id.';');
586 | }
587 | public function getBlockedIDS(){
588 | $result = $this->DBConn->query("SELECT `tg_id` FROM `" . (DB['dbname'] ?? "botMashov") . "`.`".$this->DBPerfix."users` WHERE `blocked` = 1");
589 | $blocks = array();
590 | while ($row = $result->fetch_assoc()) {
591 | $blocks[] = $row['tg_id'];
592 | }
593 |
594 | return $blocks;
595 | }
596 |
597 | public function getToIdByMessageId($messageId){
598 | $results = $this->DBConn->query("SELECT `to_id` FROM `" . (DB['dbname'] ?? "botMashov") . "`.`".$this->DBPerfix."message` WHERE `message_id` = '".$messageId."'");
599 | return json_decode($results->fetch_array()['to_id'], true);
600 | }
601 |
602 | public function isTgBlocked($id){
603 | $results = $this->DBConn->query("SELECT `tg_block` FROM `" . (DB['dbname'] ?? "botMashov") . "`.`".$this->DBPerfix."users` WHERE `tg_id` = '".$id."'");
604 | return $results->fetch_array()['tg_block'];
605 | }
606 | public function tgBlockUser($id, $mode){
607 | $this->DBConn->query('UPDATE `' . (DB['dbname'] ?? "botMashov") . '`.`'.$this->DBPerfix.'users` SET `tg_block` = '.$mode.' WHERE `tg_id` = '.$id.';');
608 | }
609 |
610 | public function sendUsersList($chatId){
611 | $result = $this->DBConn->query("SELECT * FROM `" . (DB['dbname'] ?? "botMashov") . "`.`".$this->DBPerfix."users`");
612 |
613 | $i = 1;
614 | $text = "רשימת משתמשים:\n";
615 |
616 | while ($row = $result->fetch_assoc()) {
617 | if($i % 51 == 0){
618 | $this->SetParseMode('html');
619 | $this->sendMessage($chatId, $text);
620 | $text = "המשך רשימת משתמשים:\n";
621 | }
622 |
623 | if($chatId == $row['tg_id']) continue;
624 |
625 | $linkId = "".$row['tg_id']."";
626 |
627 | $tmp = $i.". ".$linkId;
628 | if($row['admin'])
629 | $tmp .= " - (👮♂️)";
630 |
631 | if($row['blocked'])
632 | $tmp .= " - (⛔️)";
633 |
634 | if($row['tg_block'])
635 | $tmp .= " - (מחק את הרובוט)";
636 |
637 | $tmp .= "\n\n";
638 | $text .= $tmp;
639 |
640 | $i++;
641 | }
642 |
643 | if($i == 1 || $text == "רשימת משתמשים:\n"){
644 | $this->sendMessage($chatId, "אין משתמשים ברובוט חוץ ממך");
645 | }
646 | else{
647 | $this->SetParseMode('html');
648 | $this->sendMessage($chatId, $text);
649 | }
650 | }
651 | public function sendActiveUsersList($chatId){
652 | $result = $this->DBConn->query("SELECT * FROM `" . (DB['dbname'] ?? "botMashov") . "`.`".$this->DBPerfix."users` WHERE `blocked` != 1 AND `tg_block` != 1;");
653 |
654 | $i = 1;
655 | $text = "רשימת המשתמשים הפעילים:\n";
656 |
657 | while ($row = $result->fetch_assoc()) {
658 | if($i % 51 == 0){
659 | $this->SetParseMode('html');
660 | $this->sendMessage($chatId, $text);
661 | $text = "המשך רשימת המשתמשים הפעילים:\n";
662 | }
663 |
664 | if($chatId == $row['tg_id']) continue;
665 |
666 | $linkId = "".$row['tg_id']."";
667 |
668 | $tmp = $i.". ".$linkId;
669 | if($row['admin'])
670 | $tmp .= " - (👮♂️)";
671 |
672 | $tmp .= "\n\n";
673 | $text .= $tmp;
674 |
675 | $i++;
676 | }
677 |
678 | if($i == 1 || $text == "רשימת המשתמשים הפעילים:\n"){
679 | $this->sendMessage($chatId, "אין משתמשים ברובוט חוץ ממך");
680 | }
681 | else{
682 | $this->SetParseMode('html');
683 | $this->sendMessage($chatId, $text);
684 | }
685 | }
686 | public function sendCountsUser($chatId){
687 | $result = $this->DBConn->query("SELECT * FROM `" . (DB['dbname'] ?? "botMashov") . "`.`".$this->DBPerfix."users`");
688 |
689 | $counts = 0;
690 | $admins = 0;
691 | $blocks = 0;
692 | $tg_blocks = 0;
693 | $text = "נתונים על משתמשים:\n";
694 |
695 | while ($row = $result->fetch_assoc()) {
696 | if($row['admin'])
697 | $admins++;
698 | if($row['blocked'])
699 | $blocks++;
700 | if($row['tg_block'])
701 | $tg_blocks++;
702 |
703 | $counts++;
704 | }
705 |
706 | $text .= "סה\"כ משתמשים: ".$counts." \n";
707 | $text .= "מתוכם מנהלים: ".$admins." \n";
708 | $text .= "מתוכם חסומים: ".$blocks." \n";
709 | $text .= "מתוכם מחקו את הרובוט: ".$tg_blocks." \n";
710 |
711 | $this->sendMessage($chatId, $text);
712 | }
713 | public function sendAdminsList($chatId){
714 | $result = $this->DBConn->query("SELECT * FROM `" . (DB['dbname'] ?? "botMashov") . "`.`".$this->DBPerfix."users` WHERE `admin` = 1");
715 |
716 | $i = 1;
717 | $text = "רשימת מנהלים:\n";
718 |
719 | while ($row = $result->fetch_assoc()) {
720 | if($chatId == $row['tg_id']) continue;
721 | if($i % 51 == 0){
722 | $this->SetParseMode('html');
723 | $this->sendMessage($chatId, $text);
724 | $text = "המשך רשימת מנהלים\n";
725 | }
726 |
727 | $linkId = "".$row['tg_id']."";
728 |
729 | $tmp = $i.". ".$linkId;
730 |
731 | if($row['tg_block'])
732 | $tmp .= " - מחק את הרובוט";
733 |
734 | $tmp .= "\n\n";
735 | $text .= $tmp;
736 |
737 | $i++;
738 | }
739 | if($i == 1 || $text == "רשימת מנהלים:\n"){
740 | $this->sendMessage($chatId, "אתה המנהל היחיד :)");
741 | }
742 | else{
743 | $this->SetParseMode('html');
744 | $this->sendMessage($chatId, $text);
745 | }
746 | }
747 | public function sendBlockList($chatId){
748 | $result = $this->DBConn->query("SELECT * FROM `" . (DB['dbname'] ?? "botMashov") . "`.`".$this->DBPerfix."users` WHERE `blocked` = 1");
749 |
750 | $i = 1;
751 | $text = "רשימת חסומים:\n";
752 |
753 | while ($row = $result->fetch_assoc()) {
754 | if($i % 51 == 0){
755 | $this->SetParseMode('html');
756 | $this->sendMessage($chatId, $text);
757 | $text = "המשך רשימת חסומים:\n";
758 | }
759 |
760 | $linkId = "".$row['tg_id']."";
761 |
762 | $tmp = $i.". ".$linkId;
763 |
764 | if($row['tg_block'])
765 | $tmp .= " - מחק את הרובוט";
766 |
767 | $tmp .= "\n\n";
768 | $text .= $tmp;
769 |
770 | $i++;
771 | }
772 | if($i == 1){
773 | $this->sendMessage($chatId, "איזה כיף 😁 אף אחד לא חסום😎");
774 | }
775 | else{
776 | $this->SetParseMode('html');
777 | $this->sendMessage($chatId, $text);
778 | }
779 | }
780 |
781 | public function getUsersArray($blocks = null, $admins = null){
782 | $add = "";
783 | if($blocks === false){
784 | $add .= " AND `blocked` != '1'";
785 | }
786 | elseif($blocks === true){
787 | $add .= " AND `blocked` = '1'";
788 | }
789 | if($admins === false){
790 | $add .= " AND `admin` != '1'";
791 | }
792 | elseif($admins === true){
793 | $add .= " AND `admin` = '1'";
794 | }
795 | $result = $this->DBConn->query("SELECT `tg_id` FROM `" . (DB['dbname'] ?? "botMashov") . "`.`".$this->DBPerfix."users` WHERE `tg_block` = '0' {$add}");
796 | return $result->fetch_all();
797 | }
798 | }
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | GNU AFFERO GENERAL PUBLIC LICENSE
2 | Version 3, 19 November 2007
3 |
4 | Copyright (C) 2007 Free Software Foundation, Inc.
5 | Everyone is permitted to copy and distribute verbatim copies
6 | of this license document, but changing it is not allowed.
7 |
8 | Preamble
9 |
10 | The GNU Affero General Public License is a free, copyleft license for
11 | software and other kinds of works, specifically designed to ensure
12 | cooperation with the community in the case of network server software.
13 |
14 | The licenses for most software and other practical works are designed
15 | to take away your freedom to share and change the works. By contrast,
16 | our General Public Licenses are intended to guarantee your freedom to
17 | share and change all versions of a program--to make sure it remains free
18 | software for all its users.
19 |
20 | When we speak of free software, we are referring to freedom, not
21 | price. Our General Public Licenses are designed to make sure that you
22 | have the freedom to distribute copies of free software (and charge for
23 | them if you wish), that you receive source code or can get it if you
24 | want it, that you can change the software or use pieces of it in new
25 | free programs, and that you know you can do these things.
26 |
27 | Developers that use our General Public Licenses protect your rights
28 | with two steps: (1) assert copyright on the software, and (2) offer
29 | you this License which gives you legal permission to copy, distribute
30 | and/or modify the software.
31 |
32 | A secondary benefit of defending all users' freedom is that
33 | improvements made in alternate versions of the program, if they
34 | receive widespread use, become available for other developers to
35 | incorporate. Many developers of free software are heartened and
36 | encouraged by the resulting cooperation. However, in the case of
37 | software used on network servers, this result may fail to come about.
38 | The GNU General Public License permits making a modified version and
39 | letting the public access it on a server without ever releasing its
40 | source code to the public.
41 |
42 | The GNU Affero General Public License is designed specifically to
43 | ensure that, in such cases, the modified source code becomes available
44 | to the community. It requires the operator of a network server to
45 | provide the source code of the modified version running there to the
46 | users of that server. Therefore, public use of a modified version, on
47 | a publicly accessible server, gives the public access to the source
48 | code of the modified version.
49 |
50 | An older license, called the Affero General Public License and
51 | published by Affero, was designed to accomplish similar goals. This is
52 | a different license, not a version of the Affero GPL, but Affero has
53 | released a new version of the Affero GPL which permits relicensing under
54 | this license.
55 |
56 | The precise terms and conditions for copying, distribution and
57 | modification follow.
58 |
59 | TERMS AND CONDITIONS
60 |
61 | 0. Definitions.
62 |
63 | "This License" refers to version 3 of the GNU Affero General Public License.
64 |
65 | "Copyright" also means copyright-like laws that apply to other kinds of
66 | works, such as semiconductor masks.
67 |
68 | "The Program" refers to any copyrightable work licensed under this
69 | License. Each licensee is addressed as "you". "Licensees" and
70 | "recipients" may be individuals or organizations.
71 |
72 | To "modify" a work means to copy from or adapt all or part of the work
73 | in a fashion requiring copyright permission, other than the making of an
74 | exact copy. The resulting work is called a "modified version" of the
75 | earlier work or a work "based on" the earlier work.
76 |
77 | A "covered work" means either the unmodified Program or a work based
78 | on the Program.
79 |
80 | To "propagate" a work means to do anything with it that, without
81 | permission, would make you directly or secondarily liable for
82 | infringement under applicable copyright law, except executing it on a
83 | computer or modifying a private copy. Propagation includes copying,
84 | distribution (with or without modification), making available to the
85 | public, and in some countries other activities as well.
86 |
87 | To "convey" a work means any kind of propagation that enables other
88 | parties to make or receive copies. Mere interaction with a user through
89 | a computer network, with no transfer of a copy, is not conveying.
90 |
91 | An interactive user interface displays "Appropriate Legal Notices"
92 | to the extent that it includes a convenient and prominently visible
93 | feature that (1) displays an appropriate copyright notice, and (2)
94 | tells the user that there is no warranty for the work (except to the
95 | extent that warranties are provided), that licensees may convey the
96 | work under this License, and how to view a copy of this License. If
97 | the interface presents a list of user commands or options, such as a
98 | menu, a prominent item in the list meets this criterion.
99 |
100 | 1. Source Code.
101 |
102 | The "source code" for a work means the preferred form of the work
103 | for making modifications to it. "Object code" means any non-source
104 | form of a work.
105 |
106 | A "Standard Interface" means an interface that either is an official
107 | standard defined by a recognized standards body, or, in the case of
108 | interfaces specified for a particular programming language, one that
109 | is widely used among developers working in that language.
110 |
111 | The "System Libraries" of an executable work include anything, other
112 | than the work as a whole, that (a) is included in the normal form of
113 | packaging a Major Component, but which is not part of that Major
114 | Component, and (b) serves only to enable use of the work with that
115 | Major Component, or to implement a Standard Interface for which an
116 | implementation is available to the public in source code form. A
117 | "Major Component", in this context, means a major essential component
118 | (kernel, window system, and so on) of the specific operating system
119 | (if any) on which the executable work runs, or a compiler used to
120 | produce the work, or an object code interpreter used to run it.
121 |
122 | The "Corresponding Source" for a work in object code form means all
123 | the source code needed to generate, install, and (for an executable
124 | work) run the object code and to modify the work, including scripts to
125 | control those activities. However, it does not include the work's
126 | System Libraries, or general-purpose tools or generally available free
127 | programs which are used unmodified in performing those activities but
128 | which are not part of the work. For example, Corresponding Source
129 | includes interface definition files associated with source files for
130 | the work, and the source code for shared libraries and dynamically
131 | linked subprograms that the work is specifically designed to require,
132 | such as by intimate data communication or control flow between those
133 | subprograms and other parts of the work.
134 |
135 | The Corresponding Source need not include anything that users
136 | can regenerate automatically from other parts of the Corresponding
137 | Source.
138 |
139 | The Corresponding Source for a work in source code form is that
140 | same work.
141 |
142 | 2. Basic Permissions.
143 |
144 | All rights granted under this License are granted for the term of
145 | copyright on the Program, and are irrevocable provided the stated
146 | conditions are met. This License explicitly affirms your unlimited
147 | permission to run the unmodified Program. The output from running a
148 | covered work is covered by this License only if the output, given its
149 | content, constitutes a covered work. This License acknowledges your
150 | rights of fair use or other equivalent, as provided by copyright law.
151 |
152 | You may make, run and propagate covered works that you do not
153 | convey, without conditions so long as your license otherwise remains
154 | in force. You may convey covered works to others for the sole purpose
155 | of having them make modifications exclusively for you, or provide you
156 | with facilities for running those works, provided that you comply with
157 | the terms of this License in conveying all material for which you do
158 | not control copyright. Those thus making or running the covered works
159 | for you must do so exclusively on your behalf, under your direction
160 | and control, on terms that prohibit them from making any copies of
161 | your copyrighted material outside their relationship with you.
162 |
163 | Conveying under any other circumstances is permitted solely under
164 | the conditions stated below. Sublicensing is not allowed; section 10
165 | makes it unnecessary.
166 |
167 | 3. Protecting Users' Legal Rights From Anti-Circumvention Law.
168 |
169 | No covered work shall be deemed part of an effective technological
170 | measure under any applicable law fulfilling obligations under article
171 | 11 of the WIPO copyright treaty adopted on 20 December 1996, or
172 | similar laws prohibiting or restricting circumvention of such
173 | measures.
174 |
175 | When you convey a covered work, you waive any legal power to forbid
176 | circumvention of technological measures to the extent such circumvention
177 | is effected by exercising rights under this License with respect to
178 | the covered work, and you disclaim any intention to limit operation or
179 | modification of the work as a means of enforcing, against the work's
180 | users, your or third parties' legal rights to forbid circumvention of
181 | technological measures.
182 |
183 | 4. Conveying Verbatim Copies.
184 |
185 | You may convey verbatim copies of the Program's source code as you
186 | receive it, in any medium, provided that you conspicuously and
187 | appropriately publish on each copy an appropriate copyright notice;
188 | keep intact all notices stating that this License and any
189 | non-permissive terms added in accord with section 7 apply to the code;
190 | keep intact all notices of the absence of any warranty; and give all
191 | recipients a copy of this License along with the Program.
192 |
193 | You may charge any price or no price for each copy that you convey,
194 | and you may offer support or warranty protection for a fee.
195 |
196 | 5. Conveying Modified Source Versions.
197 |
198 | You may convey a work based on the Program, or the modifications to
199 | produce it from the Program, in the form of source code under the
200 | terms of section 4, provided that you also meet all of these conditions:
201 |
202 | a) The work must carry prominent notices stating that you modified
203 | it, and giving a relevant date.
204 |
205 | b) The work must carry prominent notices stating that it is
206 | released under this License and any conditions added under section
207 | 7. This requirement modifies the requirement in section 4 to
208 | "keep intact all notices".
209 |
210 | c) You must license the entire work, as a whole, under this
211 | License to anyone who comes into possession of a copy. This
212 | License will therefore apply, along with any applicable section 7
213 | additional terms, to the whole of the work, and all its parts,
214 | regardless of how they are packaged. This License gives no
215 | permission to license the work in any other way, but it does not
216 | invalidate such permission if you have separately received it.
217 |
218 | d) If the work has interactive user interfaces, each must display
219 | Appropriate Legal Notices; however, if the Program has interactive
220 | interfaces that do not display Appropriate Legal Notices, your
221 | work need not make them do so.
222 |
223 | A compilation of a covered work with other separate and independent
224 | works, which are not by their nature extensions of the covered work,
225 | and which are not combined with it such as to form a larger program,
226 | in or on a volume of a storage or distribution medium, is called an
227 | "aggregate" if the compilation and its resulting copyright are not
228 | used to limit the access or legal rights of the compilation's users
229 | beyond what the individual works permit. Inclusion of a covered work
230 | in an aggregate does not cause this License to apply to the other
231 | parts of the aggregate.
232 |
233 | 6. Conveying Non-Source Forms.
234 |
235 | You may convey a covered work in object code form under the terms
236 | of sections 4 and 5, provided that you also convey the
237 | machine-readable Corresponding Source under the terms of this License,
238 | in one of these ways:
239 |
240 | a) Convey the object code in, or embodied in, a physical product
241 | (including a physical distribution medium), accompanied by the
242 | Corresponding Source fixed on a durable physical medium
243 | customarily used for software interchange.
244 |
245 | b) Convey the object code in, or embodied in, a physical product
246 | (including a physical distribution medium), accompanied by a
247 | written offer, valid for at least three years and valid for as
248 | long as you offer spare parts or customer support for that product
249 | model, to give anyone who possesses the object code either (1) a
250 | copy of the Corresponding Source for all the software in the
251 | product that is covered by this License, on a durable physical
252 | medium customarily used for software interchange, for a price no
253 | more than your reasonable cost of physically performing this
254 | conveying of source, or (2) access to copy the
255 | Corresponding Source from a network server at no charge.
256 |
257 | c) Convey individual copies of the object code with a copy of the
258 | written offer to provide the Corresponding Source. This
259 | alternative is allowed only occasionally and noncommercially, and
260 | only if you received the object code with such an offer, in accord
261 | with subsection 6b.
262 |
263 | d) Convey the object code by offering access from a designated
264 | place (gratis or for a charge), and offer equivalent access to the
265 | Corresponding Source in the same way through the same place at no
266 | further charge. You need not require recipients to copy the
267 | Corresponding Source along with the object code. If the place to
268 | copy the object code is a network server, the Corresponding Source
269 | may be on a different server (operated by you or a third party)
270 | that supports equivalent copying facilities, provided you maintain
271 | clear directions next to the object code saying where to find the
272 | Corresponding Source. Regardless of what server hosts the
273 | Corresponding Source, you remain obligated to ensure that it is
274 | available for as long as needed to satisfy these requirements.
275 |
276 | e) Convey the object code using peer-to-peer transmission, provided
277 | you inform other peers where the object code and Corresponding
278 | Source of the work are being offered to the general public at no
279 | charge under subsection 6d.
280 |
281 | A separable portion of the object code, whose source code is excluded
282 | from the Corresponding Source as a System Library, need not be
283 | included in conveying the object code work.
284 |
285 | A "User Product" is either (1) a "consumer product", which means any
286 | tangible personal property which is normally used for personal, family,
287 | or household purposes, or (2) anything designed or sold for incorporation
288 | into a dwelling. In determining whether a product is a consumer product,
289 | doubtful cases shall be resolved in favor of coverage. For a particular
290 | product received by a particular user, "normally used" refers to a
291 | typical or common use of that class of product, regardless of the status
292 | of the particular user or of the way in which the particular user
293 | actually uses, or expects or is expected to use, the product. A product
294 | is a consumer product regardless of whether the product has substantial
295 | commercial, industrial or non-consumer uses, unless such uses represent
296 | the only significant mode of use of the product.
297 |
298 | "Installation Information" for a User Product means any methods,
299 | procedures, authorization keys, or other information required to install
300 | and execute modified versions of a covered work in that User Product from
301 | a modified version of its Corresponding Source. The information must
302 | suffice to ensure that the continued functioning of the modified object
303 | code is in no case prevented or interfered with solely because
304 | modification has been made.
305 |
306 | If you convey an object code work under this section in, or with, or
307 | specifically for use in, a User Product, and the conveying occurs as
308 | part of a transaction in which the right of possession and use of the
309 | User Product is transferred to the recipient in perpetuity or for a
310 | fixed term (regardless of how the transaction is characterized), the
311 | Corresponding Source conveyed under this section must be accompanied
312 | by the Installation Information. But this requirement does not apply
313 | if neither you nor any third party retains the ability to install
314 | modified object code on the User Product (for example, the work has
315 | been installed in ROM).
316 |
317 | The requirement to provide Installation Information does not include a
318 | requirement to continue to provide support service, warranty, or updates
319 | for a work that has been modified or installed by the recipient, or for
320 | the User Product in which it has been modified or installed. Access to a
321 | network may be denied when the modification itself materially and
322 | adversely affects the operation of the network or violates the rules and
323 | protocols for communication across the network.
324 |
325 | Corresponding Source conveyed, and Installation Information provided,
326 | in accord with this section must be in a format that is publicly
327 | documented (and with an implementation available to the public in
328 | source code form), and must require no special password or key for
329 | unpacking, reading or copying.
330 |
331 | 7. Additional Terms.
332 |
333 | "Additional permissions" are terms that supplement the terms of this
334 | License by making exceptions from one or more of its conditions.
335 | Additional permissions that are applicable to the entire Program shall
336 | be treated as though they were included in this License, to the extent
337 | that they are valid under applicable law. If additional permissions
338 | apply only to part of the Program, that part may be used separately
339 | under those permissions, but the entire Program remains governed by
340 | this License without regard to the additional permissions.
341 |
342 | When you convey a copy of a covered work, you may at your option
343 | remove any additional permissions from that copy, or from any part of
344 | it. (Additional permissions may be written to require their own
345 | removal in certain cases when you modify the work.) You may place
346 | additional permissions on material, added by you to a covered work,
347 | for which you have or can give appropriate copyright permission.
348 |
349 | Notwithstanding any other provision of this License, for material you
350 | add to a covered work, you may (if authorized by the copyright holders of
351 | that material) supplement the terms of this License with terms:
352 |
353 | a) Disclaiming warranty or limiting liability differently from the
354 | terms of sections 15 and 16 of this License; or
355 |
356 | b) Requiring preservation of specified reasonable legal notices or
357 | author attributions in that material or in the Appropriate Legal
358 | Notices displayed by works containing it; or
359 |
360 | c) Prohibiting misrepresentation of the origin of that material, or
361 | requiring that modified versions of such material be marked in
362 | reasonable ways as different from the original version; or
363 |
364 | d) Limiting the use for publicity purposes of names of licensors or
365 | authors of the material; or
366 |
367 | e) Declining to grant rights under trademark law for use of some
368 | trade names, trademarks, or service marks; or
369 |
370 | f) Requiring indemnification of licensors and authors of that
371 | material by anyone who conveys the material (or modified versions of
372 | it) with contractual assumptions of liability to the recipient, for
373 | any liability that these contractual assumptions directly impose on
374 | those licensors and authors.
375 |
376 | All other non-permissive additional terms are considered "further
377 | restrictions" within the meaning of section 10. If the Program as you
378 | received it, or any part of it, contains a notice stating that it is
379 | governed by this License along with a term that is a further
380 | restriction, you may remove that term. If a license document contains
381 | a further restriction but permits relicensing or conveying under this
382 | License, you may add to a covered work material governed by the terms
383 | of that license document, provided that the further restriction does
384 | not survive such relicensing or conveying.
385 |
386 | If you add terms to a covered work in accord with this section, you
387 | must place, in the relevant source files, a statement of the
388 | additional terms that apply to those files, or a notice indicating
389 | where to find the applicable terms.
390 |
391 | Additional terms, permissive or non-permissive, may be stated in the
392 | form of a separately written license, or stated as exceptions;
393 | the above requirements apply either way.
394 |
395 | 8. Termination.
396 |
397 | You may not propagate or modify a covered work except as expressly
398 | provided under this License. Any attempt otherwise to propagate or
399 | modify it is void, and will automatically terminate your rights under
400 | this License (including any patent licenses granted under the third
401 | paragraph of section 11).
402 |
403 | However, if you cease all violation of this License, then your
404 | license from a particular copyright holder is reinstated (a)
405 | provisionally, unless and until the copyright holder explicitly and
406 | finally terminates your license, and (b) permanently, if the copyright
407 | holder fails to notify you of the violation by some reasonable means
408 | prior to 60 days after the cessation.
409 |
410 | Moreover, your license from a particular copyright holder is
411 | reinstated permanently if the copyright holder notifies you of the
412 | violation by some reasonable means, this is the first time you have
413 | received notice of violation of this License (for any work) from that
414 | copyright holder, and you cure the violation prior to 30 days after
415 | your receipt of the notice.
416 |
417 | Termination of your rights under this section does not terminate the
418 | licenses of parties who have received copies or rights from you under
419 | this License. If your rights have been terminated and not permanently
420 | reinstated, you do not qualify to receive new licenses for the same
421 | material under section 10.
422 |
423 | 9. Acceptance Not Required for Having Copies.
424 |
425 | You are not required to accept this License in order to receive or
426 | run a copy of the Program. Ancillary propagation of a covered work
427 | occurring solely as a consequence of using peer-to-peer transmission
428 | to receive a copy likewise does not require acceptance. However,
429 | nothing other than this License grants you permission to propagate or
430 | modify any covered work. These actions infringe copyright if you do
431 | not accept this License. Therefore, by modifying or propagating a
432 | covered work, you indicate your acceptance of this License to do so.
433 |
434 | 10. Automatic Licensing of Downstream Recipients.
435 |
436 | Each time you convey a covered work, the recipient automatically
437 | receives a license from the original licensors, to run, modify and
438 | propagate that work, subject to this License. You are not responsible
439 | for enforcing compliance by third parties with this License.
440 |
441 | An "entity transaction" is a transaction transferring control of an
442 | organization, or substantially all assets of one, or subdividing an
443 | organization, or merging organizations. If propagation of a covered
444 | work results from an entity transaction, each party to that
445 | transaction who receives a copy of the work also receives whatever
446 | licenses to the work the party's predecessor in interest had or could
447 | give under the previous paragraph, plus a right to possession of the
448 | Corresponding Source of the work from the predecessor in interest, if
449 | the predecessor has it or can get it with reasonable efforts.
450 |
451 | You may not impose any further restrictions on the exercise of the
452 | rights granted or affirmed under this License. For example, you may
453 | not impose a license fee, royalty, or other charge for exercise of
454 | rights granted under this License, and you may not initiate litigation
455 | (including a cross-claim or counterclaim in a lawsuit) alleging that
456 | any patent claim is infringed by making, using, selling, offering for
457 | sale, or importing the Program or any portion of it.
458 |
459 | 11. Patents.
460 |
461 | A "contributor" is a copyright holder who authorizes use under this
462 | License of the Program or a work on which the Program is based. The
463 | work thus licensed is called the contributor's "contributor version".
464 |
465 | A contributor's "essential patent claims" are all patent claims
466 | owned or controlled by the contributor, whether already acquired or
467 | hereafter acquired, that would be infringed by some manner, permitted
468 | by this License, of making, using, or selling its contributor version,
469 | but do not include claims that would be infringed only as a
470 | consequence of further modification of the contributor version. For
471 | purposes of this definition, "control" includes the right to grant
472 | patent sublicenses in a manner consistent with the requirements of
473 | this License.
474 |
475 | Each contributor grants you a non-exclusive, worldwide, royalty-free
476 | patent license under the contributor's essential patent claims, to
477 | make, use, sell, offer for sale, import and otherwise run, modify and
478 | propagate the contents of its contributor version.
479 |
480 | In the following three paragraphs, a "patent license" is any express
481 | agreement or commitment, however denominated, not to enforce a patent
482 | (such as an express permission to practice a patent or covenant not to
483 | sue for patent infringement). To "grant" such a patent license to a
484 | party means to make such an agreement or commitment not to enforce a
485 | patent against the party.
486 |
487 | If you convey a covered work, knowingly relying on a patent license,
488 | and the Corresponding Source of the work is not available for anyone
489 | to copy, free of charge and under the terms of this License, through a
490 | publicly available network server or other readily accessible means,
491 | then you must either (1) cause the Corresponding Source to be so
492 | available, or (2) arrange to deprive yourself of the benefit of the
493 | patent license for this particular work, or (3) arrange, in a manner
494 | consistent with the requirements of this License, to extend the patent
495 | license to downstream recipients. "Knowingly relying" means you have
496 | actual knowledge that, but for the patent license, your conveying the
497 | covered work in a country, or your recipient's use of the covered work
498 | in a country, would infringe one or more identifiable patents in that
499 | country that you have reason to believe are valid.
500 |
501 | If, pursuant to or in connection with a single transaction or
502 | arrangement, you convey, or propagate by procuring conveyance of, a
503 | covered work, and grant a patent license to some of the parties
504 | receiving the covered work authorizing them to use, propagate, modify
505 | or convey a specific copy of the covered work, then the patent license
506 | you grant is automatically extended to all recipients of the covered
507 | work and works based on it.
508 |
509 | A patent license is "discriminatory" if it does not include within
510 | the scope of its coverage, prohibits the exercise of, or is
511 | conditioned on the non-exercise of one or more of the rights that are
512 | specifically granted under this License. You may not convey a covered
513 | work if you are a party to an arrangement with a third party that is
514 | in the business of distributing software, under which you make payment
515 | to the third party based on the extent of your activity of conveying
516 | the work, and under which the third party grants, to any of the
517 | parties who would receive the covered work from you, a discriminatory
518 | patent license (a) in connection with copies of the covered work
519 | conveyed by you (or copies made from those copies), or (b) primarily
520 | for and in connection with specific products or compilations that
521 | contain the covered work, unless you entered into that arrangement,
522 | or that patent license was granted, prior to 28 March 2007.
523 |
524 | Nothing in this License shall be construed as excluding or limiting
525 | any implied license or other defenses to infringement that may
526 | otherwise be available to you under applicable patent law.
527 |
528 | 12. No Surrender of Others' Freedom.
529 |
530 | If conditions are imposed on you (whether by court order, agreement or
531 | otherwise) that contradict the conditions of this License, they do not
532 | excuse you from the conditions of this License. If you cannot convey a
533 | covered work so as to satisfy simultaneously your obligations under this
534 | License and any other pertinent obligations, then as a consequence you may
535 | not convey it at all. For example, if you agree to terms that obligate you
536 | to collect a royalty for further conveying from those to whom you convey
537 | the Program, the only way you could satisfy both those terms and this
538 | License would be to refrain entirely from conveying the Program.
539 |
540 | 13. Remote Network Interaction; Use with the GNU General Public License.
541 |
542 | Notwithstanding any other provision of this License, if you modify the
543 | Program, your modified version must prominently offer all users
544 | interacting with it remotely through a computer network (if your version
545 | supports such interaction) an opportunity to receive the Corresponding
546 | Source of your version by providing access to the Corresponding Source
547 | from a network server at no charge, through some standard or customary
548 | means of facilitating copying of software. This Corresponding Source
549 | shall include the Corresponding Source for any work covered by version 3
550 | of the GNU General Public License that is incorporated pursuant to the
551 | following paragraph.
552 |
553 | Notwithstanding any other provision of this License, you have
554 | permission to link or combine any covered work with a work licensed
555 | under version 3 of the GNU General Public License into a single
556 | combined work, and to convey the resulting work. The terms of this
557 | License will continue to apply to the part which is the covered work,
558 | but the work with which it is combined will remain governed by version
559 | 3 of the GNU General Public License.
560 |
561 | 14. Revised Versions of this License.
562 |
563 | The Free Software Foundation may publish revised and/or new versions of
564 | the GNU Affero General Public License from time to time. Such new versions
565 | will be similar in spirit to the present version, but may differ in detail to
566 | address new problems or concerns.
567 |
568 | Each version is given a distinguishing version number. If the
569 | Program specifies that a certain numbered version of the GNU Affero General
570 | Public License "or any later version" applies to it, you have the
571 | option of following the terms and conditions either of that numbered
572 | version or of any later version published by the Free Software
573 | Foundation. If the Program does not specify a version number of the
574 | GNU Affero General Public License, you may choose any version ever published
575 | by the Free Software Foundation.
576 |
577 | If the Program specifies that a proxy can decide which future
578 | versions of the GNU Affero General Public License can be used, that proxy's
579 | public statement of acceptance of a version permanently authorizes you
580 | to choose that version for the Program.
581 |
582 | Later license versions may give you additional or different
583 | permissions. However, no additional obligations are imposed on any
584 | author or copyright holder as a result of your choosing to follow a
585 | later version.
586 |
587 | 15. Disclaimer of Warranty.
588 |
589 | THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
590 | APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
591 | HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
592 | OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
593 | THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
594 | PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
595 | IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
596 | ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
597 |
598 | 16. Limitation of Liability.
599 |
600 | IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
601 | WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
602 | THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
603 | GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
604 | USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
605 | DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
606 | PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
607 | EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
608 | SUCH DAMAGES.
609 |
610 | 17. Interpretation of Sections 15 and 16.
611 |
612 | If the disclaimer of warranty and limitation of liability provided
613 | above cannot be given local legal effect according to their terms,
614 | reviewing courts shall apply local law that most closely approximates
615 | an absolute waiver of all civil liability in connection with the
616 | Program, unless a warranty or assumption of liability accompanies a
617 | copy of the Program in return for a fee.
618 |
619 | END OF TERMS AND CONDITIONS
620 |
621 | How to Apply These Terms to Your New Programs
622 |
623 | If you develop a new program, and you want it to be of the greatest
624 | possible use to the public, the best way to achieve this is to make it
625 | free software which everyone can redistribute and change under these terms.
626 |
627 | To do so, attach the following notices to the program. It is safest
628 | to attach them to the start of each source file to most effectively
629 | state the exclusion of warranty; and each file should have at least
630 | the "copyright" line and a pointer to where the full notice is found.
631 |
632 |
633 | Copyright (C)
634 |
635 | This program is free software: you can redistribute it and/or modify
636 | it under the terms of the GNU Affero General Public License as published
637 | by the Free Software Foundation, either version 3 of the License, or
638 | (at your option) any later version.
639 |
640 | This program is distributed in the hope that it will be useful,
641 | but WITHOUT ANY WARRANTY; without even the implied warranty of
642 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
643 | GNU Affero General Public License for more details.
644 |
645 | You should have received a copy of the GNU Affero General Public License
646 | along with this program. If not, see .
647 |
648 | Also add information on how to contact you by electronic and paper mail.
649 |
650 | If your software can interact with users remotely through a computer
651 | network, you should also make sure that it provides a way for users to
652 | get its source. For example, if your program is a web application, its
653 | interface could display a "Source" link that leads users to an archive
654 | of the code. There are many ways you could offer source, and different
655 | solutions will be better for different programs; see section 13 for the
656 | specific requirements.
657 |
658 | You should also get your employer (if you work as a programmer) or school,
659 | if any, to sign a "copyright disclaimer" for the program, if necessary.
660 | For more information on this, and how to apply and follow the GNU AGPL, see
661 | .
662 |
--------------------------------------------------------------------------------
/TheNewBot.php:
--------------------------------------------------------------------------------
1 | 'localhost', 'username' => 'root', 'password' => '', 'dbname' => 'botMashov'));
3 |
4 | if(!isset($_GET['id']) || intval($_GET['id']) <= 0){
5 | http_response_code(403);
6 | die();
7 | }
8 |
9 | $tdb = new mysqli(DB['host'], DB['username'], DB['password'], DB['dbname']);
10 | if($tdb == false || empty($tdb) || $tdb->connect_error){
11 | http_response_code(500);
12 | die();
13 | }
14 | $res = $tdb->Query("SELECT `value` FROM `".$_GET['id']."__data` WHERE `name` = 'token'");
15 |
16 | if(isset($BOT) && isset($BOT['MAIN'])){
17 | define('BOT', array(
18 | 'token' => $BOT['token'],
19 | 'webHookUrl' => $BOT['webHookUrl'],
20 | 'debug' => $BOT['debug'],
21 | 'main' => true
22 | ));
23 | }
24 | elseif(!isset($res->num_rows) || $res->num_rows <= 0){
25 | http_response_code(403);
26 | $tdb->close();
27 | die();
28 | }
29 | else{
30 | define('BOT', array(
31 | 'token' => $res->fetch_array()['value'],
32 | 'webHookUrl' => "https://mashov.tg-bots.yehudae.net/TheNewBot.php?id=".$_GET['id'],
33 | 'debug' => false
34 | ));
35 | }
36 | $tdb->close();
37 |
38 | require_once('MashovClass.php');
39 | require_once('vars.php');
40 | require_once('lang.php');
41 | require_once('init.php');
42 |
43 | if(isset(BOT['main']))
44 | return;
45 |
46 | if(!isset($chatId) || empty($chatId))
47 | die('chatId not found');
48 |
49 |
50 | $GroupID = $bot->getGroupID();
51 |
52 | if($chatType != "private" && $GroupID != "Waiting" && $GroupID != $chatId){
53 | $bot->leaveChat($chatId);
54 | }
55 | elseif($chatType != "private" && $GroupID == "Waiting"){
56 | $bot->setGroupID($chatId);
57 | $bot->sendMessage($chatId, $lang['successGroup']);
58 | }
59 |
60 | elseif($bot->isAdmin($chatId) || $chatId == $GroupID){
61 | if(isset($update['message']['reply_to_message']['entities'][0]) && MashovBot::isBlockForwardMes($update['message']['reply_to_message']['text'], $update['message']['reply_to_message']['entities'][0])){
62 | $rfid = MashovBot::isBlockForwardMes($update['message']['reply_to_message']['text'], $update['message']['reply_to_message']['entities'][0]);
63 | $rtx = $lang['SystemMessage'];
64 | $linkId = "".$rfid."";
65 | }
66 |
67 | if($message == "/start"){
68 | if($bot->isTgBlocked($chatId)){
69 | $bot->tgBlockUser($chatId, 0);
70 | }
71 | $bot->sendMessage($chatId, $lang['startMes']);
72 | }
73 | elseif($message == "/help"){
74 | $bot->sendMessage($chatId, $lang['help']);
75 | }
76 | elseif($message == "/welcome"){
77 | $bot->sendMessage($chatId, $lang['welcome']);
78 | }
79 | elseif($message == "/admin"){
80 | $bot->sendMessage($chatId, $lang['admin']);
81 | }
82 | elseif($message == "/ban"){
83 | $bot->sendMessage($chatId, $lang['ban']);
84 | }
85 | elseif($message == "/users"){
86 | $bot->sendMessage($chatId, $lang['users']);
87 | }
88 | elseif($message == "/sendMessageToAllUSers"){
89 | $bot->sendMessage($chatId, $lang['sendMessageToAllUSers']);
90 | }
91 | elseif($message == "/group"){
92 | if($chatId == $bot->getCreatorID())
93 | $bot->sendMessage($chatId, $lang['group']);
94 | else
95 | $bot->sendMessage($chatId, $lang['groupError']);
96 | }
97 | elseif($message == "/sendFile"){
98 | $bot->sendMessage($chatId, $lang['sendFile']);
99 | }
100 | elseif($message == "/id"){
101 | $bot->SetParseMode("html");
102 | if(isset($rfid))
103 | $bot->sendMessage($chatId, 'האיידי של המשתמש הוא: '.$rfid.' (לחץ להעתקה)');
104 | else
105 | $bot->sendMessage($chatId, $lang['replyCommand'], null, $messageId);
106 | }
107 |
108 | elseif($message == $lang['block']){
109 | if(isset($rfid)){
110 | if($bot->isAdmin($rfid))
111 | $bot->sendMessage($chatId, $lang['errorBlockAdmin']);
112 | elseif($bot->isBlocked($rfid))
113 | $bot->sendMessage($chatId, $lang['userAlreadyBlocked']);
114 | else{
115 | $bot->blockUser($rfid, 1);
116 |
117 | $linkId = "".$rfid."";
118 | $bot->SetParseMode('html');
119 |
120 | $bot->sendMessage($chatId, "🚫 המשתמש ".$linkId." נחסם בהצלחה.");
121 |
122 | if(empty($GroupID)){
123 | $adminsArr = $bot->getAdminIDS();
124 | foreach ($adminsArr as $admin){
125 | if($admin == $chatId || $admin == $fromId) continue;
126 |
127 | $bot->sendMessage($admin, "🚫 המשתמש ".$linkId." נחסם בהצלחה ע\"י המנהל ".$chatLinkId);
128 | }
129 | }
130 | }
131 | }
132 | else
133 | $bot->sendMessage($chatId, $lang['replyCommand'], null, $messageId);
134 | }
135 | elseif($message == $lang['unblock']){
136 | if(isset($rfid)){
137 | if(!$bot->isBlocked($rfid))
138 | $bot->sendMessage($chatId, "שגיאה! המשתמש לא חסום...");
139 | else{
140 | $bot->blockUser($rfid, 0);
141 |
142 | $linkId = "".$rfid."";
143 | $bot->SetParseMode('html');
144 |
145 | $bot->sendMessage($chatId, "✅ חסימת המשתמש ".$linkId." בוטלה בהצלחה!");
146 | $bot->sendMessage($rfid, "✅ אתה כבר לא חסום ברובוט 😎");
147 | }
148 | }
149 | else
150 | $bot->sendMessage($chatId, $lang['replyCommand'], null, $messageId);
151 | }
152 | elseif($message == "רשימת חסומים"){
153 | $bot->sendBlockList($chatId);
154 | }
155 |
156 | elseif($message == "הפוך למנהל" || $message == "הגדר כמנהל"){
157 | if($chatId == $bot->getCreatorID() || $fromId == $bot->getCreatorID()){
158 | if(isset($rfid)){
159 | if($bot->isAdmin($rfid))
160 | $bot->sendMessage($chatId, "שגיאה! המשתמש כבר מנהל...");
161 | elseif($bot->isBlocked($rfid))
162 | $bot->sendMessage($chatId, "שגיאה! לא ניתן להפוך למנהל משתמש חסום...");
163 | else{
164 | $bot->setAdmin($rfid, 1);
165 |
166 | $linkId = "".$rfid."";
167 | $bot->SetParseMode('html');
168 |
169 | $bot->sendMessage($chatId, "👮♂️ המשתמש ".$linkId." מנהל עכשיו.");
170 | $bot->sendMessage($rfid, "👮♂️ אתה מנהל עכשיו 😎");
171 | }
172 | }
173 | else
174 | $bot->sendMessage($chatId, $lang['replyCommand'], null, $messageId);
175 | }
176 | else{
177 | $bot->sendMessage($chatId, "שגיאה! רק יוצר הבוט יכול להוסיף מנהלים...");
178 | }
179 | }
180 | elseif($message == "הסר מניהול" || $message == "ביטול ניהול"){
181 | if($chatId == $bot->getCreatorID() || $fromId == $bot->getCreatorID()){
182 | if(isset($rfid)){
183 | if(!$bot->isAdmin($rfid))
184 | $bot->sendMessage($chatId, "שגיאה! המשתמש לא מנהל...");
185 | else{
186 | $bot->setAdmin($rfid, 0);
187 |
188 | $linkId = "".$rfid."";
189 | $bot->SetParseMode('html');
190 |
191 | $bot->sendMessage($chatId, "😕 המשתמש ".$linkId." כבר לא מנהל ברובוט.");
192 | $bot->sendMessage($rfid, "😞 אתה כבר לא מנהל ברובוט");
193 | }
194 | }
195 | else
196 | $bot->sendMessage($chatId, $lang['replyCommand'], null, $messageId);
197 | }
198 | else{
199 | $bot->sendMessage($chatId, "שגיאה! רק יוצר הבוט יכול להסיר מנהלים...");
200 | }
201 | }
202 | elseif($message == "רשימת מנהלים"){
203 | $bot->sendAdminsList($chatId);
204 | }
205 |
206 | elseif($message == "רשימת משתמשים"){
207 | $bot->sendUsersList($chatId);
208 | }
209 |
210 | elseif($message == "רשימת משתמשים פעילים"){
211 | $bot->sendActiveUsersList($chatId);
212 | }
213 |
214 | elseif($message == "משתמשים במספרים"){
215 | $bot->sendCountsUser($chatId);
216 | }
217 |
218 | elseif($message == "הודעת פתיחה"){
219 | if($chatId == $bot->getCreatorID() || $fromId == $bot->getCreatorID()){
220 | //$kb = json_encode(array('force_reply' => true));
221 | $bot->sendMessage($chatId, " שלח את התוכן החדש להודעת הפתיחה בהשב על 'הודעת הפתיחה' ששלחת."."\n\n📍לידעתך, הודעת הפתיחה היא:\n\n".$bot->getStartMessage());
222 | }
223 | else
224 | $bot->sendMessage($chatId, "רק היוצר של הבוט יכול לשנות את ההודעת פתיחה ☹️");
225 | }
226 | elseif($rtx == "הודעת פתיחה"){
227 | if($chatId == $bot->getCreatorID() || $fromId == $bot->getCreatorID()){
228 | if(strlen($message) < 6000){
229 | $bot->setStartMessage($message);
230 | $bot->sendMessage($chatId, "הודעת הפתיחה הוגדרה ל:\n\n".$message, null, null);
231 | }
232 | else
233 | $bot->sendMessage($chatId, "הודעת הפתיחה ארוכה מידי... נסה לקצר אותה קצת");
234 | }
235 | else
236 | $bot->sendMessage($chatId, "רק היוצר של הבוט יכול לשנות את ההודעת פתיחה ☹️");
237 | }
238 |
239 | elseif($message == "קבוצה"){
240 | if($chatId == $bot->getCreatorID()){
241 | if(!empty($GroupID))
242 | $bot->sendMessage($chatId, "שגיאה! יש כבר קבוצה מוגדרת ...");
243 | else{
244 | $bot->setGroupID("Waiting");
245 | $keyboard = json_encode(array('inline_keyboard' => array(array(array('text' => 'להוספת הרובוט לקבוצה יש ללחוץ כאן ➕', 'url' => 'http://t.me/'.$bot->getBotUserName().'?startgroup=true')))));
246 | $bot->sendMessage($chatId, "הוסף עכשיו את הרובוט לקבוצה המבוקשת\n\nהערה: הבוט לא יעבוד עד שלא תסיים את התהליך!", $keyboard);
247 | }
248 | }
249 | else
250 | $bot->sendMessage($chatId, "רק היוצר של הבוט יכול לשנות את הגדרות הקבוצה ☹️");
251 | }
252 | elseif($message == "מחיקת קבוצה"){
253 | if($chatId == $bot->getCreatorID()){
254 | if(empty($GroupID))
255 | $bot->sendMessage($chatId, "שגיאה! אין קבוצה מוגדרת...");
256 | else{
257 | $bot->leaveChat($bot->getGroupID());
258 | $bot->setGroupID(null);
259 | $bot->sendMessage($chatId, "הקבוצה נמחקה בהצלחה 👌");
260 | }
261 | }
262 | else
263 | $bot->sendMessage($chatId, "רק היוצר של הבוט יכול לשנות את הגדרות הקבוצה ☹️");
264 | }
265 | elseif($message == "הודעת תפוצה"){
266 | if(true){
267 | $kb = json_encode(array('force_reply' => true));
268 | $bot->sendMessage($chatId, $lang['sendMessageToAllUsersStep1'], $kb);
269 | }
270 | else{
271 | $bot->sendMessage($chatId, $lang['creatorOnlySendMessageToAllUsers']);
272 | }
273 | }
274 | elseif($rtx == $lang['sendMessageToAllUsersStep1']){
275 | if(true){
276 | if($message == $lang['cancelHe'] || $message == $lang['cancelEn']){
277 | $bot->sendMessage($chatId, $lang['sendMessageToAllUsersCancel']);
278 | }
279 | else{
280 | $bot->sendMessage($chatId, $lang['sendMessageToAllUsersStart']);
281 |
282 | $count = 0;
283 | $newBlocks = 0;
284 | $users = $bot->getUsersArray(false);
285 | foreach($users as $user){
286 | $count++;
287 | $userId = $user[0];
288 |
289 | if(isset($message)){
290 | $tmp = $bot->sendMessage($userId, $message);
291 | $toIdsArr[$userId] = $tmp['result']['message_id'];
292 |
293 | $bot->SetUpdate($update, $messageId, "text", $message, $chatId, $fromId, $toIdsArr);
294 | }
295 | elseif(isset($phid)){
296 | $tmp = $bot->sendPhoto($userId, $phid, $cap);
297 | $toIdsArr[$userId] = $tmp['result']['message_id'];
298 |
299 | $update['message']['photo']['caption'] = $cap;
300 | $bot->SetUpdate($update, $messageId, 'photo', $update['message']['photo'], $chatId, $fromId, $toIdsArr);
301 | }
302 | elseif(isset($auid)){
303 | $tmp = $bot->sendAudio($userId, $auid);
304 | $toIdsArr[$userId] = $tmp['result']['message_id'];
305 |
306 | $bot->SetUpdate($update, $messageId, 'audio', $update['message']['audio'], $chatId, $fromId, $toIdsArr);
307 | }
308 | elseif(isset($did)){
309 | $tmp = $bot->sendDocument($userId, $did, $cap);
310 | $toIdsArr[$userId] = $tmp['result']['message_id'];
311 |
312 | $update['message']['document']['caption'] = $cap;
313 | $bot->SetUpdate($update, $messageId, 'document', $update['message']['document'], $chatId, $fromId, $toIdsArr);
314 | }
315 | elseif(isset($vidid)){
316 | $tmp = $bot->sendVideo($userId, $vidid, null, null, null, $cap);
317 | $toIdsArr[$userId] = $tmp['result']['message_id'];
318 |
319 | $update['message']['video']['caption'] = $cap;
320 | $bot->SetUpdate($update, $messageId, 'video', $update['message']['video'], $chatId, $fromId, $toIdsArr);
321 | }
322 | elseif(isset($void)){
323 | $tmp = $bot->sendVoice($userId, $void);
324 | $toIdsArr[$userId] = $tmp['result']['message_id'];
325 |
326 | $bot->SetUpdate($update, $messageId, 'voice', $update['message']['voice'], $chatId, $fromId, $toIdsArr);
327 | }
328 | elseif(isset($vnid)){
329 | $tmp = $bot->sendVideoNote($userId, $vnid);
330 | $toIdsArr[$userId] = $tmp['result']['message_id'];
331 |
332 | $bot->SetUpdate($update, $messageId, 'video_note', $update['message']['video_note'], $chatId, $fromId, $toIdsArr);
333 | }
334 | elseif(isset($conid)){
335 | $tmp = $bot->sendContact($userId, $conid, $conf, $conl);
336 | $toIdsArr[$userId] = $tmp['result']['message_id'];
337 |
338 | $bot->SetUpdate($update, $messageId, 'contact', $update['message']['contact'], $chatId, $fromId, $toIdsArr);
339 | }
340 | elseif(isset($locid1)){
341 | $tmp = $bot->sendLocation($userId, $locid1, $locid2);
342 | $toIdsArr[$userId] = $tmp['result']['message_id'];
343 |
344 | $bot->SetUpdate($update, $messageId, 'location', $update['message']['location'], $chatId, $fromId, $toIdsArr);
345 | }
346 | elseif(isset($sti)){
347 | $tmp = $bot->sendSticker($userId, $sti);
348 | $toIdsArr[$userId] = $tmp['result']['message_id'];
349 |
350 | $bot->SetUpdate($update, $messageId, 'sticker', $update['message']['sticker'], $chatId, $fromId, $toIdsArr);
351 | }
352 | elseif(isset($venTit)){
353 | $tmp = $bot->sendVenue($userId, $venLoc1, $venLoc2, $venTit, $venAdd);
354 | $toIdsArr[$userId] = $tmp['result']['message_id'];
355 |
356 | $bot->SetUpdate($update, $messageId, 'venue', $update['message']['venue'], $chatId, $fromId, $toIdsArr);
357 | }
358 | elseif(isset($poll)){
359 | $bot->sendMessage($chatId, "כרגע אי אפשר לשלוח סקרים דרך בוטים.", null, $messageId);
360 | $bot->SetUpdate($update, $messageId, 'poll', $update['message']['poll'], $chatId, $fromId, array());
361 | }
362 | if(!$tmp['ok']){
363 | if($tmp['error_code'] == "403"){
364 | if($tmp['description'] == "Forbidden: bot was blocked by the user"){
365 | $newBlocks++;
366 | $bot->tgBlockUser($userId, 1);
367 | }
368 | }
369 | }
370 | }
371 |
372 | $textDone = $lang['sendMessageToAllUsersDone'];
373 |
374 | $textDone = str_replace("{1}", $count, $textDone);
375 | $textDone = str_replace("{2}", $newBlocks, $textDone);
376 |
377 | $bot->sendMessage($chatId, $textDone);
378 | }
379 | }
380 | else{
381 | $bot->sendMessage($chatId, $lang['creatorOnlySendMessageToAllUsers']);
382 | }
383 | }
384 |
385 | elseif($isEdited && $rtmfid == $bot->getBotID()){
386 | $bot->sendMessage($chatId, "כרגע מנהלים לא יכולים לערוך הודעות.", null, $messageId);
387 | die();
388 | }
389 | elseif(isset($rfid)){
390 | $adminsArr = array();
391 | if(empty($GroupID))
392 | $adminsArr = $bot->getAdminIDS();
393 | $toIdsArr = array();
394 |
395 | $linkId = "".$rfid."";
396 |
397 | if(isset($message)){
398 | $tmp = $bot->sendMessage($rfid, $message);
399 | $toIdsArr[$rfid] = $tmp['result']['message_id'];
400 |
401 | $bot->SetParseMode('html');
402 | foreach ($adminsArr as $admin){
403 | if($admin == $chatId || $admin == $fromId) continue;
404 |
405 | $res = $bot->sendMessage($admin, "המנהל ".$chatLinkId." שלח למשתמש ".$linkId." את ההודעה הבאה: \n\n".$message);
406 | $toIdsArr[$admin] = $res['result']['message_id'];
407 | }
408 | $bot->SetUpdate($update, $messageId, "text", $message, $chatId, $fromId, $toIdsArr);
409 | }
410 | elseif(isset($phid)){
411 | $tmp = $bot->sendPhoto($rfid, $phid, $cap);
412 | $toIdsArr[$rfid] = $tmp['result']['message_id'];
413 |
414 | $bot->SetParseMode('html');
415 | foreach ($adminsArr as $admin){
416 | if($admin == $chatId || $admin == $fromId) continue;
417 |
418 | $res = $bot->sendPhoto($admin, $phid, "המנהל ".$chatLinkId." שלח למשתמש ".$linkId." את התמונה הזו\n\n".$cap);
419 | $toIdsArr[$admin] = $res['result']['message_id'];
420 | }
421 |
422 | $update['message']['photo']['caption'] = $cap;
423 | $bot->SetUpdate($update, $messageId, 'photo', $update['message']['photo'], $chatId, $fromId, $toIdsArr);
424 | }
425 | elseif(isset($auid)){
426 | $tmp = $bot->sendAudio($rfid, $auid);
427 | $toIdsArr[$rfid] = $tmp['result']['message_id'];
428 |
429 | $bot->SetParseMode('html');
430 | foreach ($adminsArr as $admin){
431 | if($admin == $chatId || $admin == $fromId) continue;
432 |
433 | $res = $bot->sendAudio($admin, $auid);
434 | $toIdsArr[$admin] = $res['result']['message_id'];
435 | $bot->sendMessage($admin, "המנהל ".$chatLinkId." שלח למשתמש ".$linkId." את הקובץ הזה", null, $res['result']['message_id']);
436 | }
437 | $bot->SetUpdate($update, $messageId, 'audio', $update['message']['audio'], $chatId, $fromId, $toIdsArr);
438 | }
439 | elseif(isset($did)){
440 | $tmp = $bot->sendDocument($rfid, $did, $cap);
441 | $toIdsArr[$rfid] = $tmp['result']['message_id'];
442 |
443 | $bot->SetParseMode('html');
444 | foreach ($adminsArr as $admin){
445 | if($admin == $chatId || $admin == $fromId) continue;
446 |
447 | $res = $bot->sendDocument($admin, $did, "המנהל ".$chatLinkId." שלח למשתמש ".$linkId." את הקובץ הזה\n\n".$cap);
448 | $toIdsArr[$admin] = $res['result']['message_id'];
449 | }
450 | $update['message']['document']['caption'] = $cap;
451 | $bot->SetUpdate($update, $messageId, 'document', $update['message']['document'], $chatId, $fromId, $toIdsArr);
452 | }
453 | elseif(isset($vidid)){
454 | $tmp = $bot->sendVideo($rfid, $vidid, null, null, null, $cap);
455 | $toIdsArr[$rfid] = $tmp['result']['message_id'];
456 |
457 | $bot->SetParseMode('html');
458 | foreach ($adminsArr as $admin){
459 | if($admin == $chatId || $admin == $fromId) continue;
460 |
461 | $res = $bot->sendVideo($admin, $vidid, null, null, null, "המנהל ".$chatLinkId." שלח למשתמש ".$linkId." את הסרטון הזה\n\n".$cap);
462 | $toIdsArr[$admin] = $res['result']['message_id'];
463 | }
464 |
465 | $update['message']['video']['caption'] = $cap;
466 | $bot->SetUpdate($update, $messageId, 'video', $update['message']['video'], $chatId, $fromId, $toIdsArr);
467 | }
468 | elseif(isset($void)){
469 | $tmp = $bot->sendVoice($rfid, $void);
470 | $toIdsArr[$rfid] = $tmp['result']['message_id'];
471 |
472 | $bot->SetParseMode('html');
473 | foreach ($adminsArr as $admin){
474 | if($admin == $chatId || $admin == $fromId) continue;
475 |
476 | $res = $bot->sendVoice($admin, $void);
477 | $toIdsArr[$admin] = $res['result']['message_id'];
478 | $bot->sendMessage($admin, "המנהל ".$chatLinkId." שלח למשתמש ".$linkId." את ההקלטה הזו", null, $res['result']['message_id']);
479 | }
480 | $bot->SetUpdate($update, $messageId, 'voice', $update['message']['voice'], $chatId, $fromId, $toIdsArr);
481 | }
482 | elseif(isset($vnid)){
483 | $tmp = $bot->sendVideoNote($rfid, $vnid);
484 | $toIdsArr[$rfid] = $tmp['result']['message_id'];
485 |
486 | $bot->SetParseMode('html');
487 | foreach ($adminsArr as $admin){
488 | if($admin == $chatId || $admin == $fromId) continue;
489 |
490 | $res = $bot->sendVideoNote($admin, $vnid);
491 | $toIdsArr[$admin] = $res['result']['message_id'];
492 | $bot->sendMessage($admin, "המנהל ".$chatLinkId." שלח למשתמש ".$linkId." את הסרטון העגול הזה", null, $res['result']['message_id']);
493 | }
494 | $bot->SetUpdate($update, $messageId, 'video_note', $update['message']['video_note'], $chatId, $fromId, $toIdsArr);
495 | }
496 | elseif(isset($conid)){
497 | $tmp = $bot->sendContact($rfid, $conid, $conf, $conl);
498 | $toIdsArr[$rfid] = $tmp['result']['message_id'];
499 |
500 | $bot->SetParseMode('html');
501 | foreach ($adminsArr as $admin){
502 | if($admin == $chatId || $admin == $fromId) continue;
503 |
504 | $res = $bot->sendContact($admin, $conid, $conf, $conl);
505 | $toIdsArr[$admin] = $res['result']['message_id'];
506 | $bot->sendMessage($admin, "המנהל ".$chatLinkId." שלח למשתמש ".$linkId." את איש קשר הזה", null, $res['result']['message_id']);
507 | }
508 | $bot->SetUpdate($update, $messageId, 'contact', $update['message']['contact'], $chatId, $fromId, $toIdsArr);
509 | }
510 | elseif(isset($locid1)){
511 | $tmp = $bot->sendLocation($rfid, $locid1, $locid2);
512 | $toIdsArr[$rfid] = $tmp['result']['message_id'];
513 |
514 | $bot->SetParseMode('html');
515 | foreach ($adminsArr as $admin){
516 | if($admin == $chatId || $admin == $fromId) continue;
517 |
518 | $res = $bot->sendLocation($admin, $locid1, $locid2);
519 | $toIdsArr[$admin] = $res['result']['message_id'];
520 | $bot->sendMessage($admin, "המנהל ".$chatLinkId." שלח למשתמש ".$linkId." את המיקום הזה", null, $res['result']['message_id']);
521 | }
522 | $bot->SetUpdate($update, $messageId, 'location', $update['message']['location'], $chatId, $fromId, $toIdsArr);
523 | }
524 | elseif(isset($sti)){
525 | $tmp = $bot->sendSticker($rfid, $sti);
526 | $toIdsArr[$rfid] = $tmp['result']['message_id'];
527 |
528 | $bot->SetParseMode('html');
529 | foreach ($adminsArr as $admin){
530 | if($admin == $chatId || $admin == $fromId) continue;
531 |
532 | $res = $bot->sendSticker($admin, $sti);
533 | $toIdsArr[$admin] = $res['result']['message_id'];
534 | $bot->sendMessage($admin, "המנהל ".$chatLinkId." שלח למשתמש ".$linkId." את המדבקה הזו", null, $res['result']['message_id']);
535 | }
536 | $bot->SetUpdate($update, $messageId, 'sticker', $update['message']['sticker'], $chatId, $fromId, $toIdsArr);
537 | }
538 | elseif(isset($venTit)){
539 | $tmp = $bot->sendVenue($rfid, $venLoc1, $venLoc2, $venTit, $venAdd);
540 | $toIdsArr[$rfid] = $tmp['result']['message_id'];
541 |
542 | $bot->SetParseMode('html');
543 | foreach ($adminsArr as $admin){
544 | if($admin == $chatId || $admin == $fromId) continue;
545 |
546 | $res = $bot->sendVenue($admin, $venLoc1, $venLoc2, $venTit, $venAdd);
547 | $toIdsArr[$admin] = $res['result']['message_id'];
548 | $bot->sendMessage($admin, "המנהל ".$chatLinkId." שלח למשתמש ".$linkId." את ההזמנה הזו", null, $res['result']['message_id']);
549 | }
550 | $bot->SetUpdate($update, $messageId, 'venue', $update['message']['venue'], $chatId, $fromId, $toIdsArr);
551 | }
552 | elseif(isset($poll)){
553 | $bot->sendMessage($chatId, "כרגע אי אפשר לשלוח סקרים דרך בוטים.", null, $messageId);
554 | $bot->SetUpdate($update, $messageId, 'poll', $update['message']['poll'], $chatId, $fromId, $toIdsArr);
555 | }
556 | else
557 | $res = $bot->sendMessage($chatId, "לא היה ניתן לשלוח את ההודעה...\nאנא פנה ל-@ContactMashovBot", null, $messageId);
558 | if(!$tmp['ok']){
559 | if($tmp['error_code'] == "403"){
560 | if($tmp['description'] == "Forbidden: bot was blocked by the user"){
561 | $bot->tgBlockUser($rfid, 1);
562 | $bot->sendMessage($chatId, "❌ ההודעה לא נשלחה למשתמש כי הוא מחק את הבוט!", null, $messageId);
563 | }
564 | elseif($tmp['description'] == "Forbidden: bot can't initiate conversation with a user")
565 | $bot->sendMessage($chatId, "❌ לא ניתן לשלוח הודעה למשתמש שאינו רשום בבוט!", null, $messageId);
566 | }
567 | else $bot->sendMessage($chatId, "❌ ההודעה לא נשלחה מסיבה לא ידועה \nאנא פנה ל-@ContactMashovBot", null, $messageId);
568 | }
569 | }
570 |
571 | elseif(!isset($BOT['MAIN']) && $chatType == "private"){
572 | $bot->sendMessage($chatId, "❌ שלח את הודעתך בהשב להודעת המשתמש.\n\nאו השב על ההודעה ID של משתמש רשום בבוט. (ניתן לקבל ID של משתמש באמצעות הגבה על הודעה שלו /id)", null, $messageId);
573 | }
574 | }
575 | else{
576 | if($GroupID == "Waiting"){
577 | $bot->sendMessage($chatId, "היוצר באמצע להגדיר כמה דברים בבוט כרגע. נסה שוב בעוד כמה דקות...");
578 | $bot->sendMessage($bot->getCreatorID(), "יותר מהר.. אנשים מנסים להכנס לבוט אבל נתקלים בשגיאה כי אתה לא מגדיר את הקבוצה...\n\nלביטול ההגדרה שלח: \"מחיקת קבוצה\"");
579 | die();
580 | }
581 | elseif($bot->isBlocked($chatId) || $bot->isBlocked($fromId)){
582 | $bot->sendMessage($chatId, "אתה חסום בבוט :(");
583 | die();
584 | }
585 | if($isEdited){
586 | $adminsArr = $bot->getToIdByMessageId($messageId);
587 |
588 | foreach ($adminsArr as $toID => $mesID){
589 | if(isset($phid)){
590 | $res = $bot->sendPhoto($toID, $phid, $editedText.$cap, $mesID);
591 | }
592 | elseif(isset($auid)){
593 | $res = $bot->sendAudio($toID, $auid, null, null, null, $mesID);
594 | }
595 | elseif(isset($did)){
596 | $res = $bot->sendDocument($toID, $did, $editedText.$cap, $mesID);
597 | }
598 | elseif(isset($vidid)){
599 | $res = $bot->sendVideo($toID, $vidid, null, null, null, $editedText.$cap, $mesID);
600 | }
601 | elseif(isset($message)){
602 | $res = $bot->sendMessage($toID, $editedText.$message, null, $mesID);
603 | }
604 | }
605 | }
606 |
607 |
608 | elseif(!empty($GroupID)){
609 | $toID = $GroupID;
610 |
611 | if(strpos($message, "/start") === 0){
612 | if($bot->isTgBlocked($chatId)){
613 | $bot->tgBlockUser($chatId, 0);
614 | }
615 |
616 | $startMes = $bot->getStartMessage();
617 | if($bot->startMesCredit() == "yes"){
618 | $startMes .= $lang['credit'];
619 | }
620 | $bot->SetParseMode("html");
621 | $res = $bot->sendMessage($chatId, $startMes);
622 | if(!$res['ok'] && strpos($res['description'], "Bad Request: can't parse entities:")){
623 | $bot->SetParseMode(null);
624 | $bot->sendMessage($chatId, $messageText);
625 | }
626 | }
627 | $res = $bot->forwardMessage($toID, $chatId, $messageId);
628 |
629 | if(!$res['ok'] && $res['description'] == "Forbidden: bot was kicked from the supergroup chat"){
630 | $bot->setGroupID(null);
631 | $bot->sendMessage($chatId, "היוצר של הבוט קצת מצחיקול והוא עשה שטות קטנה ולכן הוא לא קיבל את ההודעה הזו, תשלח אותה שוב בבקשה...");
632 | }
633 |
634 | $bot->SetParseMode("html");
635 | if((isset($res['result']['forward_from_chat']['username']) && $res['result']['forward_from_chat']['username'] == "HiddenSender") || isset($res['result']['forward_sender_name'])){
636 | if(isset($res['result']['message_id'])){
637 | $bot->sendMessage($toID, $hiddenUserLink.
638 | "⚠️משתמש זה הגדיר בהגדרות הפרטיות שלו שלא ניתן להעביר ממנו הודעות.\nבכדי לענות למשתמש זה אנא השב על ההודעה הזו."
639 | , null, $res['result']['message_id']);
640 | if($message == "/start")
641 | $bot->sendMessage($toID, "קישור למשתמש הנ\"ל: ".$chatLinkId.".\n(קישור זה לא ישלח כל פעם)", null, $res['result']['message_id']);
642 | }
643 | }
644 | elseif(isset($update['message']['forward_from']) && $update['message']['forward_from']['id'] != $chatId){
645 | if(isset($res['result']['message_id'])){
646 | $bot->sendMessage($toID, $hiddenUserLink.
647 | "⚠️הודעה זו הועברה מהמשתמש ".$chatLinkId.". בכדי לענות לו יש להשיב להודעה זו."
648 | , null, $res['result']['message_id']);
649 | if($message == "/start")
650 | $bot->sendMessage($toID, "קישור למשתמש הנ\"ל: ".$chatLinkId.".\n(קישור זה לא ישלח כל פעם)", null, $res['result']['message_id']);
651 | }
652 | }
653 | elseif(isset($update['message']['forward_from_chat']) && $update['message']['forward_from_chat']['id'] != $chatId){
654 | if(isset($res['result']['message_id'])){
655 | $bot->sendMessage($toID, $hiddenUserLink.
656 | "⚠️הודעה זו הועברה מהמשתמש ".$chatLinkId.". בכדי לענות לו יש להשיב להודעה זו."
657 | , null, $res['result']['message_id']);
658 | if($message == "/start")
659 | $bot->sendMessage($toID, "קישור למשתמש הנ\"ל: ".$chatLinkId.".\n(קישור זה לא ישלח כל פעם)", null, $res['result']['message_id']);
660 | }
661 | }
662 |
663 | $toIdsArr = array($toID => $res['result']['message_id']);
664 | }
665 | else{
666 | $adminsArr = $bot->getAdminIDS();
667 | $toIdsArr = array();
668 |
669 | if(strpos($message, "/start") === 0){
670 | if($bot->isTgBlocked($chatId)){
671 | $bot->tgBlockUser($chatId, 0);
672 | }
673 |
674 | $startMes = $bot->getStartMessage();
675 | if($bot->startMesCredit() == "yes"){
676 | $startMes .= $lang['credit'];
677 | }
678 | $bot->SetParseMode("html");
679 | $res = $bot->sendMessage($chatId, $startMes);
680 | if(!$res['ok'] && strpos($res['description'], "Bad Request: can't parse entities:")){
681 | $bot->SetParseMode(null);
682 | $bot->sendMessage($chatId, $messageText);
683 | }
684 | }
685 |
686 | foreach ($adminsArr as $admin){
687 | $res = $bot->forwardMessage($admin, $chatId, $messageId);
688 |
689 | $toIdsArr[$admin] = $res['result']['message_id'];
690 |
691 | $bot->SetParseMode("html");
692 | if((isset($res['result']['forward_from_chat']['username']) && $res['result']['forward_from_chat']['username'] == "HiddenSender") || isset($res['result']['forward_sender_name'])){
693 | if(isset($res['result']['message_id'])){
694 | $tmp = $bot->sendMessage($admin, $hiddenUserLink.
695 | "⚠️משתמש זה הגדיר בהגדרות הפרטיות שלו שלא ניתן להעביר ממנו הודעות.\nבכדי לענות למשתמש זה אנא השב על ההודעה הזו."
696 | , null, $res['result']['message_id']);
697 |
698 | $toIdsArr[$admin] = $tmp['result']['message_id'];
699 |
700 | if($message == "/start")
701 | $bot->sendMessage($admin, "קישור למשתמש הנ\"ל: ".$chatLinkId.".\n(קישור זה לא ישלח כל פעם)", null, $res['result']['message_id']);
702 | }
703 | }
704 | elseif(isset($update['message']['forward_from']) && $update['message']['forward_from']['id'] != $chatId){
705 | if(isset($res['result']['message_id'])){
706 | $bot->sendMessage($admin, $hiddenUserLink.
707 | "⚠️הודעה זו הועברה מהמשתמש ".$chatLinkId.". בכדי לענות לו יש להשיב להודעה זו."
708 | , null, $res['result']['message_id']);
709 | if($message == "/start")
710 | $bot->sendMessage($admin, "קישור למשתמש הנ\"ל: ".$chatLinkId.".\n(קישור זה לא ישלח כל פעם)", null, $res['result']['message_id']);
711 | }
712 | }
713 | elseif(isset($update['message']['forward_from_chat']) && $update['message']['forward_from_chat']['id'] != $chatId){
714 | if(isset($res['result']['message_id'])){
715 | $bot->sendMessage($admin, $hiddenUserLink.
716 | "⚠️הודעה זו הועברה מהמשתמש ".$chatLinkId.". בכדי לענות לו יש להשיב להודעה זו."
717 | , null, $res['result']['message_id']);
718 | if($message == "/start")
719 | $bot->sendMessage($admin, "קישור למשתמש הנ\"ל: ".$chatLinkId.".\n(קישור זה לא ישלח כל פעם)", null, $res['result']['message_id']);
720 | }
721 | }
722 | }
723 | }
724 |
725 |
726 | if($isEdited){
727 | if(isset($phid)){
728 | $update['edited_message']['photo']['caption'] = $cap;
729 | $bot->SetUpdate($update, $messageId, 'edited', $update['edited_message']['photo']);
730 | }
731 | elseif(isset($auid)){
732 | $update['edited_message']['audio']['caption'] = $cap;
733 | $bot->SetUpdate($update, $messageId, 'edited', $update['edited_message']['audio']);
734 | }
735 | elseif(isset($did)){
736 | $update['edited_message']['document']['caption'] = $cap;
737 | $bot->SetUpdate($update, $messageId, 'edited', $update['edited_message']['document']);
738 | }
739 | elseif(isset($vidid)){
740 | $update['edited_message']['video']['caption'] = $cap;
741 | $bot->SetUpdate($update, $messageId, 'edited', $update['edited_message']['video']);
742 | }
743 | elseif(isset($message)){
744 | $bot->SetUpdate($update, $messageId, "edited", $message);
745 | }
746 | }
747 | else{
748 | if(isset($phid)){
749 | $update['message']['photo']['caption'] = $cap;
750 | $bot->SetUpdate($update, $messageId, 'photo', $update['message']['photo'], $chatId, $fromId, $toIdsArr);
751 | }
752 | elseif(isset($auid)){
753 | $update['message']['audio']['caption'] = $cap;
754 | $bot->SetUpdate($update, $messageId, 'audio', $update['message']['audio'], $chatId, $fromId, $toIdsArr);
755 | }
756 | elseif(isset($did)){
757 | $update['message']['document']['caption'] = $cap;
758 | $bot->SetUpdate($update, $messageId, 'document', $update['message']['document'], $chatId, $fromId, $toIdsArr);
759 | }
760 | elseif(isset($vidid)){
761 | $update['message']['video']['caption'] = $cap;
762 | $bot->SetUpdate($update, $messageId, 'video', $update['message']['video'], $chatId, $fromId, $toIdsArr);
763 | }
764 | elseif(isset($void)){
765 | $bot->SetUpdate($update, $messageId, 'voice', $update['message']['voice'], $chatId, $fromId, $toIdsArr);
766 | }
767 | elseif(isset($vnid)){
768 | $bot->SetUpdate($update, $messageId, 'video_note', $update['message']['video_note'], $chatId, $fromId, $toIdsArr);
769 | }
770 | elseif(isset($conid)){
771 | $bot->SetUpdate($update, $messageId, 'contact', $update['message']['contact'], $chatId, $fromId, $toIdsArr);
772 | }
773 | elseif(isset($locid1)){
774 | $bot->SetUpdate($update, $messageId, 'location', $update['message']['location'], $chatId, $fromId, $toIdsArr);
775 | }
776 | elseif(isset($sti)){
777 | $bot->SetUpdate($update, $messageId, 'sticker', $update['message']['sticker'], $chatId, $fromId, $toIdsArr);
778 | }
779 | elseif(isset($venTit)){
780 | $bot->SetUpdate($update, $messageId, 'venue', $update['message']['venue'], $chatId, $fromId, $toIdsArr);
781 | }
782 | elseif(isset($poll)){
783 | $bot->SetUpdate($update, $messageId, 'poll', $update['message']['poll'], $chatId, $fromId, $toIdsArr);
784 | }
785 | elseif(isset($message)){
786 | $bot->SetUpdate($update, $messageId, "text", $message, $chatId, $fromId, $toIdsArr);
787 | }
788 | }
789 | }
790 |
791 |
--------------------------------------------------------------------------------