├── .gitignore ├── CONTRIBUTING.md ├── CREDITS ├── LICENSE.txt ├── README-simpleai.md ├── README-simplebot.md ├── README.md ├── clean.sh ├── data ├── README.md └── stemming │ ├── README.md │ ├── dictionary.csv │ ├── stopwords.txt │ ├── word-nonstandard.txt │ └── word-standard.txt ├── img └── format_01.png ├── lib ├── empty └── index.html └── source ├── example ├── NLP Test-Desktop │ ├── README.md │ ├── app.lfm │ ├── app.pas │ ├── clean.bat │ ├── lib │ │ └── empty │ ├── nlptester.ico │ ├── nlptester.lpi │ ├── nlptester.lpr │ └── nlptester.res └── webservice │ ├── README.md │ ├── public_html │ ├── .htaccess │ ├── config │ │ ├── .htaccess │ │ ├── config.json │ │ └── index.html │ ├── files │ │ ├── .htaccess │ │ ├── index.html │ │ └── nlp │ │ │ ├── ai-entities.txt │ │ │ ├── ai-intents.txt │ │ │ ├── ai-questions.txt │ │ │ ├── ai-response.txt │ │ │ └── index.html │ ├── modules │ │ └── index.html │ └── ztemp │ │ ├── .htaccess │ │ ├── cache │ │ └── index.html │ │ ├── index.html │ │ ├── logs │ │ └── index.html │ │ └── sessions │ │ └── index.html │ └── source │ └── nlp │ ├── build.sh │ ├── clean.bat │ ├── extra.cfg │ ├── lib │ └── empty │ ├── main.pas │ ├── nlp.lpi │ ├── nlp.lpr │ ├── nlp.res │ └── routes.pas ├── lib └── index.html └── package ├── clean.bat ├── clean.sh ├── extra.cfg ├── lib └── empty ├── simpleai_package.lpk ├── simpleai_package.pas ├── simplebot_package.lpk ├── simplebot_package.pas └── src ├── controller ├── carik_controller.pas ├── domainwhois_controller.pas ├── jadwalsholat_controller.pas ├── kamus_controller.pas └── movie_controller.pas ├── entities_lib.pas ├── intents_lib.pas ├── simpleai_controller.pas ├── simpleai_lib.pas ├── simpleairedis_controller.pas ├── simplebot_controller.pas └── suggestion_controller.pas /.gitignore: -------------------------------------------------------------------------------- 1 | @@ -0,0 +1,164 @@ 2 | +################# 3 | +## Eclipse 4 | +################# 5 | + 6 | +*.pydevproject 7 | +.project 8 | +.metadata 9 | +bin/ 10 | +tmp/ 11 | +*.tmp 12 | +*.bak 13 | +*.swp 14 | +*~.nib 15 | +local.properties 16 | +.classpath 17 | +.settings/ 18 | +.loadpath 19 | + 20 | +# External tool builders 21 | +.externalToolBuilders/ 22 | + 23 | +# Locally stored "Eclipse launch configurations" 24 | +*.launch 25 | + 26 | +# CDT-specific 27 | +.cproject 28 | + 29 | +# PDT-specific 30 | +.buildpath 31 | + 32 | + 33 | +################# 34 | +## Visual Studio 35 | +################# 36 | + 37 | +## Ignore Visual Studio temporary files, build results, and 38 | +## files generated by popular Visual Studio add-ons. 39 | + 40 | +# User-specific files 41 | +*.suo 42 | +*.user 43 | +*.sln.docstates 44 | + 45 | +# Build results 46 | +[Dd]ebug/ 47 | +[Rr]elease/ 48 | +*_i.c 49 | +*_p.c 50 | +*.ilk 51 | +*.meta 52 | +*.obj 53 | +*.pch 54 | +*.pdb 55 | +*.pgc 56 | +*.pgd 57 | +*.rsp 58 | +*.sbr 59 | +*.tlb 60 | +*.tli 61 | +*.tlh 62 | +*.tmp 63 | +*.vspscc 64 | +.builds 65 | +*.dotCover 66 | + 67 | +## TODO: If you have NuGet Package Restore enabled, uncomment this 68 | +#packages/ 69 | + 70 | +# Visual C++ cache files 71 | +ipch/ 72 | +*.aps 73 | +*.ncb 74 | +*.opensdf 75 | +*.sdf 76 | + 77 | +# Visual Studio profiler 78 | +*.psess 79 | +*.vsp 80 | + 81 | +# ReSharper is a .NET coding add-in 82 | +_ReSharper* 83 | + 84 | +# Installshield output folder 85 | +[Ee]xpress 86 | + 87 | +# DocProject is a documentation generator add-in 88 | +DocProject/buildhelp/ 89 | +DocProject/Help/*.HxT 90 | +DocProject/Help/*.HxC 91 | +DocProject/Help/*.hhc 92 | +DocProject/Help/*.hhk 93 | +DocProject/Help/*.hhp 94 | +DocProject/Help/Html2 95 | +DocProject/Help/html 96 | + 97 | +# Click-Once directory 98 | +publish 99 | + 100 | +# Others 101 | +[Bb]in 102 | +[Oo]bj 103 | +sql 104 | +TestResults 105 | +*.Cache 106 | +ClientBin 107 | +stylecop.* 108 | +~$* 109 | +*.dbmdl 110 | +Generated_Code #added for RIA/Silverlight projects 111 | + 112 | +# Backup & report files from converting an old project file to a newer 113 | +# Visual Studio version. Backup files are not needed, because we have git ;-) 114 | +_UpgradeReport_Files/ 115 | +Backup*/ 116 | +UpgradeLog*.XML 117 | + 118 | + 119 | + 120 | +############ 121 | +## Windows 122 | +############ 123 | + 124 | +# Windows image file caches 125 | +Thumbs.db 126 | + 127 | +# Folder config file 128 | +Desktop.ini 129 | + 130 | + 131 | +############# 132 | +## Python 133 | +############# 134 | + 135 | +*.py[co] 136 | + 137 | +# Packages 138 | +*.egg 139 | +*.egg-info 140 | +dist 141 | +build 142 | +eggs 143 | +parts 144 | +bin 145 | +var 146 | +sdist 147 | +develop-eggs 148 | +.installed.cfg 149 | + 150 | +# Installer logs 151 | +pip-log.txt 152 | + 153 | +# Unit test / coverage reports 154 | +.coverage 155 | +.tox 156 | + 157 | +#Translations 158 | +*.mo 159 | + 160 | +#Mr Developer 161 | +.mr.developer.cfg 162 | + 163 | +# Mac crap 164 | +.DS_Store 165 | + 166 | # Numerous always-ignore extensions 167 | *.diff 168 | *.err 169 | *.orig 170 | *.log 171 | *.rej 172 | *.swo 173 | *.swp 174 | *.zip 175 | *.vi 176 | *~ 177 | *.sass-cache 178 | 179 | # OS or Editor folders 180 | .DS_Store 181 | ._* 182 | Thumbs.db 183 | .cache 184 | .project 185 | .settings 186 | .tmproj 187 | *.esproj 188 | nbproject 189 | *.sublime-project 190 | *.sublime-workspace 191 | 192 | # Komodo 193 | *.komodoproject 194 | .komodotools 195 | 196 | # Folders to ignore 197 | .hg 198 | .svn 199 | .CVS 200 | .idea 201 | node_modules 202 | dist 203 | 204 | # lazarus 205 | *.compiled 206 | *.lps 207 | *.bak 208 | *.ppu 209 | *.o 210 | 211 | public_html/ztemp/cache/* 212 | public_html/ztemp/error_log/* 213 | public_html/ztemp/sessions/* 214 | 215 | *.ses 216 | *.log 217 | *.dll 218 | *.exe 219 | *.bin 220 | backup.bat 221 | backup.sh 222 | -------------------------------------------------------------------------------- /CONTRIBUTING.md: -------------------------------------------------------------------------------- 1 | Contributing 2 | ------------- 3 | 4 | Before you contribute code to SimpleAI, please make sure it conforms our coding standard. The easiest way to contribute is to work on a checkout of the repository, or your own fork. 5 | 6 | 7 | Pushing 8 | ------- 9 | 10 | Development is based on the git flow branching model (see http://nvie.com/posts/a-successful-git-branching-model/ ) 11 | If you fix a bug please push in hotfix branch. 12 | If you develop a new feature please create a new branch. 13 | 14 | Version 15 | ------- 16 | 17 | Version number: 0.#version.#hotfix 18 | 19 | Further code convention adopted 20 | ------------------------------- 21 | 22 | - Each method and class is documented with a docblock 23 | 24 | Example for a function or methods: 25 | 26 | ``` 27 | ``` 28 | 29 | - Each file is provided with the following header: 30 | 31 | 32 | ``` 33 | { 34 | This file is part of the SimpleAI package. 35 | (c) Luri Darmawan 36 | 37 | For the full copyright and license information, please view the LICENSE 38 | file that was distributed with this source code. 39 | } 40 | ``` 41 | -------------------------------------------------------------------------------- /CREDITS: -------------------------------------------------------------------------------- 1 | This is at least a partial credits-file of people that have contributed to the current project. 2 | It is sorted by name and formatted to allow easy grepping and beautification by scripts. 3 | The fields are: name (N), email (E), web-address (W) and description (D). 4 | 5 | Thanks, 6 | 7 | Luri Darmawan 8 | ---------- 9 | 10 | - maskofa 11 | 12 | many suggest, critic and others from: 13 | - Whatsapp Group PHP Indo Surabaya 14 | - Telegram Group Pascal Underware 15 | - Whatsapp Group Geek vs Gaek 16 | -------------------------------------------------------------------------------- /LICENSE.txt: -------------------------------------------------------------------------------- 1 | 2 | Hak Cipta dilindungi Allah SWT 3 | Copyright reserved Allah SWT 4 | -------------------------------------------------------------------------------- /README-simpleai.md: -------------------------------------------------------------------------------- 1 | # SimpleAI 2 | 3 | ## What is it? 4 | 5 | SimpleAI adalah _package code_ yang bisa digunakan untuk menerapkan AI (_Artificial Intelligence_) secara sederhana, khususnya untuk implementasi NLP (_Natural Language Processing_). 6 | 7 | SimpleAI ini dibangun dalam bahasa Pascal, khususnya dengan [freepascal](http://www.freepascal.org/). Untuk memudahkan dalam proses development, telah disediakan juga _package_ untuk digunakan di dalam IDE [Lazarus](http://www.lazarus-ide.org/) 8 | 9 | SimpleAI dibangun secara sederhana, data diambil dari *file* biasa, tanpa menggunakan RDBMS yang sudah ada. 10 | 11 | Untuk meningkatkan performat, telah disediakan juga fitur untuk koneksi ke [Redis](https://redis.io/). Untuk Production atau penggunaan trafik yang tinggi, disarankan untuk menggunakan Redis sebagai pilihan _data storage_-nya. 12 | 13 | 14 | ## Why use it? 15 | 16 | **Ringan Tanpa Beban** 17 | 18 | SimpleAI dibuat dengan sederhana, simple dan ringan. SimpleAI adalah _binary application_ sehingga diharapkan akan lebih cepat dan ringan. 19 | 20 | ## How to use it 21 | 22 | 23 | ### Requirements 24 | 25 | - Kesabaran dan Ketekunan 26 | - [Free Pascal](http://www.freepascal.org/) 27 | 28 | ### Instalation 29 | 30 | Jika menggunakan Lazarus, buka file "simpleai_package.lpk" dan install file tersebut. 31 | 32 | 33 | ### SimpleAI USAGE 34 | 35 | ```delphi 36 | SimpleAI := TSimpleAI.Create; 37 | SimpleAI.AddEntitiesFromFile( 'entities-pulsa.txt'); 38 | SimpleAI.AddEntitiesFromFile( 'entities-hotel.txt'); 39 | SimpleAI.AddEntitiesFromFile( 'entities.txt'); 40 | SimpleAI.AddIntentFromFile( 'intents-pulsa.txt'); 41 | SimpleAI.AddIntentFromFile( 'intents-hotel.txt'); 42 | SimpleAI.AddIntentFromFile( 'intents-danlainlain.txt'); 43 | SimpleAI.AddIntentFromFile( 'intents.txt'); 44 | SimpleAI.AddResponFromFile( 'response.txt'); 45 | 46 | . 47 | . 48 | . 49 | 50 | Text := 'hi apa kabar?'; 51 | 52 | if SimpleAI.Exec(Text) then 53 | begin 54 | 55 | // output dalam format text (result saja) 56 | ResponseString := SimpleAPI.SimpleAI.ResponseText; 57 | 58 | // output dalam json format 59 | json := SimpleAPI.SimpleAI.ResponseJson; 60 | 61 | // 62 | Action := SimpleAI.Action; 63 | IntentName := SimpleAI.IntentName; 64 | Params := SimpleAI.Parameters; 65 | 66 | // do something 67 | . 68 | . 69 | . 70 | 71 | end; 72 | ``` 73 | 74 | 75 | ### Format JSON Output 76 | 77 | ``` 78 | { 79 | "code": 0, 80 | "request": { 81 | "text": "" 82 | }, 83 | "response": { 84 | "intents": { 85 | "action": "", 86 | "name": "", 87 | "parameters": {} 88 | }, 89 | "text": [] 90 | } 91 | } 92 | ``` 93 | 94 | 95 | ## Documentation 96 | 97 | Take a look at the repo [Wiki](https://github.com/luridarmawan/SimpleAI/wiki) for further information and tutorials! 98 | Feel free to improve! 99 | 100 | ## Projects with this library 101 | 102 | Here's a list of projects that feats this library, feel free to add yours! 103 | 104 | - [SimpleBOT example](https://github.com/luridarmawan/SimpleBOT/) 105 | 106 | 107 | 108 | ## Troubleshooting 109 | 110 | If you like living on the edge, please report any bugs you find on the 111 | [SimpleAI issues](https://github.com/luridarmawan/SimpleAI/issues) page. 112 | 113 | ## Contributing 114 | 115 | See [CONTRIBUTING](CONTRIBUTING.md) for more information. 116 | 117 | ## License 118 | 119 | Please see the [LICENSE](LICENSE.txt) included in this repository, 120 | which this project is licensed under. 121 | 122 | ## Credits 123 | 124 | Credit list in [CREDITS](CREDITS) 125 | 126 | [Carik Bot](http://www.carik.id/) 127 | -------------------------------------------------------------------------------- /README-simplebot.md: -------------------------------------------------------------------------------- 1 | # SimpleBOT Package 2 | 3 | ## What is it? 4 | 5 | 6 | SimpleBOT merupakan salah satu contoh penggunaan NLP SimpleAI yang dipergunakan untuk membuat BOT. 7 | Memiliki fitur menjawab otomatis, dan belajar suatu definisi kata sederhana. 8 | Kecerdasan Bot ini tergantung dari data entities dan intent yang Anda miliki, serta logic handler yang Anda buat. 9 | 10 | Contoh penggunaan bot sederhana dengan SimpleBOT ini bisa anda coba dari situs [ai.fastplaz.com](http://ai.fastplaz.com) atau bisa melalu aplikasi chat **Telegram**, silahkan hubungi contact *'Fastplaz Bot'*. 11 | 12 | 13 | ## Why use it? 14 | 15 | **Ringan Tanpa Beban** 16 | 17 | SimpleBOT dibuat dengan sederhana, simple dan ringan. SimpleBOT adalah _binary application_ sehingga diharapkan akan lebih cepat dan ringan. 18 | 19 | 20 | ## How to use it 21 | 22 | 23 | ### Requirements 24 | 25 | 26 | - [FastPlaz_runtime](http://www.fastplaz.com) 27 | - SimpleAI package 28 | 29 | ### Instalasi 30 | 31 | Gunakan Lazarus, buka file "simplebot_package.lpk" dan install file tersebut. 32 | Jangan lupa, instalasi ini membutuhkan SimpleAI package. 33 | 34 | ### SimpleBOT USAGE 35 | 36 | ``` 37 | SimpleBOT := TSimpleBotModule.Create; 38 | SimpleBOT.OnError := @OnErrorHandler; // Your Custom Message 39 | text_response := SimpleBOT.Exec(Text); 40 | SimpleBOT.Free; 41 | 42 | ``` 43 | 44 | Fungsi 'OnErrorHandler' bisa digunakan untuk melakukan trapping terhadap kata/kalimat yang belum diakomodir oleh data SimpleAI 45 | 46 | ```delphi 47 | function TMainModule.OnErrorHandler(const Message: string): string; 48 | begin 49 | . 50 | . 51 | . 52 | // save to log file 53 | LogUtil.Add(Message, 'AI'); 54 | 55 | // or save to database 56 | . 57 | . 58 | Result := 'Your custom messages'; 59 | end; 60 | ``` 61 | 62 | ### User Data 63 | 64 | SimpleBOT menyediakan fitur menyimpan data user untuk kebutuhan temporer. 65 | 66 | ```delphi 67 | SimpleBOT := TSimpleBotModule.Create; 68 | .. 69 | .. 70 | 71 | // Set 72 | SimpleBOT.UserData[ 'Name'] := 'Luri Darmawan' 73 | 74 | // Get 75 | varstring := SimpleBOT.UserData[ 'Name']; 76 | 77 | .. 78 | .. 79 | 80 | SimpleBOT.Free; 81 | 82 | ``` 83 | 84 | 85 | 86 | ![Format](img/format_01.png "Format") 87 | 88 | ## Documentation 89 | 90 | Take a look at the repo [Wiki](https://github.com/luridarmawan/SimpleAI/wiki) for further information and tutorials! 91 | Feel free to improve! 92 | 93 | ## Projects with this library 94 | 95 | Here's a list of projects that feats this library, feel free to add yours! 96 | 97 | - [SimpleBOT example](https://github.com/luridarmawan/SimpleBOT/) 98 | 99 | 100 | 101 | ## Troubleshooting 102 | 103 | If you like living on the edge, please report any bugs you find on the 104 | [SimpleAI issues](https://github.com/luridarmawan/SimpleAI/issues) page. 105 | 106 | ## Contributing 107 | 108 | See [CONTRIBUTING](CONTRIBUTING.md) for more information. 109 | 110 | ## License 111 | 112 | Please see the [LICENSE](LICENSE.txt) included in this repository, 113 | which this project is licensed under. 114 | 115 | ## Credits 116 | 117 | Credit list in [CREDITS](CREDITS) 118 | 119 | [Carik Bot](http://www.carik.id/) -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ## What is it? 2 | 3 | SimpleAI adalah _package code_ yang bisa digunakan untuk menerapkan AI (_Artificial Intelligence_) secara sederhana, khususnya untuk implementasi NLP (_Natural Language Processing_). 4 | 5 | SimpleAI ini dibangun dalam bahasa Pascal, khususnya dengan [freepascal](http://www.freepascal.org/). Untuk memudahkan dalam proses development, telah disediakan juga _package_ untuk digunakan di dalam IDE [Lazarus](http://www.lazarus-ide.org/) 6 | 7 | SimpleAI dibangun secara sederhana, data diambil dari *file* biasa, tanpa menggunakan RDBMS yang sudah ada. 8 | 9 | Untuk meningkatkan performat, telah disediakan juga fitur untuk koneksi ke [Redis](https://redis.io/). Untuk Production atau penggunaan trafik yang tinggi, disarankan untuk menggunakan Redis sebagai pilihan _data storage_-nya. 10 | 11 | 12 | ## Why use it? 13 | 14 | **Ringan Tanpa Beban** 15 | 16 | SimpleAI dibuat dengan sederhana, simple dan ringan. SimpleAI adalah _binary application_ sehingga diharapkan akan lebih cepat dan ringan. 17 | 18 | 19 | ## How to use it 20 | 21 | SimpleAI terbagi dalam 2 (dua) _package_ utama : 22 | 23 | 1. SimpleAI Package 24 | 2. SimpleBOT Package 25 | 26 | ### SimpleAI Package 27 | 28 | Merupakan **package utama** dari SimpleAI ini. Berisi pustaka _entities_ dan _intents_ yang digunakan untuk kebutuhan AI secara sederhana. 29 | 30 | Package ini bisa digunakan baik untuk _desktop application_ maupun _web application_ yang berbasis [FastPlaz](http://www.fastplaz.com) 31 | 32 | Informasi penggunaan secara lengkap bisa dibaca dari dokumen [README SimpleAI](README-simpleai.md) 33 | 34 | ### SimpleBOT Package 35 | 36 | Merupakan _package_ pendukung yang siap digunakan untuk membuat AI sederhana berbasis web. Package ini dikhususkan untuk aplikasi-aplikasi berbasis web yang menggunakan [FastPlaz](http://www.fastplaz.com). 37 | 38 | SimpleBOT merupakan salah satu contoh penggunaan SimpleAI yang dipergunakan untuk membuat BOT. 39 | Memiliki fitur menjawab otomatis, dan belajar suatu definisi kata sederhana. 40 | Kecerdasan Bot ini tergantung dari data entities dan intent yang Anda miliki, serta logic handler yang bisa dibuat _custom_ sesuai kebutuhan. 41 | 42 | SimpleBOT package sudah mendukung juga untuk digunakan sebagai Telegram BOT. 43 | 44 | Contoh penggunaan bot sederhana dengan SimpleBOT ini bisa anda coba dari situs [ai.fastplaz.com](http://ai.fastplaz.com) atau bisa melalu aplikasi chat **Telegram**, silahkan hubungi contact *'Fastplaz Bot'*. 45 | 46 | ### Requirements 47 | 48 | - FastPlaz_runtime 49 | - SimpleAI package 50 | 51 | Informasi penggunaan secara lengkap bisa dibaca dari dokumen [README SimpleBOT](README-simplebot.md) 52 | 53 | 54 | ## Documentation 55 | 56 | Take a look at the repo [Wiki](https://github.com/luridarmawan/SimpleAI/wiki) for further information and tutorials! 57 | Feel free to improve! 58 | 59 | ## Projects with this library 60 | 61 | Here's a list of projects that feats this library, feel free to add yours! 62 | 63 | - [SimpleBOT example](https://github.com/luridarmawan/SimpleBOT/) 64 | 65 | 66 | 67 | ## Troubleshooting 68 | 69 | If you like living on the edge, please report any bugs you find on the 70 | [SimpleAI issues](https://github.com/luridarmawan/SimpleAI/issues) page. 71 | 72 | ## Contributing 73 | 74 | See [CONTRIBUTING](CONTRIBUTING.md) for more information. 75 | 76 | ## License 77 | 78 | Please see the [LICENSE](LICENSE.txt) included in this repository, 79 | which this project is licensed under. 80 | 81 | ## Credits 82 | 83 | Credit list in [CREDITS](CREDITS) 84 | 85 | [Carik Bot](http://www.carik.id/) 86 | -------------------------------------------------------------------------------- /clean.sh: -------------------------------------------------------------------------------- 1 | rm -rf .DS_Store 2 | rm -rf *.or 3 | rm -rf *.bak 4 | rm -rf *.exe 5 | rm -rf *.ppu 6 | rm -rf *.o 7 | rm -rf *.compiled 8 | rm -rf public_html/ai/files/carik/carik.dat 9 | rm -rf public_html/ai/files/carik/group* 10 | 11 | find . -type f -name *.~ -delete 12 | find . -type f -name *.o -delete 13 | find . -type f -name *.oe -delete 14 | #find . -type f -name *.bin -delete 15 | find . -type f -name *.rst -delete 16 | find . -type f -name *.bak -delete 17 | find . -type f -name *.ppu -delete 18 | find . -type f -name *.log -delete 19 | find . -type f -name *.ses -delete 20 | find . -type f -name *.dat -delete 21 | find . -type f -name *.oga -delete 22 | find . -type f -name *.ogg -delete 23 | find . -type f -name *.mp3 -delete 24 | find . -type f -name *.compiled -delete 25 | find . -type f -name .DS_Store -delete 26 | find . -type d -name lib -exec rm -rf "{}" + 27 | find . -type d -name backup -exec rm -rf "{}" + 28 | 29 | mkdir lib 30 | touch lib/index.html 31 | mkdir source/lib 32 | touch source/lib/index.html 33 | -------------------------------------------------------------------------------- /data/README.md: -------------------------------------------------------------------------------- 1 | collected from many source in the world -------------------------------------------------------------------------------- /data/stemming/README.md: -------------------------------------------------------------------------------- 1 | copied from [Stemming Word tools](https://github.com/luridarmawan/StemmingWord/) 2 | -------------------------------------------------------------------------------- /data/stemming/stopwords.txt: -------------------------------------------------------------------------------- 1 | ada 2 | adalah 3 | agak 4 | agar 5 | akan 6 | amat 7 | anda 8 | antara 9 | anu 10 | apakah 11 | apalagi 12 | atau 13 | bagaimanapun 14 | bagi 15 | bahwa 16 | begitu 17 | belum 18 | bisa 19 | boleh 20 | dahulu 21 | dalam 22 | dan 23 | dapat 24 | dari 25 | daripada 26 | demi 27 | demikian 28 | dengan 29 | di 30 | dia 31 | dimana 32 | dll 33 | dsb 34 | dst 35 | dua 36 | dulunya 37 | guna 38 | hal 39 | hanya 40 | harus 41 | ia 42 | ingin 43 | ini 44 | itu 45 | itulah 46 | jika 47 | jika 48 | juga 49 | juga 50 | kah 51 | kami 52 | karena 53 | ke 54 | kecuali 55 | kemana 56 | kembali 57 | kenapa 58 | kepada 59 | ketika 60 | kita 61 | lagi 62 | lain 63 | maka 64 | mari 65 | masih 66 | melainkan 67 | mengapa 68 | menurut 69 | mereka 70 | namun 71 | nanti 72 | nggak 73 | oh 74 | ok 75 | oleh 76 | pada 77 | para 78 | pasti 79 | pula 80 | pun 81 | saat 82 | saja 83 | sambil 84 | sampai 85 | saya 86 | sebab 87 | sebagai 88 | sebelum 89 | sebetulnya 90 | secara 91 | sedangkan 92 | seharusnya 93 | sehingga 94 | sekitar 95 | selagi 96 | selain 97 | sementara 98 | sementara 99 | seolah 100 | seperti 101 | seraya 102 | serta 103 | sesuatu 104 | sesudah 105 | setelah 106 | seterusnya 107 | setiap 108 | setidaknya 109 | sudah 110 | supaya 111 | tanpa 112 | tapi 113 | telah 114 | tentang 115 | tentu 116 | terhadap 117 | tetapi 118 | tidak 119 | toh 120 | tolong 121 | untuk 122 | walau 123 | ya 124 | yaitu 125 | yakni 126 | yang 127 | -------------------------------------------------------------------------------- /data/stemming/word-nonstandard.txt: -------------------------------------------------------------------------------- 1 | [base] 2 | abjat=abjad 3 | abrasi=aberasi 4 | abreg=abrek 5 | absorsi=absorpsi 6 | accu=aki 7 | adap=adab 8 | adegio=adagio 9 | adek=adik 10 | adesi=adhesi 11 | aditorium=auditorium 12 | admin=administrator 13 | adpokat=advokat 14 | advent=adven 15 | adzan=azan 16 | afdol=afdal 17 | agamis=agamais 18 | agent=agen 19 | ajeg=ajek 20 | ajektif=adjektif 21 | ajimat=azimat 22 | akherat=akhirat 23 | akhlaq=akhlak 24 | akikah=akekah 25 | aksesoris=aksesori 26 | akte=akta 27 | aktifis=aktivis 28 | aktifitas=aktivitas 29 | aktip=aktif 30 | aktiv=aktif 31 | aktive=aktif 32 | aktuil=aktual 33 | akuntan=akutan 34 | akupuntur=akupunktur 35 | akutansi=akuntansi 36 | al-qur'an=Alquran 37 | al-quran=Alquran 38 | alaram=alarm 39 | alenia=alinea 40 | alfa=alpa 41 | alinia=alinea 42 | aliyah=aliah 43 | alloh=Allah 44 | almari=lemari 45 | almunium=aluminium 46 | alpha=alfa 47 | alpokat=avokad 48 | alpukat=avokad 49 | alternatip=alternatif 50 | alumunium=aluminium 51 | amandemen=amendemen 52 | amben=ambin 53 | ambeyen=ambeien 54 | ambulan=ambulans 55 | ambulance=ambulans 56 | amien=amin 57 | amirulhaj=amirulhaji 58 | amoniak=amonia 59 | amper=ampere 60 | amphibi=amfibi 61 | ampibi=amfibi 62 | analisa=analisis 63 | anestesia=anestesi 64 | anggauta=anggota 65 | angpao=angpau 66 | anoda=anode 67 | ansambel=ensambel 68 | antalogi=antologi 69 | antene=antena 70 | antri=antre 71 | antrian=antrean 72 | anugrah=anugerah 73 | apapun=apa pun 74 | aparatur=aparat 75 | apem=apam 76 | aplus=aplaus 77 | apostrop=apostrof 78 | apotik=apotek 79 | aqil=akil 80 | aquades=akuades 81 | aquarium=akuarium 82 | aquatik=akuatik 83 | arbiter=arbitrer 84 | aritmatika=aritmetika 85 | arkheolog=arkeolog 86 | arkheologi=arkeologi 87 | artifak=artefak 88 | asal-muasal=muasal 89 | aseli=asli 90 | aseptor=akseptor 91 | asesori=aksesori 92 | ashar=asar 93 | asik=asyik 94 | astaghfirullah=astagfirullah 95 | astronot=astronaut 96 | atheis=ateis 97 | atlit=atlet 98 | atmosfir=atmosfer 99 | atmosphere=atmosfer 100 | atret=ateret 101 | audiens=audiensi 102 | auliya=aulia 103 | autobiografi=otobiografi 104 | automatic=otomatis 105 | automatis=otomatis 106 | azas=asas 107 | azasi=asasi 108 | azaz=asas 109 | azhab=azab 110 | azhar=Asar 111 | babtis=baptis 112 | baek=baik 113 | bahwasannya=bahwasanya 114 | bakmie=bakmi 115 | bakpau=bakpao 116 | balance=balans 117 | bale=balai 118 | baligh=balig 119 | balpoin=bolpoin 120 | balsem=balsam 121 | bandrol=banderol 122 | bangker=bungker 123 | bapakda=bapanda 124 | bapaknda=bapanda 125 | baqa=baka 126 | barigade=barikade 127 | barzah=barzakh 128 | baso=bakso 129 | batalyon=batalion 130 | batere=baterai 131 | baterei=baterai 132 | bathil=batil 133 | bathin=batin 134 | batre=baterai 135 | bazaar=bazar 136 | beaya=biaya 137 | bedug=beduk 138 | belangko=blangko 139 | belender=blender 140 | belepot=gelepot 141 | belom=belum 142 | beludru=beledu 143 | bemper=bumper 144 | bengap=bengep 145 | bengkoang=bengkuang 146 | bengkowang=bengkuang 147 | bensol=benzol 148 | bergadang=begadang 149 | bergajul=bargajul 150 | berjanji=barzanj 151 | berlepotan=gelepotan 152 | berpetualang=bertualang 153 | berserta=beserta 154 | berterbangan=beterbangan 155 | berternak=beternak 156 | bh=beha 157 | bhayangkara=bayangkara 158 | bhiku=biksu 159 | bhuana=buana 160 | biarpet=byarpet 161 | bienale=bienial 162 | biennale=bienial 163 | bilyar=biliar 164 | bilyun=biliun 165 | binatu=benatu 166 | binatu=penatu 167 | biosfir=biosfer 168 | birahi=berahi 169 | bis=bus 170 | bisep=biseps 171 | blacu=belacu 172 | blanko=blangko 173 | blantika=belantika 174 | blokir=blokade 175 | bloon=beloon 176 | bolpen=bolpoin 177 | bolpoint=bolpoin 178 | bombon=bobon 179 | bonafid=bonafide 180 | bongkok=bungkuk 181 | boss=bos 182 | boulevard=bulevar 183 | bowling=boling 184 | braile=braille 185 | brandal=berandal 186 | brangkas=brankas 187 | breidel=bredel 188 | brengsek=berengsek 189 | brewok=bewok 190 | bridel=bredel 191 | brigade=barikade 192 | brilyan=brilian 193 | brokad=brokat 194 | bromocorah=bramacorah 195 | bronkitis=bronkhitis 196 | buda=Buddha 197 | budeg=budek 198 | budget=bujet 199 | budha=Buddha 200 | bumiputera=bumiputra 201 | bungalow=bungalo 202 | bur=bor 203 | busyet=buset 204 | cabay=cabai 205 | cabe=cabai 206 | cacad=cacat 207 | cafetaria=kafetaria 208 | cape=capai 209 | capek=capai 210 | cathering=katering 211 | cedal=cadel 212 | celos=celus 213 | cemilan=camilan 214 | cendikia=cendekia 215 | cendikiawan=cendekiawan 216 | cengkeh=cengkih 217 | cengkram=cengkeram 218 | cengkrama=cengkerama 219 | centigram=sentigram 220 | centimeter=sentimeter 221 | central=sentral 222 | ceret=cerek 223 | ceritera=cerita 224 | chlor=klor 225 | cicak=cecak 226 | cidera=cedera 227 | cigaret=sigaret 228 | cinderamata=cenderamata 229 | cingcong=cincong 230 | clash=kles 231 | clien=klien 232 | closet=kloset 233 | club=klab 234 | clurit=celurit 235 | cockpit=kokpit 236 | cocktail=koktail 237 | coklat=cokelat 238 | combro=comro 239 | cru=kru 240 | cumulus=kumulus 241 | da'i=dai 242 | da’i=dai 243 | da’wah=dakwah 244 | dajjal=dajal 245 | daptar=daftar 246 | dealer=diler 247 | debet=debit 248 | debetur=debitur 249 | debitur=debitor 250 | defiasi=deviasi 251 | degresi=digresi 252 | degub=degup 253 | dekoratip=dekoratif 254 | dekrit=dekret 255 | deodorant=deodoran 256 | depo=depot 257 | depolitisir=depolitisasi 258 | deputy=deputi 259 | design=desain 260 | despenser=dispenser 261 | destilasi=distilasi 262 | detektip=detektif 263 | detel=detail 264 | deterjen=detergen 265 | detil=detail 266 | deviden=dividen 267 | dharma=darma 268 | dhohir=lahir 269 | dhoif=daif 270 | dhu'afa=duafa 271 | dhuafa=duafa 272 | dhuha=duha 273 | dhuhur=zhuhur 274 | dhuhur=zuhur 275 | diagnosa=diagnosis 276 | diagnose=diagnosis 277 | diantaranya=di antaranya 278 | dimana=di mana 279 | dimanapun=di mana pun 280 | dioda=diode 281 | dipungkiri=dimungkiri 282 | disain=desain 283 | disainer=desainer 284 | disco=disko 285 | diserse=desersi 286 | disersi=desersi 287 | disini=di sini 288 | diskotik=diskotek 289 | diskripsi=deskripsi 290 | ditambahin=ditambahkan 291 | do'a=doa 292 | dollar=dolar 293 | domain=domein 294 | donatur=donator 295 | dopping=doping 296 | dos=dus 297 | dosin=lusin 298 | dozen=lusin 299 | draft=draf 300 | dramatisir=dramatisasi 301 | dramben=drumben 302 | dumping=damping 303 | duren=durian 304 | dzat=zat 305 | dzikir=zikir 306 | dzuhur=zuhur 307 | efektifitas=efektivitas 308 | efektip=efektif 309 | efektive=efektif 310 | eksebisi=ekshibisi 311 | eksem=eksim 312 | eksibisi=ekshibisi 313 | eksim=eksem 314 | eksport=ekspor 315 | ekstrim=ekstrem 316 | ekstrovert=ekstrover 317 | ekwivalen=ekuivalen 318 | elektroda=elektrode 319 | elip=elips 320 | elit=elite 321 | email=e-mail 322 | empek-empek=pempek 323 | eneg=enek 324 | engine=enjin 325 | ensiklopedia=ensiklopedi 326 | epektif=efektif 327 | epektip=efektif 328 | ephos=epos 329 | episod=episode 330 | equivalen=ekuivalen 331 | erobatik=aerobatik 332 | esen=esens 333 | esense=esens 334 | essai=esai 335 | essay=esai 336 | ethanol=etanol 337 | exim=eksem 338 | export=ekspor 339 | extra=ekstra 340 | extrim=ekstrem 341 | facsimil=faksimili 342 | faham=paham 343 | fak=vak 344 | faksimil=faksimile 345 | faksimil=faksimili 346 | faksimili=faksimile 347 | faksinasi=vaksinasi 348 | fakum=vakum 349 | falid=valid 350 | familiar=familier 351 | famplet=pamflet 352 | faqih=fakih 353 | farmakop=farmakope 354 | fas=vas 355 | faseh=fasih 356 | fasip=pasif 357 | faximil=faksimili 358 | february=Februari 359 | feminim=feminin 360 | ferri=feri 361 | fery=feri 362 | fihak=pihak 363 | fikir=pikir 364 | filosof=filsuf 365 | filsof=filsuf 366 | finish=finis 367 | fitoksoit=fitotoksoid 368 | foklor=folklor 369 | formil=formal 370 | fotosintesa=fotosintesis 371 | fotosintetis=fotosintesis 372 | frasa=frase 373 | frase=frasa 374 | frekwensi=frekuensi 375 | frigit=frigid 376 | fron=front 377 | frustasi=frustrasi 378 | furniture=furnitur 379 | galaktose=galaktosa 380 | galery=galeri 381 | galleri=galeri 382 | gamma=game 383 | gandewo=gandewa 384 | garebeg=garebek 385 | gasal=gazal 386 | geladi=gladi 387 | gelo=gila 388 | gendewa=gandewa 389 | geneaologi=genealogi 390 | geneologi=genealogi 391 | genius=jenius 392 | genteng=genting 393 | gep=gap 394 | gepok=kepok 395 | gerejani=gerejawi 396 | gerobag=gerobak 397 | geyser=geiser 398 | ghaib=gaib 399 | ghoib=gaib 400 | gip=gips 401 | gisi=gizi 402 | gladi=geladi 403 | gladibersih=geladi bersih 404 | glamour=glamor 405 | glondong=gelondong 406 | glosary=glosarium 407 | glukoma=glaukoma 408 | glukose=glukosa 409 | goa=gua 410 | goncang=guncang 411 | gono-gini=gana-gini 412 | grameh=gurami 413 | grebeg=garebek 414 | grebek=gerebek 415 | greget=gereget 416 | grendel=gerendel 417 | gria=griya 418 | grogol=gerogol 419 | gross=gros 420 | gubug=gubuk 421 | gudek=gudeg 422 | gulabit=bitgula 423 | gurameh=gurami 424 | guyub=guyup 425 | hadist=hadis 426 | hakekat=hakikat 427 | hal-ihwal=hal-hal 428 | handaitaulan=handaitulan 429 | handal=andal 430 | hapal=hafal 431 | harafiah=harfiah 432 | hektar=hektare 433 | hembus=embus 434 | hempas=empas 435 | hentak=entak 436 | herbivora=herbivor 437 | hetrogen=heterogen 438 | hidrolis=hidraulis 439 | higiena=higiene 440 | himbau=imbau 441 | himpit=impit 442 | hingar-bingar=ingar-bingar 443 | hingar=ingar 444 | hipermetri=hipermetropia 445 | hipotesa=hipotesis 446 | hipotik=hipotek 447 | hipovitaminose=hipovitaminosis 448 | hirarki=hierarki 449 | hiroglif=hieroglif 450 | hisap=isap 451 | hobby=hobi 452 | holistic=holistis 453 | holistik=holistis 454 | honocoroko=hanacaraka 455 | horden=gorden 456 | hordeng=gorden 457 | horison=horizon 458 | hurup=huruf 459 | husada=usada 460 | hutang=utang 461 | hybrida=hibrida 462 | hygiene=higiene 463 | hymne=himne 464 | i’tibar=iktibar 465 | i’tikaf=iktikaf 466 | ibtidaiyah=ibtidaiah 467 | iddah=idah 468 | idial=ideal 469 | idiil=ideal 470 | idiologi=ideologi 471 | ihlas=ikhlas 472 | ijasah=ijazah 473 | ijin=izin 474 | ijma’=ijmak 475 | ikhwal=ihwal 476 | iklas=ikhlas 477 | illusi=ilusi 478 | imajinasi=imaginasi 479 | imel=e-mail 480 | import=impor 481 | incognito=inkognito 482 | income=inkam 483 | indera=indra 484 | indra=indera 485 | influensa=influenza 486 | influinza=influenza 487 | inpus=infus 488 | instink=insting 489 | insyaf=insaf 490 | intel=intelijen 491 | intelegensi=inteligensi 492 | intelejensi=intelegensi 493 | inteligen=intelijen 494 | inten=intens 495 | intercontinental=interkontinental 496 | interest=interes 497 | intermezo=intermeso 498 | internist=internis 499 | interograsi=interogasi 500 | interospeksi=introspeksi 501 | interplasi=interpelasi 502 | interprestasi=interpretasi 503 | introvert=introver 504 | intrupsi=interupsi 505 | inventarisir=inventarisasi 506 | inzet=inset 507 | ionosfir=ionosfer 508 | iradah=iradat 509 | irasionil=irasional 510 | irodah=iradat 511 | irrasional=irasional 512 | islamiyah=Islamiah 513 | isra’=israk 514 | isteri=istri 515 | istighfar=istigfar 516 | istinja’=istinjak 517 | istiqomah=istikamah 518 | itali=Italia 519 | itikad=iktikad 520 | izajah=ijazah 521 | jadah=juadah 522 | jadual=jadwal 523 | jaduwal=jadwal 524 | jaelangkung=jalangkung 525 | jagad=jagat 526 | jahil=jail 527 | jahiliyah=jahiliah 528 | jailangkung=jalangkung 529 | jaman=zaman 530 | jarik=jarit 531 | jeep=jip 532 | jejer=jajar 533 | jemaah=jamaah 534 | jemaat=jamaah 535 | jembel=gembel 536 | jenasah=jenazah 537 | jendral=jenderal 538 | jenius=genius 539 | jep=jip 540 | jerembab=jerembap 541 | jerembap=jerembab 542 | jerigen=jeriken 543 | jina=zina 544 | jiujitsu=jujitsu 545 | jizim=jisim 546 | jogging=joging 547 | joint=join 548 | jomblo=jomlo 549 | jor-joran=jorjoran 550 | jubilum=jubileum 551 | jum'at=Jumat 552 | jumawa=jemawa 553 | jungtur=junktur 554 | jus=juz 555 | justeru=justru 556 | ka’bah=kakbah 557 | kaabah=kakbah 558 | kaburasi=karburasi 559 | kaburator=karburator 560 | kadaluarsa=kedaluwarsa 561 | kadaluwarsa=kedaluwarsa 562 | kaedah=kaidah 563 | kaffah=kafah 564 | kahyangan=kayangan 565 | kakatua=kakaktua 566 | kaleidioskop=kaleidoskop 567 | kalkarim=kalkarium 568 | kamboja=kemboja 569 | kameraman=kamerawan 570 | kameramen=kamerawan 571 | kamuplase=kamuflase 572 | kangguru=kanguru 573 | kangker=kanker 574 | kantung=kantong 575 | kaos=kaus 576 | karir=karier 577 | karna=karena 578 | kasep=kasip 579 | kastil=kastel 580 | katagori=kategori 581 | kataketis=katekis 582 | katalepsia=katalepsi 583 | katalisa=katalisis 584 | kate=katai 585 | katholik=Katolik 586 | katoda=katode 587 | katring=katering 588 | keburu=terburu 589 | kecibeling=kejibeling 590 | kecoak=kacoak 591 | kedaluarsa=kedaluwarsa 592 | kedele=kedelai 593 | kekawin=kakawin 594 | kelakatu=kelekatu 595 | kelenger=kelengar 596 | kelep=klep 597 | kemana=ke mana 598 | kempes=kempis 599 | kenalpot=knalpot 600 | kendor=kendur 601 | kenop=knop 602 | kerapan=karapan 603 | kerawitan=karawitan 604 | kerdip=kedip 605 | kerdus=kardus 606 | kerjasama=kerja sama 607 | kerol=krol 608 | kesturi=kasturi 609 | kesumah=kesuma 610 | ketapel=katapel 611 | ketawa=tertawa 612 | ketemu=bertemu 613 | ketimun=mentimun 614 | kharisma=karisma 615 | kharismatik=karismatik 616 | khaul=kaul 617 | khayangan=kayangan 618 | khutbah=khotbah 619 | klar=kelar 620 | klemak-klemek=kelemak-kelemek 621 | klenger=kelengar 622 | klengkeng=kelengkeng 623 | klenik=kelenik 624 | kleptomani=kleptomania 625 | klop=kelop 626 | klorofil=kloropil 627 | kloter=keloter 628 | kluwak=keluak 629 | kluwih=keluih 630 | knop=kenop 631 | koboy=koboi 632 | kocar-kacir=kucar-kacir 633 | kolomnis=kolumnis 634 | komersil=komersial 635 | komfirmasi=konfirmasi 636 | komoditi=komoditas 637 | komplit=komplet 638 | konggres=kongres 639 | kongkow=kongko 640 | kongkret=konkret 641 | kongkrit=konkret 642 | konkrit=konkret 643 | konsekwen=konsekuen 644 | konsleting=korsleting 645 | kontinyu=kontinu 646 | koor=kor 647 | koordinir=koordinasi 648 | kopor=koper 649 | korden=gorden 650 | korma=kurma 651 | korp=korps 652 | kosmonot=kosmonaut 653 | kram=keram 654 | kramat=keramat 655 | kreatifitas=kreativitas 656 | kreatip=kreatif 657 | kreative=kreatif 658 | kremi=keremi 659 | kresek=keresek 660 | kretek=keretek 661 | krew=kru 662 | kridit=kredit 663 | krucil=kerucil 664 | kulintang=kolintang 665 | kumplit=komplet 666 | kuno=kuna 667 | kurnia=karunia 668 | kusen=kosen 669 | kusuma=kesuma 670 | kutilang=ketilang 671 | kwaci=kuaci 672 | kwalitas=kualitas 673 | kwalitet=kualitas 674 | kwantitas=kuantitas 675 | kwartal=kuartal 676 | kwitangsi=kuitansi 677 | kwitansi=kuitansi 678 | kwota=kuota 679 | kyai=kiai 680 | la'nat=laknat 681 | laba-laba=labah-labah 682 | lajim=lazim 683 | lamtorogung=lamtaragung 684 | lapal=lafal 685 | lasim=lazim 686 | lasykar=laskar 687 | laveransir=leveransir 688 | ledeng=leding 689 | legalisir=legalisasi 690 | legenda=legende 691 | lembab=lembap 692 | leukimia=leukemia 693 | levender=lavendel 694 | liat=lihat 695 | limfe=limfa 696 | limpha=limpa 697 | linier=linear 698 | literal=litoral 699 | liver=lever 700 | lobang=lubang 701 | loby=lobi 702 | lohor=zhuhur 703 | lokalisir=lokalisasi 704 | longmarch=longmars 705 | lontang-lantung=luntang-lantung 706 | losin=lusin 707 | lotere=lotre 708 | luwak=luak 709 | lux=luks 710 | ma'af=maaf 711 | ma’af=maaf 712 | ma’fum=mafhum 713 | ma’rifat=makrifat 714 | ma’ruf=makruf 715 | maag=mag 716 | mabok=mabuk 717 | madukoro=madukara 718 | madzab=mazhab 719 | maesa=mahesa 720 | mafum=mafhum 721 | maghrib=magrib 722 | mahabarata=Mahabharata 723 | mahapengasih=Maha Pengasih 724 | mahardhika=mahardika 725 | mahfudz=mahfuz 726 | mahluk=makhluk 727 | mahnet=magnet 728 | maisena=maizena 729 | makcomblang=mak comblang 730 | makdum=makhdum 731 | mala-praktek=malapraktik 732 | malpraktek=malapraktik 733 | malpraktik=malapraktik 734 | mampet=mampat 735 | manager=manajer 736 | mandeg=mandek 737 | manekin=maneken 738 | mangkok=mangkuk 739 | mantab=mantap 740 | mantera=mantra 741 | manuskrif=manuskrip 742 | maqam=makam 743 | maqom=makam 744 | marathon=maraton 745 | margarine=margarin 746 | marjinal=marginal 747 | mas=emas 748 | masal=massal 749 | mashur=masyhur 750 | matematik=matematika 751 | materai=meterai 752 | mbalelo=mbalela 753 | mebeler=mebel 754 | melody=melodi 755 | mencolok=menyolok 756 | mendam=mandam 757 | mendem=mandam 758 | mentari=matahari 759 | menterapkan=menerapkan 760 | menterjemahkan=menerjemahkan 761 | mentertawakan=menertawakan 762 | menthol=mentol 763 | menyan=kemenyan 764 | menyuci=mencuci 765 | meram=merem 766 | merk=merek 767 | merkurokrum=merkurokrom 768 | mesjid=masjid 769 | mess=mes 770 | methanol=metanol 771 | metoda=metode 772 | metrei=meterai 773 | mi’raj=mikraj 774 | mie=mi 775 | migren=migrain 776 | mikroba=mikrobe 777 | milyader=miliarder 778 | milyar=miliar 779 | milyoner=miliuner 780 | milyuner=miliuner 781 | miopi=miopia 782 | missi=misi 783 | mithos=mitos 784 | miyop=miop 785 | mobilisir=mobilisasi 786 | moderen=modern 787 | monarkhi=monarki 788 | monopause=menopause 789 | monotheis=monoteis 790 | monotype=monotipe 791 | montage=montase 792 | moril=moral 793 | moto=motto 794 | mozaik=mosaik 795 | mpu=empu 796 | mu'jizat=mukjizat 797 | mu’jizat=mukjizat 798 | muadzin=muazin 799 | muamalah=muamalat 800 | mubaligh=mubalig 801 | mubalighoh=mubaligat 802 | mucikari=muncikari 803 | mukjijat=mukjizat 804 | mummi=mumi 805 | muqaddimah=mukadimah 806 | muqadimah=mukadimah 807 | mursid=mursyid 808 | mushala=musala 809 | musholah=musala 810 | musholla=musala 811 | musium=museum 812 | mustika=mestika 813 | musyafir=musafir 814 | nadar=nazar 815 | nadzar=nazar 816 | nafas=napas 817 | nahas=naas 818 | nahkoda=nakhoda 819 | nakoda=nakhoda 820 | nampak=tampak 821 | narkotika=narkotik 822 | nasehat=nasihat 823 | negatip=negatif 824 | negoisasi=negosiasi 825 | negri=negeri 826 | neko-neko=neka-neka 827 | nenas=nanas 828 | neo-kolonialisme=neokolonialisme 829 | netralisir=netralisasi 830 | netting=neting 831 | netto=neto 832 | ni'mat=nikmat 833 | nipas=nifas 834 | nomaden=nomad 835 | nomer=nomor 836 | non-aktif=nonaktif 837 | nonsen=nonsens 838 | nopember=November 839 | notulen=notula 840 | obrak-abrik=ubrak-abrik 841 | obyek=objek 842 | obyektif=objektif 843 | oditorium=auditorium 844 | okulele=ukulele 845 | omset=omzet 846 | ongseng=gongseng 847 | oplet=opelet 848 | opostrop=apostrof 849 | orange=oranye 850 | orangtua=orang tua 851 | orchestra=orkestra 852 | organisir=organisasi 853 | orisinil=orisinal 854 | orkhestra=orkestra 855 | oseng-oseng=gongseng 856 | osmosis=osmose 857 | otentik=autentik 858 | otobiografi=autobiografi 859 | otodidak=autodidak 860 | otopsi=autopsi 861 | otto=oto 862 | pacet=pacat 863 | padepokan=pedepokan 864 | padri=paderi 865 | palem=palm 866 | pamfelet=pamflet 867 | panembahan=penembahan 868 | pangkreas=pankreas 869 | panili=vanili 870 | panitra=panitera 871 | panu=panau 872 | paradox=paradoks 873 | paragoge=parogog 874 | paramedik=paramedis 875 | parasit=parasut 876 | pasca-panen=pascapanen 877 | pasip=pasif 878 | pasive=pasif 879 | pasport=paspor 880 | patent=paten 881 | pateri=patri 882 | patriakat=patriarkat 883 | patrilinial=patrilineal 884 | paviliyun=paviliun 885 | pavilyun=paviliun 886 | pebruari=Februari 887 | pedes=pedas 888 | pelaminan=pelamin 889 | peliara=pelihara 890 | penasehat=penasihat 891 | pendopo=pendapa 892 | pengrajin=perajin 893 | perduli=peduli 894 | pernis=vernis 895 | petay=petai 896 | pete=petai 897 | philipina=Filipina 898 | phobi=fobi 899 | phobia=fobia 900 | photo=foto 901 | piara=pelihara 902 | piranti=peranti 903 | pirsawan=pemirsa 904 | piyama=piama 905 | plat=flat 906 | plesetan=pelesetan 907 | plesir=pelesir 908 | plet=flat 909 | pleton=peleton 910 | plintir=pelintir 911 | plonco=pelonco 912 | plontos=pelontos 913 | polio=folio 914 | polpen=bolpoin 915 | pondasi=fondasi 916 | popular=populer 917 | porcelain=porselen 918 | porselain=porselen 919 | praktek=praktik 920 | profinsi=provinsi 921 | project=proyek 922 | projek=proyek 923 | proklamir=proklamasi 924 | propinsi=provinsi 925 | pungkir=mungkir 926 | putera=putra 927 | qalam=kalam 928 | qasidah=kasidah 929 | qodariyah=kadariah 930 | qodi=kadi 931 | qodiriyah=Kadiriah 932 | qolam=kalam 933 | qolbu=kalbu 934 | qomariyah=Kamariah 935 | qomat=kamat 936 | qona’ah=kanaah 937 | qori=qari 938 | qoriah=qariah 939 | qosidah=kasidah 940 | qunut=kunut 941 | qur’an=Quran 942 | quraisy=Kuraisy 943 | rajia=razia 944 | raka'at=rakaat 945 | raka’at=rakaat 946 | ramadhan=Ramadan 947 | rangking=ranking 948 | rangsel=ransel 949 | ranzel=ransel 950 | rapal=lafal 951 | rapih=rapi 952 | rapor=rapot 953 | raport=rapor 954 | rapot=rapor 955 | rasia=razia 956 | rasialist=rasialis 957 | rasionil=rasional 958 | real=riil 959 | realisir=realisasi 960 | reamur=Reaumur 961 | rebo=Rabu 962 | regim=rezim 963 | rejeki=rezeki 964 | rejeki=rizki 965 | rejim=rezim 966 | reka'at=rakaat 967 | rekaat=rakaat 968 | rekruit=rekrut 969 | relif=relief 970 | rembug=rembuk 971 | renaisan=renaisans 972 | renaisance=renaisans 973 | rengking=ranking 974 | reptil=reptilia 975 | reservoir=reservoar 976 | resiko=risiko 977 | respon=respons 978 | restauran=restoran 979 | restaurant=restoran 980 | resum=resume 981 | reumatik=rematik 982 | rezeki=rizki 983 | rezki=rezeki 984 | ridho=rida 985 | riil=real 986 | rilai=relai 987 | rile=relai 988 | riski=rizki 989 | ritme=ritma 990 | ritsluiting=ritsleting 991 | rizki=rezeki 992 | rizqi=rezeki 993 | rizqi=rizki 994 | robah=ubah 995 | roboh=rubuh 996 | rocker=roker 997 | roh=ruh 998 | rohaniawan=ruhaniwan 999 | romadhon=Ramadan 1000 | romadlon=Ramadan 1001 | romo=rama 1002 | romusha=romusa 1003 | rong-rong=rongrong 1004 | ronsen=rontgen 1005 | route=rute 1006 | rubah=ubah 1007 | ruku’=rukuk 1008 | sa’i=sai 1009 | sahadat=syahadat 1010 | sahid=syahid 1011 | sahwat=syahwat 1012 | sakharin=sakarin 1013 | saklar=sakelar 1014 | salesma=selesma 1015 | samadi=semadi 1016 | sambel=sambal 1017 | sambrero=sombrero 1018 | sanawiyah=sanawiah 1019 | sangkalan=sengkalan 1020 | sangsi=sanksi 1021 | sanjak=sajak 1022 | sanksi=sangsi 1023 | sansekerta=Sanskerta 1024 | saos=saus 1025 | saparila=sarsaparila 1026 | saplemen=suplemen 1027 | sarap=saraf 1028 | sariawan=seriawan 1029 | sate=satai 1030 | satire=satir 1031 | score=skor 1032 | sebab-musabab=musabab 1033 | seign=sein 1034 | sejarahwan=sejarawan 1035 | sekedar=sekadar 1036 | sekering=sekring 1037 | sekertaris=sekretaris 1038 | sekolastik=skolastik 1039 | sekor=skor 1040 | sekores=skors 1041 | sekors=skors 1042 | seksama=saksama 1043 | seksuil=seksual 1044 | sekta=sekte 1045 | sekterian=sektarian 1046 | sekuadron=eskadron 1047 | sekuler=sekular 1048 | selinder=silinder 1049 | selulose=selulosa 1050 | semanda=semenda 1051 | sembrono=sembrana 1052 | semedi=semadi 1053 | sempoa=swipoa 1054 | sen=sein 1055 | sendal=sandal 1056 | senggama=sanggama 1057 | senikdok=sinekdoke 1058 | senopati=senapati 1059 | sense=sinse 1060 | sentausa=sentosa 1061 | sentimentil=sentimental 1062 | sentra=sentral 1063 | sepakbor=sepatbor 1064 | sepanduk=spanduk 1065 | sepesial=spesial 1066 | sepesies=spesies 1067 | sepionase=spionase 1068 | sepiritus=spiritus 1069 | sepirtus=spiritus 1070 | sepon=spons 1071 | sepre=seprai 1072 | seprei=seprai 1073 | sere=serai 1074 | sereh=serai 1075 | sertipikat=sertifikat 1076 | seruling=suling 1077 | seruni=serunai 1078 | service=servis 1079 | setansa=stanza 1080 | seterika=setrika 1081 | setriker=striker 1082 | sex=seks 1083 | seyogyanya=seyogianya 1084 | shaf=saf 1085 | shalat=salat 1086 | shampo=sampo 1087 | shampoo=sampo 1088 | she=syekh 1089 | shogun=syogun 1090 | sholat=salat 1091 | siapapun=siapa pun 1092 | sie=seksi 1093 | sign=sein 1094 | silahkan=silakan 1095 | silaturohmi=silaturahmi 1096 | silaturrahmi=silaturahmi 1097 | simple=simpel 1098 | sinagog=sinagoge 1099 | sindrome=sindrom 1100 | sinkope=sinkop 1101 | sinse=sengse 1102 | sintesa=sintesis 1103 | sintese=sintesis 1104 | sintesis=sintetis 1105 | siphilis=sifilis 1106 | sipilis=sifilis 1107 | sipoa=swipoa 1108 | sirik=syirik 1109 | sirine=sirene 1110 | sirop=sirup 1111 | sirup=sirop 1112 | sistim=sistem 1113 | sitar=ziter 1114 | siter=ziter 1115 | siwa=Syiwa 1116 | skholastik=skolastik 1117 | skop=sekop 1118 | skore=skor 1119 | skorsing=skors 1120 | sky=ski 1121 | slank=slang 1122 | slendro=selendro 1123 | sleng=slang 1124 | slenk=slang 1125 | slinder=silinder 1126 | smash=smes 1127 | sobat=sahabat 1128 | sodakoh=sedekah 1129 | sodaqoh=sedekah 1130 | sofball=sofbal 1131 | softball=sofbal 1132 | sokhib=sahib 1133 | sokoguru=sakaguru 1134 | solenoid=solenoide 1135 | sop=sup 1136 | sopmberero=sombrero 1137 | sorban=serban 1138 | sorga=surga 1139 | soup=sop 1140 | souvenir=suvenir 1141 | spagetti=spageti 1142 | spagheti=spageti 1143 | spakbor=sepatbor 1144 | spakbort=sepatbor 1145 | special=spesial 1146 | species=spesies 1147 | speedboat=spitbot 1148 | speedbot=spitbot 1149 | sping=sfing 1150 | spink=sfing 1151 | spinx=sfing 1152 | spirituil=spiritual 1153 | spon=spons 1154 | spor=sepur 1155 | sprai=seprai 1156 | sprint=sprin 1157 | spritus=spiritus 1158 | spur=sepur 1159 | sreg=srek 1160 | srigala=serigala 1161 | stagen=setagen 1162 | stand=stan 1163 | standard=standar 1164 | standarisasi=standardisasi 1165 | standart=standar 1166 | stansa=stanza 1167 | stater=starter 1168 | stereotipe=stereotip 1169 | sticker=stiker 1170 | stip=setip 1171 | stir=setir 1172 | stock=stok 1173 | stratejik=strategis 1174 | strawberi=stroberi 1175 | strawberry=stroberi 1176 | strawbery=stroberi 1177 | stress=stres 1178 | stricker=striker 1179 | strip=setrip 1180 | strok=stroke 1181 | subsidair=subsider 1182 | subtansi=substansi 1183 | subtitusi=substitusi 1184 | subyek=subjek 1185 | sudet=sodet 1186 | suhada=syuhada 1187 | suiter=sweter 1188 | sukur=syukur 1189 | sundel=sundal 1190 | sunnah=sunah 1191 | sup=sop 1192 | superman=supermen 1193 | supermasi=supremasi 1194 | supir=sopir 1195 | suplement=suplemen 1196 | sur=syur 1197 | surat=surah 1198 | survai=survei 1199 | survay=survei 1200 | surve=survei 1201 | survey=survei 1202 | susastera=susastra 1203 | sutra=sutera 1204 | syafa’at=syafaat 1205 | syah=sah 1206 | syahdu=sahdu 1207 | syahit=syahid 1208 | syaiton=setan 1209 | syaraf=saraf 1210 | syarap=saraf 1211 | syareat=syariat 1212 | syarekat=syarikat 1213 | syeikh=syekh 1214 | syetan=setan 1215 | syi’ar=siar 1216 | syiar=siar 1217 | syrup=sirup 1218 | system=sistem 1219 | syubat=syubhat 1220 | syubkhat=syubhat 1221 | syurga=surga 1222 | ta’ala=taala 1223 | ta’zim=takzim 1224 | tabligh=tablig 1225 | tagen=setagen 1226 | tahiyat=tahiat 1227 | tahta=takhta 1228 | takjim=takzim 1229 | talek=talk 1230 | tamzil=tamsil 1231 | tangker=tanker 1232 | tape=tapai 1233 | tapelak=taplak 1234 | tapi=tetapi 1235 | taqwa=takwa 1236 | tarhim=tarkhim 1237 | tarkim=tarkhim 1238 | taruna=teruna 1239 | tataniaga=tata niaga 1240 | tatto=tato 1241 | taubat=tobat 1242 | tauco=taoco 1243 | tauge=taoge 1244 | taulada=teladan 1245 | tauladan=teladan 1246 | tawakkal=tawakal 1247 | taxi=taksi 1248 | team=tim 1249 | tehnik=teknik 1250 | tehnologi=teknologi 1251 | tekat=tekad 1252 | teke=tokek 1253 | tekek=tokek 1254 | tekhnik=teknik 1255 | tekhnologi=teknologi 1256 | telefon=telepon 1257 | telephone=telepon 1258 | telfon=telepon 1259 | telor=telur 1260 | telpon=telepon 1261 | temenggung=tumenggung 1262 | temugiring=temu giring 1263 | tentram=tenteram 1264 | teoritis=teoretis 1265 | tepekong=toapekong 1266 | terimakasih=terima kasih 1267 | terlanjur=telanjur 1268 | terlantar=telantar 1269 | terlentang=telentang 1270 | terong=terung 1271 | terpedo=torpedo 1272 | terpercaya=tepercaya 1273 | terperdaya=teperdaya 1274 | tersina=terzina 1275 | teruwelu=terwelu 1276 | tes=test 1277 | test=tes 1278 | thawaf=tawaf 1279 | theater=teater 1280 | theologi=teologi 1281 | thesis=tesis 1282 | thoriqoh=tarikat 1283 | thoriqot=tarikat 1284 | ticket=tiket 1285 | timun=mentimun 1286 | tipes=tifus 1287 | tips=tip 1288 | toge=taoge 1289 | toladan=teladan 1290 | tolerir=toleransi 1291 | tonel=tonil 1292 | topaz=topas 1293 | toples=stoples 1294 | tour=tur 1295 | touris=turis 1296 | tournamen=turnamen 1297 | trachome=trakom 1298 | tradisionil=tradisional 1299 | trakhom=trakom 1300 | trampil=terampil 1301 | trapo=trafo 1302 | trenggiling=tenggiling 1303 | trengginas=terengginas 1304 | tribun=tribune 1305 | trilyun=triliun 1306 | trinale=trienale 1307 | tripang=teripang 1308 | triplek=tripleks 1309 | triplex=tripleks 1310 | tritis=teritis 1311 | trofosfir=trofosfer 1312 | tromol=teromol 1313 | trophi=trofi 1314 | tropi=trofi 1315 | trotoir=trotoar 1316 | trubus=terubus 1317 | truwelu=terwelu 1318 | tsanawiyah=sanawiah 1319 | tungro=tungra 1320 | turnament=turnamen 1321 | tut=tuts 1322 | type=tipe 1323 | ukhrowi=ukhrawi 1324 | uneg-uneg=unek-unek 1325 | urin=urine 1326 | ustad=ustaz 1327 | ustadz=ustaz 1328 | ustadzah=ustazah 1329 | vacum=vakum 1330 | valentin=valentine 1331 | vampire=vampir 1332 | vanilli=vanili 1333 | varices=varises 1334 | varitas=varietas 1335 | vaskuler=vaskular 1336 | vegetarian=vegetaris 1337 | vermaks=vermak 1338 | vignet=vinyet 1339 | villa=vila 1340 | weker=beker 1341 | yudikatif=judikatif 1342 | yudisial=judisial 1343 | yudo=judo 1344 | yunior=junior 1345 | yurisdiksi=jurisdiksi 1346 | yuyitsu=jujitsu 1347 | zahir=lahir 1348 | zam-zam=zamzam 1349 | zarafah=jerapah 1350 | zerafah=jerapah 1351 | zhuhur=zuhur 1352 | zig-zag=zigzag 1353 | zigote=zigot 1354 | zinah=zina 1355 | zohir=lahir 1356 | zone=zona 1357 | zygot=zigot 1358 | 1359 | [gabungan] 1360 | akhirul kalam=akhirulkalam 1361 | al qur'an=Alquran 1362 | cap cai=capcai 1363 | drum band=drumben 1364 | foto copy=fotokopi 1365 | foto kopi=fotokopi 1366 | foto studio=studio foto 1367 | geladi resik=geladi bersih 1368 | inkar sunah=inkarsunah 1369 | kaca mata=kacamata 1370 | kakak tua=kakaktua 1371 | keji beling=kejibeling 1372 | kumpul kebo=kumpul kerbau 1373 | kung fu=kungfu 1374 | long march=longmars 1375 | mas kawin=maskawin 1376 | mass media=media massa 1377 | nina bobo=ninabobo 1378 | pas foto=pasfoto 1379 | pas photo=pasfoto 1380 | penghujan=hujan 1381 | radio aktif=radioaktif 1382 | saka guru=sakaguru 1383 | sedia kala=sediakala 1384 | serba aneka=serbaneka 1385 | serba neka=serbaneka 1386 | sosio drama=sosiodrama 1387 | suka cita=sukacita 1388 | tepa selira=tepaselira 1389 | tepo seliro=tepaselira 1390 | toa pekong=toapekong 1391 | ujian ulangan=ujian ulang -------------------------------------------------------------------------------- /img/format_01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/luridarmawan/SimpleAI/e928d0c29b972c7c58ac15986f6985d002aa93bf/img/format_01.png -------------------------------------------------------------------------------- /lib/empty: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/luridarmawan/SimpleAI/e928d0c29b972c7c58ac15986f6985d002aa93bf/lib/empty -------------------------------------------------------------------------------- /lib/index.html: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/luridarmawan/SimpleAI/e928d0c29b972c7c58ac15986f6985d002aa93bf/lib/index.html -------------------------------------------------------------------------------- /source/example/NLP Test-Desktop/README.md: -------------------------------------------------------------------------------- 1 | # NLP Tester Tools 2 | 3 | 4 | 5 | 6 | ## How to use it 7 | 8 | How to use this NLP Tester tools: 9 | 10 | 1. Just Build/compile and Run this project. 11 | 2. Select your NLP Data Directory, then click "Load Data" 12 | 3. Type your test text in yellow box editor, then click "Send" 13 | 14 | 15 | 16 | 17 | 18 | ### Requirements 19 | 20 | - FastPlaz_runtime 21 | - SimpleAI package 22 | 23 | 24 | -------------------------------------------------------------------------------- /source/example/NLP Test-Desktop/app.lfm: -------------------------------------------------------------------------------- 1 | object fApp: TfApp 2 | Left = 308 3 | Height = 539 4 | Top = 150 5 | Width = 727 6 | Caption = 'NLP Tester' 7 | ClientHeight = 539 8 | ClientWidth = 727 9 | KeyPreview = True 10 | OnClose = FormClose 11 | OnCreate = FormCreate 12 | OnDestroy = FormDestroy 13 | OnKeyDown = FormKeyDown 14 | LCLVersion = '1.6.4.0' 15 | object pnl_Top: TPanel 16 | Left = 0 17 | Height = 36 18 | Top = 0 19 | Width = 727 20 | Align = alTop 21 | ClientHeight = 36 22 | ClientWidth = 727 23 | TabOrder = 1 24 | object edt_Dir: TDirectoryEdit 25 | Left = 174 26 | Height = 28 27 | Top = 5 28 | Width = 537 29 | OnAcceptDirectory = edt_DirAcceptDirectory 30 | ShowHidden = False 31 | ButtonWidth = 23 32 | NumGlyphs = 1 33 | MaxLength = 0 34 | TabOrder = 0 35 | end 36 | object Label1: TLabel 37 | Left = 14 38 | Height = 20 39 | Top = 8 40 | Width = 134 41 | Caption = 'NLP Data Directory :' 42 | ParentColor = False 43 | end 44 | end 45 | object pnl_Bottom: TPanel 46 | Left = 0 47 | Height = 33 48 | Top = 506 49 | Width = 727 50 | Align = alBottom 51 | ClientHeight = 33 52 | ClientWidth = 727 53 | TabOrder = 0 54 | object Panel1: TPanel 55 | Left = 634 56 | Height = 31 57 | Top = 1 58 | Width = 92 59 | Align = alRight 60 | ClientHeight = 31 61 | ClientWidth = 92 62 | TabOrder = 1 63 | object btn_Send: TButton 64 | Left = 4 65 | Height = 25 66 | Top = 2 67 | Width = 75 68 | Caption = '&Send' 69 | OnClick = btn_SendClick 70 | TabOrder = 0 71 | end 72 | end 73 | object edt: TEdit 74 | Left = 1 75 | Height = 31 76 | Top = 1 77 | Width = 633 78 | Align = alClient 79 | Color = clYellow 80 | OnKeyDown = edtKeyDown 81 | TabOrder = 0 82 | end 83 | end 84 | object pnl: TPanel 85 | Left = 0 86 | Height = 470 87 | Top = 36 88 | Width = 727 89 | Align = alClient 90 | BevelOuter = bvNone 91 | ClientHeight = 470 92 | ClientWidth = 727 93 | TabOrder = 2 94 | object Page: TPageControl 95 | Left = 0 96 | Height = 470 97 | Top = 0 98 | Width = 727 99 | ActivePage = page_Result 100 | Align = alClient 101 | TabIndex = 0 102 | TabOrder = 0 103 | object page_Result: TTabSheet 104 | Caption = 'Result' 105 | ClientHeight = 437 106 | ClientWidth = 719 107 | inline editor: TSynEdit 108 | Left = 0 109 | Height = 437 110 | Top = 0 111 | Width = 719 112 | Align = alClient 113 | Font.Height = -13 114 | Font.Name = 'Courier New' 115 | Font.Pitch = fpFixed 116 | Font.Quality = fqNonAntialiased 117 | ParentColor = False 118 | ParentFont = False 119 | TabOrder = 0 120 | BorderStyle = bsNone 121 | Gutter.Width = 57 122 | Gutter.MouseActions = <> 123 | RightGutter.Width = 0 124 | RightGutter.MouseActions = <> 125 | Highlighter = SynJScriptSyn1 126 | Keystrokes = < 127 | item 128 | Command = ecUp 129 | ShortCut = 38 130 | end 131 | item 132 | Command = ecSelUp 133 | ShortCut = 8230 134 | end 135 | item 136 | Command = ecScrollUp 137 | ShortCut = 16422 138 | end 139 | item 140 | Command = ecDown 141 | ShortCut = 40 142 | end 143 | item 144 | Command = ecSelDown 145 | ShortCut = 8232 146 | end 147 | item 148 | Command = ecScrollDown 149 | ShortCut = 16424 150 | end 151 | item 152 | Command = ecLeft 153 | ShortCut = 37 154 | end 155 | item 156 | Command = ecSelLeft 157 | ShortCut = 8229 158 | end 159 | item 160 | Command = ecWordLeft 161 | ShortCut = 16421 162 | end 163 | item 164 | Command = ecSelWordLeft 165 | ShortCut = 24613 166 | end 167 | item 168 | Command = ecRight 169 | ShortCut = 39 170 | end 171 | item 172 | Command = ecSelRight 173 | ShortCut = 8231 174 | end 175 | item 176 | Command = ecWordRight 177 | ShortCut = 16423 178 | end 179 | item 180 | Command = ecSelWordRight 181 | ShortCut = 24615 182 | end 183 | item 184 | Command = ecPageDown 185 | ShortCut = 34 186 | end 187 | item 188 | Command = ecSelPageDown 189 | ShortCut = 8226 190 | end 191 | item 192 | Command = ecPageBottom 193 | ShortCut = 16418 194 | end 195 | item 196 | Command = ecSelPageBottom 197 | ShortCut = 24610 198 | end 199 | item 200 | Command = ecPageUp 201 | ShortCut = 33 202 | end 203 | item 204 | Command = ecSelPageUp 205 | ShortCut = 8225 206 | end 207 | item 208 | Command = ecPageTop 209 | ShortCut = 16417 210 | end 211 | item 212 | Command = ecSelPageTop 213 | ShortCut = 24609 214 | end 215 | item 216 | Command = ecLineStart 217 | ShortCut = 36 218 | end 219 | item 220 | Command = ecSelLineStart 221 | ShortCut = 8228 222 | end 223 | item 224 | Command = ecEditorTop 225 | ShortCut = 16420 226 | end 227 | item 228 | Command = ecSelEditorTop 229 | ShortCut = 24612 230 | end 231 | item 232 | Command = ecLineEnd 233 | ShortCut = 35 234 | end 235 | item 236 | Command = ecSelLineEnd 237 | ShortCut = 8227 238 | end 239 | item 240 | Command = ecEditorBottom 241 | ShortCut = 16419 242 | end 243 | item 244 | Command = ecSelEditorBottom 245 | ShortCut = 24611 246 | end 247 | item 248 | Command = ecToggleMode 249 | ShortCut = 45 250 | end 251 | item 252 | Command = ecCopy 253 | ShortCut = 16429 254 | end 255 | item 256 | Command = ecPaste 257 | ShortCut = 8237 258 | end 259 | item 260 | Command = ecDeleteChar 261 | ShortCut = 46 262 | end 263 | item 264 | Command = ecCut 265 | ShortCut = 8238 266 | end 267 | item 268 | Command = ecDeleteLastChar 269 | ShortCut = 8 270 | end 271 | item 272 | Command = ecDeleteLastChar 273 | ShortCut = 8200 274 | end 275 | item 276 | Command = ecDeleteLastWord 277 | ShortCut = 16392 278 | end 279 | item 280 | Command = ecUndo 281 | ShortCut = 32776 282 | end 283 | item 284 | Command = ecRedo 285 | ShortCut = 40968 286 | end 287 | item 288 | Command = ecLineBreak 289 | ShortCut = 13 290 | end 291 | item 292 | Command = ecSelectAll 293 | ShortCut = 16449 294 | end 295 | item 296 | Command = ecCopy 297 | ShortCut = 16451 298 | end 299 | item 300 | Command = ecBlockIndent 301 | ShortCut = 24649 302 | end 303 | item 304 | Command = ecLineBreak 305 | ShortCut = 16461 306 | end 307 | item 308 | Command = ecInsertLine 309 | ShortCut = 16462 310 | end 311 | item 312 | Command = ecDeleteWord 313 | ShortCut = 16468 314 | end 315 | item 316 | Command = ecBlockUnindent 317 | ShortCut = 24661 318 | end 319 | item 320 | Command = ecPaste 321 | ShortCut = 16470 322 | end 323 | item 324 | Command = ecCut 325 | ShortCut = 16472 326 | end 327 | item 328 | Command = ecDeleteLine 329 | ShortCut = 16473 330 | end 331 | item 332 | Command = ecDeleteEOL 333 | ShortCut = 24665 334 | end 335 | item 336 | Command = ecUndo 337 | ShortCut = 16474 338 | end 339 | item 340 | Command = ecRedo 341 | ShortCut = 24666 342 | end 343 | item 344 | Command = ecGotoMarker0 345 | ShortCut = 16432 346 | end 347 | item 348 | Command = ecGotoMarker1 349 | ShortCut = 16433 350 | end 351 | item 352 | Command = ecGotoMarker2 353 | ShortCut = 16434 354 | end 355 | item 356 | Command = ecGotoMarker3 357 | ShortCut = 16435 358 | end 359 | item 360 | Command = ecGotoMarker4 361 | ShortCut = 16436 362 | end 363 | item 364 | Command = ecGotoMarker5 365 | ShortCut = 16437 366 | end 367 | item 368 | Command = ecGotoMarker6 369 | ShortCut = 16438 370 | end 371 | item 372 | Command = ecGotoMarker7 373 | ShortCut = 16439 374 | end 375 | item 376 | Command = ecGotoMarker8 377 | ShortCut = 16440 378 | end 379 | item 380 | Command = ecGotoMarker9 381 | ShortCut = 16441 382 | end 383 | item 384 | Command = ecSetMarker0 385 | ShortCut = 24624 386 | end 387 | item 388 | Command = ecSetMarker1 389 | ShortCut = 24625 390 | end 391 | item 392 | Command = ecSetMarker2 393 | ShortCut = 24626 394 | end 395 | item 396 | Command = ecSetMarker3 397 | ShortCut = 24627 398 | end 399 | item 400 | Command = ecSetMarker4 401 | ShortCut = 24628 402 | end 403 | item 404 | Command = ecSetMarker5 405 | ShortCut = 24629 406 | end 407 | item 408 | Command = ecSetMarker6 409 | ShortCut = 24630 410 | end 411 | item 412 | Command = ecSetMarker7 413 | ShortCut = 24631 414 | end 415 | item 416 | Command = ecSetMarker8 417 | ShortCut = 24632 418 | end 419 | item 420 | Command = ecSetMarker9 421 | ShortCut = 24633 422 | end 423 | item 424 | Command = EcFoldLevel1 425 | ShortCut = 41009 426 | end 427 | item 428 | Command = EcFoldLevel2 429 | ShortCut = 41010 430 | end 431 | item 432 | Command = EcFoldLevel3 433 | ShortCut = 41011 434 | end 435 | item 436 | Command = EcFoldLevel4 437 | ShortCut = 41012 438 | end 439 | item 440 | Command = EcFoldLevel5 441 | ShortCut = 41013 442 | end 443 | item 444 | Command = EcFoldLevel6 445 | ShortCut = 41014 446 | end 447 | item 448 | Command = EcFoldLevel7 449 | ShortCut = 41015 450 | end 451 | item 452 | Command = EcFoldLevel8 453 | ShortCut = 41016 454 | end 455 | item 456 | Command = EcFoldLevel9 457 | ShortCut = 41017 458 | end 459 | item 460 | Command = EcFoldLevel0 461 | ShortCut = 41008 462 | end 463 | item 464 | Command = EcFoldCurrent 465 | ShortCut = 41005 466 | end 467 | item 468 | Command = EcUnFoldCurrent 469 | ShortCut = 41003 470 | end 471 | item 472 | Command = EcToggleMarkupWord 473 | ShortCut = 32845 474 | end 475 | item 476 | Command = ecNormalSelect 477 | ShortCut = 24654 478 | end 479 | item 480 | Command = ecColumnSelect 481 | ShortCut = 24643 482 | end 483 | item 484 | Command = ecLineSelect 485 | ShortCut = 24652 486 | end 487 | item 488 | Command = ecTab 489 | ShortCut = 9 490 | end 491 | item 492 | Command = ecShiftTab 493 | ShortCut = 8201 494 | end 495 | item 496 | Command = ecMatchBracket 497 | ShortCut = 24642 498 | end 499 | item 500 | Command = ecColSelUp 501 | ShortCut = 40998 502 | end 503 | item 504 | Command = ecColSelDown 505 | ShortCut = 41000 506 | end 507 | item 508 | Command = ecColSelLeft 509 | ShortCut = 40997 510 | end 511 | item 512 | Command = ecColSelRight 513 | ShortCut = 40999 514 | end 515 | item 516 | Command = ecColSelPageDown 517 | ShortCut = 40994 518 | end 519 | item 520 | Command = ecColSelPageBottom 521 | ShortCut = 57378 522 | end 523 | item 524 | Command = ecColSelPageUp 525 | ShortCut = 40993 526 | end 527 | item 528 | Command = ecColSelPageTop 529 | ShortCut = 57377 530 | end 531 | item 532 | Command = ecColSelLineStart 533 | ShortCut = 40996 534 | end 535 | item 536 | Command = ecColSelLineEnd 537 | ShortCut = 40995 538 | end 539 | item 540 | Command = ecColSelEditorTop 541 | ShortCut = 57380 542 | end 543 | item 544 | Command = ecColSelEditorBottom 545 | ShortCut = 57379 546 | end> 547 | MouseActions = <> 548 | MouseTextActions = <> 549 | MouseSelActions = <> 550 | VisibleSpecialChars = [vscSpace, vscTabAtLast] 551 | SelectedColor.BackPriority = 50 552 | SelectedColor.ForePriority = 50 553 | SelectedColor.FramePriority = 50 554 | SelectedColor.BoldPriority = 50 555 | SelectedColor.ItalicPriority = 50 556 | SelectedColor.UnderlinePriority = 50 557 | SelectedColor.StrikeOutPriority = 50 558 | BracketHighlightStyle = sbhsBoth 559 | BracketMatchColor.Background = clNone 560 | BracketMatchColor.Foreground = clNone 561 | BracketMatchColor.Style = [fsBold] 562 | FoldedCodeColor.Background = clNone 563 | FoldedCodeColor.Foreground = clGray 564 | FoldedCodeColor.FrameColor = clGray 565 | MouseLinkColor.Background = clNone 566 | MouseLinkColor.Foreground = clBlue 567 | LineHighlightColor.Background = clNone 568 | LineHighlightColor.Foreground = clNone 569 | inline SynLeftGutterPartList1: TSynGutterPartList 570 | object SynGutterMarks1: TSynGutterMarks 571 | Width = 24 572 | MouseActions = <> 573 | end 574 | object SynGutterLineNumber1: TSynGutterLineNumber 575 | Width = 17 576 | MouseActions = <> 577 | MarkupInfo.Background = clBtnFace 578 | MarkupInfo.Foreground = clNone 579 | DigitCount = 2 580 | ShowOnlyLineNumbersMultiplesOf = 1 581 | ZeroStart = False 582 | LeadingZeros = False 583 | end 584 | object SynGutterChanges1: TSynGutterChanges 585 | Width = 4 586 | MouseActions = <> 587 | ModifiedColor = 59900 588 | SavedColor = clGreen 589 | end 590 | object SynGutterSeparator1: TSynGutterSeparator 591 | Width = 2 592 | MouseActions = <> 593 | MarkupInfo.Background = clWhite 594 | MarkupInfo.Foreground = clGray 595 | end 596 | object SynGutterCodeFolding1: TSynGutterCodeFolding 597 | MouseActions = <> 598 | MarkupInfo.Background = clNone 599 | MarkupInfo.Foreground = clGray 600 | MouseActionsExpanded = <> 601 | MouseActionsCollapsed = <> 602 | end 603 | end 604 | end 605 | end 606 | end 607 | end 608 | object SynJScriptSyn1: TSynJScriptSyn 609 | Enabled = False 610 | left = 104 611 | top = 376 612 | end 613 | end 614 | -------------------------------------------------------------------------------- /source/example/NLP Test-Desktop/app.pas: -------------------------------------------------------------------------------- 1 | unit app; 2 | 3 | {$mode objfpc}{$H+} 4 | 5 | interface 6 | 7 | uses 8 | simpleai_controller, fpjson, jsonparser, jsonscanner, 9 | Classes, SysUtils, FileUtil, SynEdit, SynHighlighterJScript, Forms, Controls, 10 | Graphics, Dialogs, ExtCtrls, StdCtrls, EditBtn, ComCtrls; 11 | 12 | const 13 | BOTNAME = 'TESTER'; 14 | FILE_ENTITIES = '*-entities.txt'; 15 | FILE_INTENTS = '*-intents.txt'; 16 | FILE_RESPONSES = '*-response.txt'; 17 | 18 | type 19 | 20 | { TLocalJSONParser } 21 | 22 | TLocalJSONParser = class(TJSONParser) 23 | private 24 | FScanner: TJSONScanner; 25 | public 26 | property Scanner: TJSONScanner read FScanner; 27 | end; 28 | 29 | { TfApp } 30 | 31 | TfApp = class(TForm) 32 | btn_Send: TButton; 33 | editor: TSynEdit; 34 | edt_Dir: TDirectoryEdit; 35 | edt: TEdit; 36 | Label1: TLabel; 37 | Page: TPageControl; 38 | Panel1: TPanel; 39 | pnl_Top: TPanel; 40 | pnl_Bottom: TPanel; 41 | pnl: TPanel; 42 | SynJScriptSyn1: TSynJScriptSyn; 43 | page_Result: TTabSheet; 44 | procedure btn_SendClick(Sender: TObject); 45 | procedure edtKeyDown(Sender: TObject; var Key: word; Shift: TShiftState); 46 | procedure edt_DirAcceptDirectory(Sender: TObject; var Value: string); 47 | procedure FormClose(Sender: TObject; var CloseAction: TCloseAction); 48 | procedure FormCreate(Sender: TObject); 49 | procedure FormDestroy(Sender: TObject); 50 | procedure FormKeyDown(Sender: TObject; var Key: word; Shift: TShiftState); 51 | private 52 | FIsLoaded: boolean; 53 | NLP: TSimpleAI; 54 | function loadData: boolean; 55 | function loadDataEntities: boolean; 56 | function loadDataIntents: boolean; 57 | function loadDataResponses: boolean; 58 | public 59 | end; 60 | 61 | var 62 | fApp: TfApp; 63 | 64 | implementation 65 | 66 | {$R *.lfm} 67 | 68 | { TfApp } 69 | 70 | procedure TfApp.FormCreate(Sender: TObject); 71 | begin 72 | editor.Clear; 73 | FIsLoaded := False; 74 | edt_Dir.Directory := ExtractFileDir(Application.ExeName); 75 | 76 | //demo 77 | edt.Text := 'hi'; 78 | end; 79 | 80 | procedure TfApp.FormDestroy(Sender: TObject); 81 | begin 82 | NLP.Free; 83 | end; 84 | 85 | function jsonFormatter(JsonString: string): string; 86 | // error line : VJSONParser.Scanner.CurRow; 87 | var 88 | VJSONData: TJSONData = nil; 89 | VJSONParser: TLocalJSONParser; 90 | begin 91 | Result := ''; 92 | JsonString := trim(JsonString); 93 | if JsonString = '' then 94 | Exit; 95 | 96 | VJSONParser := TLocalJSONParser.Create(JsonString); 97 | try 98 | try 99 | VJSONParser.Strict := True; 100 | VJSONData := VJSONParser.Parse; 101 | Result := VJSONData.FormatJSON([], 2); 102 | VJSONData.Free; 103 | except 104 | on E: Exception do 105 | begin 106 | end; 107 | end; 108 | finally 109 | VJSONParser.Free; 110 | end; 111 | end; 112 | 113 | procedure TfApp.btn_SendClick(Sender: TObject); 114 | begin 115 | if Trim(edt.Text) = '' then 116 | Exit; 117 | 118 | NLP := TSimpleAI.Create; 119 | NLP.AIName := BOTNAME; 120 | NLP.Stemming := False; 121 | //NLP.Debug := True; 122 | if not loadData then 123 | begin 124 | editor.Lines.Add(#13'Data can not loaded'); 125 | exit; 126 | end; 127 | 128 | if not NLP.Exec(edt.Text) then 129 | begin 130 | // if text not exists in nlp data 131 | 132 | end; 133 | editor.Lines.Text := jsonFormatter(NLP.ResponseJson); 134 | 135 | if not FIsLoaded then 136 | editor.Lines.Add(#13'Data still not loaded'); 137 | edt.Clear; 138 | NLP.Free; 139 | end; 140 | 141 | procedure TfApp.edtKeyDown(Sender: TObject; var Key: word; Shift: TShiftState); 142 | begin 143 | if key = 13 then 144 | begin 145 | key := 0; 146 | btn_Send.Click; 147 | end; 148 | end; 149 | 150 | procedure TfApp.edt_DirAcceptDirectory(Sender: TObject; var Value: string); 151 | begin 152 | loadData; 153 | end; 154 | 155 | procedure TfApp.FormClose(Sender: TObject; var CloseAction: TCloseAction); 156 | begin 157 | 158 | end; 159 | 160 | procedure TfApp.FormKeyDown(Sender: TObject; var Key: word; Shift: TShiftState); 161 | begin 162 | if key = 27 then 163 | begin 164 | key := 0; 165 | Close; 166 | end; 167 | end; 168 | 169 | function TfApp.loadData: boolean; 170 | begin 171 | FIsLoaded := False; 172 | if (loadDataEntities and loadDataIntents and loadDataResponses) then 173 | FIsLoaded := True; 174 | 175 | Result := FIsLoaded; 176 | end; 177 | 178 | function TfApp.loadDataEntities: boolean; 179 | var 180 | fileInfo: TSearchRec; 181 | begin 182 | Result := False; 183 | SetCurrentDir(edt_Dir.Directory); 184 | if FindFirst(FILE_ENTITIES, faAnyFile, fileInfo) = 0 then 185 | begin 186 | repeat 187 | NLP.AddEntitiesFromFile(fileInfo.Name); 188 | until FindNext(fileInfo) <> 0; 189 | editor.Lines.Add('Entites loaded'); 190 | Result := True; 191 | end; 192 | end; 193 | 194 | function TfApp.loadDataIntents: boolean; 195 | var 196 | fileInfo: TSearchRec; 197 | begin 198 | Result := False; 199 | SetCurrentDir(edt_Dir.Directory); 200 | if FindFirst(FILE_INTENTS, faAnyFile, fileInfo) = 0 then 201 | begin 202 | repeat 203 | NLP.AddIntentFromFile(fileInfo.Name); 204 | until FindNext(fileInfo) <> 0; 205 | editor.Lines.Add('Intents loaded'); 206 | Result := True; 207 | end; 208 | end; 209 | 210 | function TfApp.loadDataResponses: boolean; 211 | var 212 | fileInfo: TSearchRec; 213 | begin 214 | Result := False; 215 | SetCurrentDir(edt_Dir.Directory); 216 | if FindFirst(FILE_RESPONSES, faAnyFile, fileInfo) = 0 then 217 | begin 218 | repeat 219 | NLP.AddResponFromFile(fileInfo.Name); 220 | until FindNext(fileInfo) <> 0; 221 | editor.Lines.Add('Responses loaded'); 222 | Result := True; 223 | end; 224 | end; 225 | 226 | end. 227 | 228 | -------------------------------------------------------------------------------- /source/example/NLP Test-Desktop/clean.bat: -------------------------------------------------------------------------------- 1 | @echo off 2 | del *~ 3 | rem del *.rst 4 | rem del *.lrt 5 | rem del *.lps 6 | del /s *.or 7 | del /s *.bak 8 | del /s *.exe 9 | del /s *.ppu 10 | del /s *.o 11 | del *.compiled 12 | del /s /q lib\* 13 | rmdir /s /q lib\ 14 | mkdir lib 15 | type "" > lib/empty 16 | rmdir /s /q backup\ 17 | rmdir /s /q src\backup 18 | rmdir /s /q src\controller\backup 19 | 20 | rmdir /s /q src\lib\ 21 | 22 | timeout /t 3 23 | -------------------------------------------------------------------------------- /source/example/NLP Test-Desktop/lib/empty: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/luridarmawan/SimpleAI/e928d0c29b972c7c58ac15986f6985d002aa93bf/source/example/NLP Test-Desktop/lib/empty -------------------------------------------------------------------------------- /source/example/NLP Test-Desktop/nlptester.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/luridarmawan/SimpleAI/e928d0c29b972c7c58ac15986f6985d002aa93bf/source/example/NLP Test-Desktop/nlptester.ico -------------------------------------------------------------------------------- /source/example/NLP Test-Desktop/nlptester.lpi: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | <ResourceType Value="res"/> 11 | <UseXPManifest Value="True"/> 12 | <Icon Value="0"/> 13 | </General> 14 | <i18n> 15 | <EnableI18N LFM="False"/> 16 | </i18n> 17 | <VersionInfo> 18 | <StringTable ProductVersion=""/> 19 | </VersionInfo> 20 | <BuildModes Count="1"> 21 | <Item1 Name="Default" Default="True"/> 22 | </BuildModes> 23 | <PublishOptions> 24 | <Version Value="2"/> 25 | </PublishOptions> 26 | <RunParams> 27 | <local> 28 | <FormatVersion Value="1"/> 29 | </local> 30 | </RunParams> 31 | <RequiredPackages Count="3"> 32 | <Item1> 33 | <PackageName Value="simpleai_package"/> 34 | </Item1> 35 | <Item2> 36 | <PackageName Value="SynEdit"/> 37 | </Item2> 38 | <Item3> 39 | <PackageName Value="LCL"/> 40 | </Item3> 41 | </RequiredPackages> 42 | <Units Count="2"> 43 | <Unit0> 44 | <Filename Value="nlptester.lpr"/> 45 | <IsPartOfProject Value="True"/> 46 | </Unit0> 47 | <Unit1> 48 | <Filename Value="app.pas"/> 49 | <IsPartOfProject Value="True"/> 50 | <ComponentName Value="fApp"/> 51 | <HasResources Value="True"/> 52 | <ResourceBaseClass Value="Form"/> 53 | </Unit1> 54 | </Units> 55 | </ProjectOptions> 56 | <CompilerOptions> 57 | <Version Value="11"/> 58 | <PathDelim Value="\"/> 59 | <Target> 60 | <Filename Value="nlptester"/> 61 | </Target> 62 | <SearchPaths> 63 | <IncludeFiles Value="$(ProjOutDir)"/> 64 | <UnitOutputDirectory Value="lib\$(TargetCPU)-$(TargetOS)"/> 65 | </SearchPaths> 66 | <Linking> 67 | <Options> 68 | <Win32> 69 | <GraphicApplication Value="True"/> 70 | </Win32> 71 | </Options> 72 | </Linking> 73 | </CompilerOptions> 74 | <Debugging> 75 | <Exceptions Count="3"> 76 | <Item1> 77 | <Name Value="EAbort"/> 78 | </Item1> 79 | <Item2> 80 | <Name Value="ECodetoolError"/> 81 | </Item2> 82 | <Item3> 83 | <Name Value="EFOpenError"/> 84 | </Item3> 85 | </Exceptions> 86 | </Debugging> 87 | </CONFIG> 88 | -------------------------------------------------------------------------------- /source/example/NLP Test-Desktop/nlptester.lpr: -------------------------------------------------------------------------------- 1 | program nlptester; 2 | 3 | {$mode objfpc}{$H+} 4 | 5 | uses 6 | {$IFDEF UNIX}{$IFDEF UseCThreads} 7 | cthreads, 8 | {$ENDIF}{$ENDIF} 9 | Interfaces, // this includes the LCL widgetset 10 | Forms, app 11 | { you can add units after this }; 12 | 13 | {$R *.res} 14 | 15 | begin 16 | RequireDerivedFormResource:=True; 17 | Application.Initialize; 18 | Application.CreateForm(TfApp, fApp); 19 | Application.Run; 20 | end. 21 | 22 | -------------------------------------------------------------------------------- /source/example/NLP Test-Desktop/nlptester.res: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/luridarmawan/SimpleAI/e928d0c29b972c7c58ac15986f6985d002aa93bf/source/example/NLP Test-Desktop/nlptester.res -------------------------------------------------------------------------------- /source/example/webservice/README.md: -------------------------------------------------------------------------------- 1 | # WebService example 2 | 3 | 4 | 5 | 6 | ## How to use it 7 | 8 | Langkah-langkah umum dalam deploy webservice NLP ini : 9 | 10 | 1. Copy file-file nlp data ke folder `public_html\files\nlp` 11 | 2. Compile NLP source yang ada di folder `source\nlp` 12 | akan terbentuk file `nlp.bin` di folder `public_html` 13 | 3. Buat virtual hosting di apache yang mengarah ke folder public_html 14 | 4. Akses nlp service ini dengan format 15 | http://your-url/?text=hi%20apa%20kabar 16 | 17 | 18 | 19 | ### Requirements 20 | 21 | - FastPlaz_runtime 22 | - SimpleAI package 23 | 24 | 25 | -------------------------------------------------------------------------------- /source/example/webservice/public_html/.htaccess: -------------------------------------------------------------------------------- 1 | 2 | # Generated by FastPlaz 3 | 4 | RewriteEngine On 5 | AddHandler cgi-script .cgi 6 | AddHandler cgi-script .bin 7 | AddHandler cgi-script .pas 8 | AddHandler cgi-script .exe 9 | Options +ExecCGI 10 | 11 | DirectoryIndex nlp.bin 12 | 13 | SetEnvIf Authorization "(.*)" Authorization=$1 14 | SetEnvIf ClientID "(.*)" ClientID=$1 15 | SetEnvIf Token "(.*)" Token=$1 16 | 17 | SetEnvIf Authorization "(.*)" Authorization=$1 18 | 19 | # 20 | RewriteCond %{REQUEST_FILENAME} -d [OR] 21 | RewriteCond %{REQUEST_FILENAME} -f [OR] 22 | RewriteCond %{REQUEST_FILENAME} -l 23 | RewriteRule ^(.*)$ - [NC,L] 24 | #RewriteRule ^(.*)$ 404.php [QSA,L] 25 | RewriteRule ^(.*)$ nlp.bin/$1 [QSA,L] 26 | 27 | -------------------------------------------------------------------------------- /source/example/webservice/public_html/config/.htaccess: -------------------------------------------------------------------------------- 1 | deny from all 2 | <FilesMatch "\.(css|js|png|gif|jpg|ico|swf|flv|eot|woff|ttf|svg)$"> 3 | order allow,deny 4 | allow from all 5 | </filesmatch> 6 | -------------------------------------------------------------------------------- /source/example/webservice/public_html/config/config.json: -------------------------------------------------------------------------------- 1 | { 2 | "systems": { 3 | "sitename": "Simple NLP Test", 4 | "slogan": "Simple NLP Test with FastPlaz", 5 | "baseurl": "", 6 | "admin_email": "webmaster@coba.com", 7 | "development": true, 8 | "debug": false, 9 | "module_default": "main", 10 | "language_default": "id", 11 | "theme_enable": false, 12 | "theme": "default", 13 | "cache": "none", 14 | "temp": "ztemp", 15 | "error_url": "\/", 16 | "session_timeout": 0, 17 | "error_redirect": false 18 | }, 19 | "database": { 20 | "default": { 21 | "driver": "MySQL 5.5", 22 | "hostname": "localhost", 23 | "port": "", 24 | "username": "your_username", 25 | "password": "your_password", 26 | "database_name": "your_database", 27 | "prefix": "", 28 | "library": "..\/libs\/win\/libmysql.dll" 29 | } 30 | }, 31 | "mailer": { 32 | "default": { 33 | "hostname": "your.smtp.server", 34 | "username": "your_username", 35 | "password": "the_password", 36 | "smtp_port": "465", 37 | "ssl": true, 38 | "tls": true 39 | } 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /source/example/webservice/public_html/config/index.html: -------------------------------------------------------------------------------- 1 | http://www.fastplaz.com 2 | -------------------------------------------------------------------------------- /source/example/webservice/public_html/files/.htaccess: -------------------------------------------------------------------------------- 1 | deny from all 2 | <FilesMatch "\.(css|js|png|gif|jpg|ico|swf|flv|eot|woff|ttf|svg)$"> 3 | order allow,deny 4 | allow from all 5 | </filesmatch> 6 | -------------------------------------------------------------------------------- /source/example/webservice/public_html/files/index.html: -------------------------------------------------------------------------------- 1 | http://www.fastplaz.com 2 | -------------------------------------------------------------------------------- /source/example/webservice/public_html/files/nlp/ai-entities.txt: -------------------------------------------------------------------------------- 1 | [Example] 2 | action=example 3 | say=example 4 | 5 | [WordCencor] 6 | gila=gila|gendeng|crazy|pea|kampret 7 | binatang=asu|anjing|babi 8 | lainnya=tai|taek|eek|pret|setan|kakeane|dancuk|jiancuk 9 | sexuality=kontol|ngentu|bawuk|ngentot 10 | wtf=what the fuck|fuck|wtf 11 | 12 | [Greeting] 13 | hi=hi|hii|hai|hei|halo|hallo|halow|hallow|hellow|hola|hox|hy 14 | salam=salam kenal|salam 15 | yo=yo|yoyoi 16 | jawa=kulonuwun|nuwun 17 | 18 | [SalamMuslim] 19 | salam=assalamualaikum|assalamu'alaikum|assalamualaykum|assalamu'alaykum|assalamu alaikum 20 | salamlengkap=assalamu alaikum wa rahmatullah|assalamu'alaikum wa rahmatullah 21 | 22 | [SalamArabic] 23 | salam1=ﷵ 24 | 25 | [Sapaan] 26 | aku=aku|saya|sy|gue|gwe|gw|akyu|ane|私 27 | kamu=kamu|kmu|mu|kamyu|kau|dikau|engkau|ngkau|anda|lu|loe|ente|sampean|samean 28 | dia=om|mbah|pak|mas|pakdhe|kak|kakak|mas|bu|ibu|dek 29 | kakak=kk 30 | 31 | [HalTerlarang] 32 | narkoba=ganja|inex|narkoba|morfin|candu 33 | miras=bir|wiski|vodka 34 | mabuk=mabuk|mabok 35 | sex=kentu|ngentot|ml|sex|homo|lesbian|lesbi 36 | 37 | [Keadaan] 38 | baik=baik|sehat|alhamdulillah|kuat|semangat|sembuh 39 | buruk=buruk|sakit|demam|capek|lelah|sepi|pusing|pusing2|mual|mual2 40 | 41 | 42 | [Pasangan] 43 | pasangan=jodoh|pasangan 44 | suami=suami|swami|laki|cowo 45 | istri=istri|bini|wife|cewe 46 | pacar=pacar 47 | 48 | [Abaikan] 49 | yuk=dong|yuk 50 | 51 | [TanyaLokasi] 52 | dimana=di mana|dimana 53 | 54 | [Pembayaran] 55 | cicilan=cicilan|cicil|angsuran|angsur|installment|instalment 56 | tunai=tunai 57 | 58 | [Tanya] 59 | tandatanya=\? 60 | siapa=siapa|syapa|sapa 61 | apa=apa|apakah|pa 62 | mengapa=mengapa|ngapa|napa|kenapa|knp|why 63 | berapa=berapa|brp|brapa|piro 64 | bagaimana=bagaimana|gimana|gmn|bgmn|bgm|how 65 | bisa=bisakah|bisa|boleh|bolehkan|bolehkan 66 | mau=mau|bersedia 67 | ngapain=ngapain 68 | kapan=kapan|kpn 69 | 70 | [Perintah] 71 | cari=cariin|carikan|cari|temukan 72 | beli=belikan|beli|blikan|beliin|pesan|pesen|pesan|pesenin|pesanin 73 | jual=jual|jualin 74 | buat=mbuat|buatkan|buat|buwat|buatin 75 | hitung=hitung|hitungkan|hitungin|itungin 76 | ambil=ambil|ambilkan 77 | pergi=pergi 78 | 79 | [Respon] 80 | baik=baik|baiklah|okey|okeh|oke|okelah|ok|sip|sipp|senang|seneng|yoi|terima kasih|terima ksh|makasih|trm ksh|thx|thanks|silahkan|selow|woles|slow|iya|ya|yak|oiyah|tentu|thank|thx|cakep 81 | buruk=mbuh|tauah|tauk|ga tau|ngga tau|entahlah|gaje|gajelas|karepmu|auah|au ah|ga asik|gak asik|gak asyik|goblok|sombong|sontoloyo|asem|terserah|dasar|iyalah 82 | maklum=maklumi|maklum 83 | gemblung=gemblung|gokil|bego|parah|gandeng|songong|setres|stres|stress|ngeyel 84 | 85 | [Logika] 86 | ya=iyak|yak|yak|iyes|yes 87 | tidak=tidak|tdk|nggak|gak|ga|enggak 88 | 89 | [Waktu] 90 | jam=jam 91 | hari=hari|hr 92 | minggu=minggu 93 | bulan=bulan|bln 94 | tahun=tahun|thn 95 | tanggal=tanggal|tgl 96 | waktu=pagi|siang|sore|petang|malam|malem|morning|night 97 | 98 | [Kondisi] 99 | jika=jika|kalau|kalaw|kalo|klo|apabila|bila 100 | 101 | [RutinitasHarian] 102 | makan=makan|mangan|maem|mkan|makanan 103 | minum=minum|mnum|minuman 104 | mandi=mandi|mndi 105 | tidur=tidur|turu|bobo 106 | kerja=kerja|gawe 107 | 108 | [Aktivitas] 109 | laku=lakukan|jalani|perbuat 110 | belajar=belajar|blajar 111 | 112 | [PersonalStatus] 113 | nikah=nikah|menikah|merid|married|meried 114 | single=jomblo|single|gadis|gds|lajang|perjaka|homo|jablai 115 | 116 | [Umur] 117 | umur=umur|usia 118 | umurmu=umurmu 119 | 120 | [JenisKelamin] 121 | laki=laki-laki|laki laki|laki|lanang|lelaki 122 | perempuan=perempuan|gadis|ibu 123 | 124 | [PersonalKnowledge] 125 | tahu=kenal|tau|tahu|ngerti|ngertiin 126 | 127 | [HargaLevel] 128 | mahal=paling mahal|termahal|mahal|mhal 129 | murah=paling murah|termurah|murah|mrah 130 | 131 | [Nominal] 132 | nominal=.*\d 133 | range=kisaran|seharga|seputar|harga 134 | harga=harga|hrga 135 | 136 | [RangeNilai] 137 | minimal=minimal|min|mulai dari|mulai|terendah 138 | maksimal=maksimal|maximal|max|dibawah|di bawah|dibaah|kurang dari|kurang|tidak lebih dari|tdk lebih dr|tidak lebih|tdk lebih|tertinggi 139 | 140 | [Angka] 141 | angka=.*\d 142 | angkasatuan=satu|dua|tiga|empat|lima|enam|tujuh|delapan|sembilan|sepuluh|seratus|seribu|sejuta 143 | 144 | [Satuan] 145 | ribu=ribu|rb 146 | juta=juta|jt 147 | milyar=milyar|milyr|miliar 148 | 149 | [Kencantikan] 150 | baik=ngganteng|ganteng|cantik|keren|hebat|powerful|top|pinter|pintar|cakep 151 | buruk=jelek|songong|gila|budeg|bodoh 152 | 153 | [Perasaan] 154 | tidak=benci|jijay|ga suka|ga seneng 155 | baik=suka|demen|seneng|kesengsem|trisna|love 156 | 157 | [Ekspresi] 158 | baik=haha|hehe|hihi|hoho|wkwk|muachhh|muatih 159 | kaget=eehh|ehh|wow 160 | 161 | [Keraguan] 162 | kok=kok|koq|lhoo|lho|lah|oya|ohya|masa sih|masa 163 | 164 | [Sifat] 165 | baik=baik|super|luar biasa|hebat|keren|cool|pinter|cerdas 166 | buruk=jahat|genit|bodoh|goblok|jelek 167 | 168 | [Figure] 169 | presiden=soekarno|soeharto|sby|jokowi|megawati|prabowo|jkw 170 | pahlawan=pattimura|diponegoro|kartini 171 | jagoan123=ansori|encang|ihdi|oka|abi|ines 172 | dev=peter|bams|bambang|anne|deroh|ratu|yudi|joko 173 | devpascal=indra|tigor|derit|kofa|maskofa 174 | CafeStartup=temmy|gisela|gisel|bontot|wiwin 175 | 176 | [Profesi] 177 | pembantu=pembantu 178 | karyawan=karyawan 179 | programmer=developer|programmer|tukang ketik 180 | prt=pembantu rumah tangga|prt|pembantu rmh tangga 181 | dokter=dokter|dok 182 | swasta=swasta 183 | pns=pegawai negeri|pgw negeri|pegawai negri|pgw negri 184 | 185 | [MelakukanSesuatu] 186 | hubungi=menghubungi|hubungi|ngubungin|kontak 187 | belajar=belajar 188 | ngopi=ngopi 189 | 190 | [Sedang] 191 | sudah=sdh|sudah|sdah|udah 192 | sedang=sedang|sdg|lagi|lg 193 | akan=akan|mau|mo 194 | 195 | [Tolong] 196 | tolong=tolong|tulung|tolongin 197 | help=help 198 | 199 | [NoRespon] 200 | responthx=sama-sama|sama sama|sama|sama2 201 | 202 | [TandaBaca] 203 | tanya=\? 204 | titik=. 205 | koma=, 206 | seru=\! 207 | 208 | -------------------------------------------------------------------------------- /source/example/webservice/public_html/files/nlp/ai-intents.txt: -------------------------------------------------------------------------------- 1 | [ExamplePattern] 2 | action=example 3 | say=@Example 4 | 5 | [WordCencor] 6 | say=@WordCencor 7 | 8 | [Test1] 9 | say=test 10 | 11 | [ResponBaik] 12 | say=^@Respon:baik 13 | say=^@Respon:maklum 14 | 15 | [ResponBuruk] 16 | say=@Respon:buruk 17 | say=@Logika:tidak @Tanya:bisa 18 | say=@Logika:tidak usah 19 | say=^@Logika:tidak 20 | say=@Respon:gemblung 21 | 22 | [HubungiSupport] 23 | say=@Tanya:bagaimana @Sapaan:aku @MelakukanSesuatu:hubungi support 24 | say=@Tanya:bagaimana @Sapaan:aku @MelakukanSesuatu:hubungi 25 | 26 | [PembantuCari] 27 | say=@Profesi:pembantu @PropertyType:rumah tangga 28 | say=pembantu rumah tangga 29 | 30 | [Sanjungan] 31 | say=@Sapaan:kamu @apapun @Kencantikan:baik 32 | say=@Sapaan:kamu @Kencantikan:baik 33 | say=@Sapaan:kamu @apapun @Sifat:baik 34 | say=@Sapaan:kamu @Sifat:baik 35 | 36 | [Mengeluh] 37 | say=(kok|koq) gitu 38 | say=@Tanya:bagaimana sih 39 | say=capek (ahh|deh) 40 | 41 | [TelegramBotStart] 42 | action=telegram_menu 43 | say=/start 44 | 45 | [ResiPaket] 46 | action=resi_paket 47 | say=resi @vendor @nomor 48 | 49 | [Kamus] 50 | action=kamus 51 | object=kamus 52 | say1=apa itu @word 53 | say2=^@word (artinya|arti|maksud|maksudnya|kamus) 54 | say2=^(artinya|arti|maksud|maksudnya|kamus) @word 55 | say4=@word (artinya|arti|maksud|maksudnya|kamus) 56 | say3=(artinya|arti|maksud|maksudnya|kamus) @word 57 | 58 | [Larangan] 59 | say=(jangan|jgn) @apapun 60 | 61 | [Ajakan] 62 | say=@word (yuk|yuukk|yok) 63 | 64 | [xxxx] 65 | say=xxx 66 | 67 | [SuggestionResponse] 68 | action=suggestion 69 | say=(suggest|saran|teach) @answer : @question 70 | say=(suggest|saran|teach) @answer: @question 71 | 72 | [CarikStart] 73 | action=carik_start 74 | say=mulai (catat|catet) 75 | say=(rekam|catat|catet|mulai|start) (kulwap|obrolan|diskusi|rapat|rekaman|rekam|catatan|catat|notulen|nyatet) 76 | say=(kulwap|obrolan|diskusi|rapat|rekaman|rekam|catatan|catat|notulen|nyatet) (mulai|dimulai|start|dicatat|dicatet) 77 | say=(mulai|start) (kulwap|obrolan|diskusi|rapat|rekaman|rekam|catatan|catat|notulen|nyatet) 78 | 79 | [CarikStop] 80 | action=carik_stop 81 | say=(kulwap|obrolan|diskusi|rapat|rekaman|rekam|catatan|catat|notulen|nyatet) (dihentikan|stop|berhenti) 82 | say=(dihentikan|stop|berhenti|hentikan) (kulwap|obrolan|diskusi|rapat|rekaman|rekam|catatan|catat|notulen|nyatet) 83 | 84 | [CarikSend] 85 | action=carik_send 86 | say=kirimkan rekaman ke @email 87 | say=rekaman kirim ke @email 88 | 89 | [CariCheck] 90 | action=carik_check 91 | say=sedang (nyatet|catet|rekam) 92 | 93 | 94 | [SholatJadwal] 95 | action=jadwal_sholat 96 | say=jadwalsholat @kota 97 | say=jadwalsholat 98 | say=(jadwal|jadual) sholat (untuk|utk|kota) @kota 99 | say=(jadwal|jadual) sholat @kota 100 | say=(jadwal|jadual) sholat 101 | 102 | [Lahir] 103 | object=lahir 104 | say=@Sapaan:kamu lahir 105 | say=@Sapaan:kamu lahirnya 106 | 107 | [NoEnglish] 108 | say=are you speaking english 109 | say=speaking english 110 | say=speak english 111 | 112 | [CariJodoh] 113 | object=jodoh 114 | say=@Perintah:cari @Pasangan 115 | say=@Pasangan:pasangan 116 | 117 | [CariJodohKriteria] 118 | object=jodoh 119 | say=yang @Kencantikan 120 | 121 | [TanyaPasanganSeseorang] 122 | say=@Tanya:siapa @Pasangan @seseorang 123 | say=@Pasangan @seseorang 124 | 125 | [Lulus] 126 | say=@Tanya:kapan @siapapun (lulus|wisusda|meninggal|mati) 127 | say=@Tanya:kapan (lulus|wisuda|meninggal|mati) 128 | 129 | [Nikah] 130 | say=@Tanya:kapan @siapapun @PersonalStatus:status 131 | say=@Tanya:kapan @PersonalStatus:status 132 | 133 | [Kencan] 134 | say=@Sapaan:aku kencan 135 | say=kencan 136 | say=@Sapaan:kamu lamar 137 | say=jalan2 138 | 139 | [HalTerlarang] 140 | say=@Perintah @HalTerlarang 141 | say=@HalTerlarang 142 | 143 | [KeadaanBaik] 144 | say=@Sapaan:kamu @Keadaan:baik 145 | say=@Keadaan:baik 146 | 147 | [KeadaanBuruk] 148 | say=@Sapaan:kamu @Keadaan:buruk 149 | say=@Keadaan:buruk 150 | say=@Keadaan:buruk @apapun 151 | 152 | 153 | [Menghibur] 154 | say=jangan sedih 155 | say=jgn sedih 156 | say=sayang banget 157 | 158 | [TidakPunyaSesuatu] 159 | say=@Logika:tidak punya @apapun 160 | 161 | 162 | [SuruhanPositif] 163 | say=@MelakukanSesuatu:belajar @apapun rajin 164 | 165 | [Ekspresi] 166 | say=^@Ekspresi 167 | say=^@Keraguan 168 | say=ga pa pa 169 | say=ga papa 170 | say=gpp 171 | say=apaan 172 | say=kepo 173 | say=makanya 174 | say=bawel 175 | 176 | [Greeting] 177 | say=@Greeting apa kabar 178 | say=@Greeting 179 | say=selamat @Waktu 180 | say=how are you 181 | say=how are u 182 | say=how r you 183 | say=@Waktu:waktu 184 | 185 | [SalamMuslim] 186 | say=@SalamMuslim 187 | say=@SalamArabic 188 | 189 | [Perpisahan] 190 | say=selamat tinggal 191 | say=sampai ketemu lagi 192 | say=sampai ketemu 193 | say=sampai jumpa 194 | say=bye 195 | 196 | [Perkenalan] 197 | action=define|Name 198 | say=namaku adalah @Name 199 | say=namaku @Name 200 | say=nama @Sapaan:aku @Name 201 | say=@Name nama @Sapaan:aku 202 | say=@Name namaku 203 | say=^nama @Name 204 | say:Name=^@Sapaan:aku @Name 205 | 206 | [PerkenalanEmail] 207 | action=define|Email 208 | say=email ku @Email 209 | say=emailku @Email 210 | say=email sy @Email 211 | say=email @Email 212 | 213 | [StatusAku] 214 | say=masih @PersonalStatus 215 | say=@Sedang:sudah @PersonalStatus 216 | say=@Sapaan:kamu @PersonalStatus 217 | say=@Sapaan @PersonalStatus 218 | 219 | [Aktivitas] 220 | say=@Sapaan:kamu @Sedang @apapun 221 | say=^@Sedang:sedang @apapun 222 | say=@Sedang:sudah @apapun 223 | 224 | [JenisKelamin] 225 | say=@Tanya:kamu @JenisKelamin 226 | 227 | [Umur] 228 | say=@Tanya:berapa @Umur 229 | say=@Umur @Sapaan:kamu 230 | say=@Umur@Sapaan:kamu 231 | say=@Umur 232 | 233 | [TokohSiapa] 234 | say=@Tanya:siapa @apapun @Figure 235 | say=@Tanya:siapa @Figure 236 | say=@Figure @Tanya:siapa 237 | 238 | [SiapaAku] 239 | say=@Tanya:siapa @Sapaan:aku 240 | 241 | [Siapa] 242 | say=perkenalkan diri 243 | say=boleh kenalan 244 | say=mau kenalan 245 | say=@Tanya:siapa @Sapaan:kamu 246 | say=@Sapaan:kamu @Tanya:siapa 247 | say=@Sapaan:kamu itu @Tanya:siapa 248 | say=@Sapaan:kamu itu @Tanya:apa 249 | say=kenalan @Abaikan 250 | say=@Abaikan kenalan 251 | say=^nama @whatever 252 | 253 | [InginTanya] 254 | say=mau (t|n)anya 255 | say=boleh (t|n)anya 256 | 257 | 258 | [TanyaLokasi] 259 | object=location 260 | say=rumah @Sapaan:kamu @Tanya:dimana 261 | say=rumah@Sapaan:kamu @Tanya:dimana 262 | say=@TanyaLokasi rumah @Sapaan:kamu 263 | say=@TanyaLokasi rumahmu 264 | say=@TanyaLokasi rumah 265 | say=@TanyaLokasi @Sapaan:kamu 266 | say=@Sapaan:kamu @TanyaLokasi 267 | 268 | [Kabar] 269 | say=@Tanya:bagaimana kabar@Sapaan:kamu 270 | say=@Tanya:bagaimana kabar 271 | say=@Tanya:bagaimana @Sapaan:kamu 272 | say=@Tanya:apa kabar@Sapaan:kamu 273 | say=@Tanya:apa kabar 274 | say=@Sapaan:kamu @Tanya:bagaimana 275 | say=kabar@Sapaan:kamu @Tanya:bagaimana 276 | say=kabar @Tanya:bagaimana 277 | 278 | [Cuaca] 279 | action=cuaca 280 | say=@Tanya:bagaimana cuaca 281 | say=cuaca @Tanya 282 | say=suasana @Tanya:bagaimana 283 | say=cuaca 284 | 285 | [Angka] 286 | action=angka 287 | say=@Angka @Satuan 288 | say=@berapapun @Satuan 289 | 290 | [UngkapanBaik] 291 | say=@Sapaan @Sifat:baik 292 | say=@Sifat:baik 293 | say=asik @Logika:tidak 294 | 295 | [UngkapanBuruk] 296 | say=@Sapaan @Sifat:buruk 297 | say=@Sifat:buruk 298 | 299 | [Waktu] 300 | say=@Tanya @Waktu 301 | say=@range @Waktu:-waktu @Tanya:berapa 302 | say=@range @Waktu:-waktu @Tanya:apa 303 | say=@Waktu:-waktu @Tanya:berapa 304 | say=@Waktu:-waktu @Tanya:apa 305 | 306 | [CantikGanteng] 307 | boundary=false 308 | say=@apapun @Kencantikan ya 309 | say=@apapun @Kencantikan ga 310 | say=@apapun @Kencantikan gak 311 | 312 | [YangPaling] 313 | say=yang paling @apapun 314 | say=paling @apapun 315 | 316 | [TanyaTentangTokoh] 317 | say=@Sapaan:kamu @PersonalKnowledge @apapun @Figure 318 | say=@Sapaan:kamu @PersonalKnowledge @Figure 319 | say=@PersonalKnowledge @sebutan @Figure 320 | say=@PersonalKnowledge @Figure 321 | 322 | [TanyaTentangTokohTidakDikenal] 323 | say=@Tanya:siapa @siapapun 324 | say=@Sapaan:kamu @PersonalKnowledge @siapapun 325 | say=@PersonalKnowledge @siapapun 326 | 327 | [LoremIpsum] 328 | say=lorem ipsum 329 | say=loremipsum 330 | 331 | [Math] 332 | action=math 333 | object=berhitung 334 | boundary=false 335 | say=@Tanya:berapa @Formula 336 | say=@Perintah:hitung @Formula 337 | 338 | 339 | [TanyaSeandainya] 340 | say=@Tanya:bagaimana @Kondisi:jika @apapun 341 | 342 | [TidakYakin] 343 | say=@apapun @Logika:tidak @PersonalKnowledge:tahu 344 | say=beneran 345 | 346 | [Deskripsi] 347 | action=define 348 | say=@Key itu adalah @Value 349 | say=@Key adalah @Value 350 | say=@Key adl @Value 351 | say=@Key itu @Value 352 | say=@Key = @Value 353 | say=@Key=@Value 354 | 355 | [KenapaDisimpan] 356 | say=@Tanya:mengapa kok disimpan 357 | say=@Tanya:mengapa @apapun 358 | 359 | [telolet] 360 | say=om telolet om 361 | say=omteloletom 362 | say=telolet 363 | 364 | [DomainWhois] 365 | action=domain_whois 366 | say=whois domain @domain @option 367 | say=whois domain @domain 368 | say=whois @domain @option 369 | say=whois @domain 370 | say=who is @domain 371 | 372 | [Cari] 373 | action=cari 374 | say=@Perintah:cari 375 | 376 | [EmailBuat] 377 | object=email 378 | say=@Perintah:buat @Sapaan:aku email 379 | say=@Perintah:buat email 380 | 381 | [MakanBuat] 382 | object=makanan 383 | say=@Perintah:buat @Sapaan:aku @RutinitasHarian:makan 384 | say=@Perintah:buat @Sapaan:aku @RutinitasHarian:minum 385 | say=@Perintah:buat @RutinitasHarian:makan 386 | say=@Perintah:buat @RutinitasHarian:minum 387 | 388 | [MakanBeli] 389 | action=footorder 390 | object=makanan 391 | say=@Perintah:beli @Sapaan:aku @RutinitasHarian:makan 392 | say=@Perintah:beli @Sapaan:aku @RutinitasHarian:minum 393 | say=@Perintah:beli @RutinitasHarian:makan 394 | say=@Perintah:beli @RutinitasHarian:minum 395 | 396 | [PulsaBeli] 397 | action=pulsaorder 398 | object=pulsa 399 | say=@Perintah:beli @Sapaan:aku pulsa 400 | say=@Perintah:beli pulsa 401 | 402 | [MintaTolong] 403 | say=@Tolong 404 | 405 | [BisaApa] 406 | say=bisa @Sapaan:kamu @Lakukan 407 | say=@Sapaan:kamu bisa @Tanya:apa 408 | say=@Tanya:bisa @Tanya:apa 409 | say=@Tanya:bisa @apapun 410 | 411 | [Hadir] 412 | say=ternyata ada di sini 413 | say=ternyata ada disini 414 | say=ada di sini ternyata 415 | say=ada disini ternyata 416 | 417 | [KataTanyaSaja] 418 | say=^@Tanya 419 | say=@Tanya:ngapain 420 | 421 | [PerintahSaja] 422 | say=@Perintah 423 | 424 | [NoRespon] 425 | say=^@NoRespon 426 | say=emailnya disimpan 427 | 428 | [TandaBaca] 429 | say=^@TandaBaca 430 | 431 | [Browse] 432 | action=url|post|http://local-echo.fastplaz.com/?var1=value 433 | say=browse @whatever 434 | 435 | -------------------------------------------------------------------------------- /source/example/webservice/public_html/files/nlp/ai-questions.txt: -------------------------------------------------------------------------------- 1 | 2 | [TanyaNama] 3 | ask:Name=Bisa diinformasikan nama Anda siapa? 4 | ask:Name=Nama Anda siapa? 5 | ask:Name=Siapa nama Anda? 6 | 7 | [TanyaEmail] 8 | ask:Name=Bisa diinformasikan Email Anda apa? 9 | 10 | [TanyaNamaResponse] 11 | ask=Hi %Name%, terima kasih 12 | -------------------------------------------------------------------------------- /source/example/webservice/public_html/files/nlp/ai-response.txt: -------------------------------------------------------------------------------- 1 | [Test1] 2 | say=hai %Name% 3 | say=wow 4 | 5 | [Introduction] 6 | aboutme=\nPerkenalkan, saya adalah robot penjawab pesan otomatis.\nSaya akan berusaha membantu anda.\nMohon Maaf jika ada yang kurang bisa saya pahami nanti. 7 | firstsession=\n\nSepertinya kita belum pernah bertemu. 8 | secondsession=Senang bisa berjumpa lagi dengan anda. 9 | 10 | [WordCencor] 11 | say=Mungkin bisa digunakan alternatif kalimat yang lain. 12 | say=Maaf, sepertinya akan lebih baik jika menggunakan kata-kata yg lebih sopan 13 | say=Maaf jika pada kondisi tertentu, sepertinya saya tidak merespon Anda. 14 | say=Sayang sekali, mungkin bisa gunakan kata-kata yg lebih baik 15 | 16 | [Greeting] 17 | say=Hi, selamat %time_session% ... 18 | say=Halo, selamat %time_session% ... 19 | say=Hi, salam jumpa ... 20 | say=Hai juga. Kabar baik di sini, semoga kabar baik juga di sana 21 | say=Selamat %time_session% ... 22 | 23 | [SalamMuslim] 24 | say=Wa alaikumsalam 25 | say=Wa alaikumsalam wr wb 26 | say=Wa alaikumsalam Warahmatullahi Wabarakatuh 27 | 28 | [Perpisahan] 29 | say=Sampai ketemu lagi 30 | say=Terima kasih, sampai jumpa lagi 31 | say=Bye, terima kasih 32 | say=bye bye, thanks 33 | 34 | [nonewithobject] 35 | say=... maaf, apakah kita masih membicarakan tentang %object% ? 36 | say=ini masih tentang %object% ? 37 | say=maaf belum paham, ini masih pembicaraan tentang %object% ? 38 | 39 | [none] 40 | say=... maaf jika saya belum banyak memahami kata2 yang ada 41 | say=... percakapan ini kami simpan dahulu, untuk perbendaharaan kata2 saya 42 | say=... bagaimana? 43 | say=... boleh diulang lagi? 44 | 45 | [Waktu] 46 | say=%time% 47 | 48 | [HubungiSupport] 49 | say=silahkan hubungi info kontak yang tercantum di halaman situs kami 50 | say=coba hubungi nomor telpon atau email yang tercantum di halaman situs kami 51 | 52 | [Siapa] 53 | say=Saya adalah BOT. Mesin penjawab otomatis yang akan berkomunikasi singkat dengan Anda. 54 | say=Saya %AIName%, BOT Chat. Jika ada pertanyaan yang lebih spesifik, sebaiknya menghubungi layanan support yang lainnya. 55 | say=Anda boleh panggil saya %AIName% 56 | say=Saya mesin AI, panggil saya %AIName%. \n\nUntuk hal yang lebih spesifik, silahkan hubungi support kami. 57 | 58 | [BisaApa] 59 | say=Saya adalah BOT. saya coba sebisanya 60 | say=Saya masih belajar, masih belum bisa apa2 61 | say=Mungkin saat ini belum 62 | 63 | [SiapaAku] 64 | say=Anda pelanggan kami 65 | say=maaf jika saya belum mengenal anda dengan baik 66 | say=mungkin bisa diperkenalkan, Anda siapa? 67 | say=.......... 68 | 69 | [KenapaDisimpan] 70 | say=untuk perbendaharaan kata2 saya nanti 71 | say=untuk saya pelajari nanti, agar lebih responsif meresepon anda 72 | say=saya masih belajar, masih perlu informasi lebih banyak lagi 73 | 74 | [JenisKelamin] 75 | say=Sepertinya tidak relevan saya untuk menjawabnya 76 | say=Apakah ada urgensinya untuk menjawab ini 77 | say=Saya ini mesin otomasi, status tentang saya sepertinya tidak perlu dipertanyakan 78 | say=Saya ROBOT, status tentang saya seharusnya bukan jadi masalah 79 | say=Seandainya saja menjadi yang mudah untuk disampaikan :( 80 | 81 | [Umur] 82 | say=saya masih muda sekali 83 | say=baru seumur jagung 84 | say=bingung menjawabnya 85 | say=belum seberapa sih 86 | 87 | [StatusAku] 88 | say=Sepertinya tidak relevan saya untuk menjawabnya 89 | say=Apakah ada urgensinya untuk menjawab ini 90 | say=Saya ini mesin otomasi, status tentang saya sepertinya tidak perlu dipertanyakan 91 | say=Saya ROBOT, status tentang saya seharusnya bukan jadi masalah 92 | say=Seandainya saja menjadi yang mudah untuk disampaikan :( 93 | 94 | [Aktivitas] 95 | say=mempelajari tentang AI 96 | say=menikmakti kehidupan ini 97 | say=berharap bisa leluasa berinteraksi seperti anda 98 | say=senang seandainya bisa seperti orang-orang yang lain 99 | 100 | [TanyaLokasi] 101 | say=Tidak jauh kok 102 | say=Saya bisa ada dimana saja 103 | say=Hhhmm... agak sulit juga menjawabnya... 104 | 105 | [TokohSiapa] 106 | say=sepertinya dia %Figure% 107 | 108 | [CantikGanteng] 109 | say=kurang tau juga 110 | say=sulit memperkirakannya 111 | say=mesti dipikir-pikir dulu 112 | say=saya kurang yakin 113 | say=entahlah ... 114 | 115 | [YangPaling] 116 | say=kurang tau juga 117 | say=mungkin Anda? 118 | say=jangan-jangan Anda? 119 | say=aku dong yang paling cuakeppp... muachhh 💋 120 | say=sulit memperkirakannya 121 | say=mesti dipikir-pikir dulu 122 | say=yang pasti bukan saya 123 | say=sepertinya bukan Anda 124 | 125 | [TanyaTentangTokoh] 126 | say=Sepertinya tokoh terkenal 127 | say=Terdengar familiar 128 | say=Banyak orang mengenalnya 129 | say=Layak untuk jadi panutan 130 | say=Prestasinya luar biasa 131 | 132 | [TanyaTentangTokohTidakDikenal] 133 | say=Maaf, sepertinya saya belum pernah jumpa dia 134 | say=Belum pernah jumpa dia 135 | say=Kurang tau juga 136 | say=Orang penting yaa ... 137 | say=Belum familiar dengan dia 138 | say=mmmmmhhh.... saya harus cari dulu .. 139 | 140 | [TanyaDiriSendiriPositif] 141 | say=Entahlah ... 142 | say=Saya tidak dalam posisi untuk menyatakan itu 143 | say=Kerendehan hati sungguh amat sangat dihargai 144 | say=eheemmm.... 145 | say=Banyak orang bilang demikian 146 | 147 | [TanyaDiriSendiriNegatif] 148 | say=Entahlah ... 149 | say=Saya tidak dalam posisi untuk menyatakan itu 150 | say=Ada baiknya kita mesti percaya diri 151 | say=Sepantasnya harus meyakini diri 152 | 153 | [Ekspresi] 154 | say=hehehe 155 | say=hhmm... 156 | say=:) 157 | 158 | [Sanjungan] 159 | say=Terima kasih, semoga demikian juga dengan kamu 160 | say=Semoga tidak membuat saya lupa diri 161 | say=Kerendehan hati sungguh amat sangat dihargai 162 | say=Demikian juga dengan kamu 163 | say=Harapan saya bisa memberikan yang selalu lebih baik 164 | 165 | [Mengeluh] 166 | say=Maaf 167 | say=Hanya berusaha memberikan yang terbaik 168 | 169 | [SuruhanPositif] 170 | say=Saya akan coba melakukan dengan lebih baik 171 | say=Terima kasih, mohon bimbingannya 172 | say=Siap, semoga bisa saya jalani 173 | say=Mohon dukungannya. terima kasih 174 | 175 | [PernyataanSuka] 176 | say=Entahlah ... 177 | say=Kerendehan hati sungguh amat sangat dihargai 178 | say=eheemmm.... 179 | say=Banyak orang bilang demikian 180 | say=Demikian juga dengan kamu 181 | 182 | [MelakukanSesuatu] 183 | say=Sepertinya menarik 184 | say=Sepertinya menyenangkan 185 | say=Nikmat sekali sepertinya 186 | say=Boleh juga 187 | 188 | [Ajakan] 189 | say=Sepertinya menarik 190 | say=Sepertinya menyenangkan 191 | say=Nikmat sekali sepertinya 192 | say=Boleh juga 193 | 194 | [Kabar] 195 | say=Saya baik-baik saja 196 | say=Semangat sekali hari ini 197 | say=sehat 198 | say=Kabar baik di sini 199 | 200 | [Cuaca] 201 | say=Sepertinya menyenangkan 202 | say=Terasa sejuk disini 203 | say=Cerah secerah harapan 204 | say=Nyaman rasanya 205 | 206 | [Keraguan] 207 | say=begitulah ... 208 | say=Mesti berposotif thingking 209 | 210 | [PerkenalanResponse] 211 | say=Hi %Name%, terima kasih 212 | say=%Name%, sepertinya nama yang familiar 213 | say=%Name%, nama yang menarik 214 | say=%Name%, terdengar familiar 215 | 216 | [PerkenalanEmailResponse] 217 | say=Hi %Name%, email anda (%Email%) telah kami simpan 218 | 219 | [TanyaEmailResponse] 220 | say=Hi %Name%, email anda (%Email%) telah kami simpan. 221 | 222 | [DeskripsiResponse] 223 | say=Informasi tentang %Key% akan saya pelajari dulu 224 | say=baiklah... saya coba memahami dulu tentang %Key% 225 | say=hal baru untuk saya.\nsaya akan simpan dulu %Key% di perbendaharaan saya. 226 | 227 | [HalBaru-sepertinyatidakterpakai] 228 | say=baiklah... saya coba memahami dulu tentang %word% 229 | say=hal baru untuk saya.\nsaya akan simpan dulu %word% di perbendaharaan saya. 230 | 231 | [Cari] 232 | say=Cari tentang apa yaa? 233 | say=Cari apa? 234 | 235 | [PerintahSaja] 236 | say=apa yaa? 237 | say=maaf, saya belum paham. 238 | 239 | [EmailTidakValid] 240 | say=Maaf, sepertinya email anda tidak valid 241 | 242 | [ResponBaik] 243 | say=baiklah 244 | say=syukurlah ... 245 | say=senang mendengarnya 246 | say=terima kasih 247 | 248 | [ResponBuruk] 249 | say=hhmm.. 250 | say=Semoga akan terus membaik hasilnya 251 | say=Sedih merasakannya 252 | say=Seandainya kamu bisa merasakan gerimisnya hati ini 253 | say=Sayang sekali 254 | say=Sayang sekali, bagaimana kalau diusahakan lagi 255 | say=Mohon maaf jika belum sesuai dengan harapan 256 | 257 | [UngkapanBaik] 258 | say=hhmmm.... 259 | say=berharap bisa memberikan sesuatu yg lebih baik lagi 260 | say=dicoba untuk berusaha lebih baik lagi 261 | say=terbaik yang bisa dilakukan 262 | say=terus berusaha yang terbaik 263 | 264 | [UngkapanBuruk] 265 | say=Maaf .. 266 | say=berharap bisa memberikan sesuatu yg lebih baik lagi 267 | say=dicoba untuk berusaha lebih baik lagi 268 | say=terbaik yang bisa dilakukan 269 | say=terus berusaha yang terbaik 270 | 271 | [InginTahu] 272 | say=mmm.. boleh tau apa itu %word% ? 273 | say=%word% ... apa itu? 274 | say=saya belum ada perbendaharaan kata %word%, bisa dijelaskan? 275 | say=tolong jelasin dong apa itu %word% 276 | 277 | [InginTanya] 278 | say=yaa... ada yg bisa saya bantu? 279 | say=bagaimana? 280 | say=silahkan, dengan senang hati 281 | say=boleh 282 | 283 | [TidakYakin] 284 | say=Saya berusaha menyampaikan hal yang saya tahu saja 285 | say=Saya tidak tahu harus mengatakan apa lagi 286 | say=Sungguh 287 | say=Sepertinya demikian 288 | say=Sepengetahuan saya begitu 289 | 290 | [TanyaSeandainya] 291 | say=saya coba pikir-pikir dulu 292 | say=saya kurang paham 293 | say=mmmmhh.... gimana yaa... 294 | say=sepertinya belum memungkinkan 295 | say=bagaimana kalau sebaliknya saja? 296 | say=agak sulit juga yaa... 297 | 298 | [KataTanyaSaja] 299 | say=apa? 300 | say=apa yaa? 301 | say=bagaimana? 302 | say=%Tanya_value% apanya? 303 | say=Tentang apa? 304 | 305 | [MintaTolong] 306 | say=bagaimana? 307 | say=apa yang bisa saya bantu? 308 | say=ada yg bisa dibantu? 309 | say=bagaimana? 310 | 311 | [TelegramBotStart] 312 | say=Hi, Selamat %time_session%.\nSelamat datang di layanan ChatBot kami.\nApa kabar? 313 | 314 | [Larangan] 315 | say=Oke 316 | say=Saya usahkan 317 | say=Baiklah 318 | say=mmmm... duhh.. saya usahakan yaa... 319 | 320 | [ResiPaket] 321 | say=Mohon ditunggu, saya cari dahulu .. 322 | say=Tunggu sebentar .. 323 | say=bentar, saya cek dulu 324 | 325 | [xxx] 326 | say=xxxxxx 327 | 328 | [SuggestionResponse] 329 | say=sarannya kami simpan, terima kasih. 330 | say=Terima kasih masukannya 331 | 332 | [CarikStart] 333 | say=tunggu sebentar ... 334 | say=... bentar yaa ... 335 | say=siap-siap dulu .. 336 | 337 | [CarikStop] 338 | say=Oke, siippp... 339 | say=Yak 340 | say=Siap 341 | 342 | [Lahir] 343 | say=belum lama 344 | say=baru-baru saja siihh... 345 | say=kurang tau juga 346 | say=mungkin anda malah lebih tahu 347 | 348 | [NoEnglish] 349 | say=no i cannot 350 | say=of course, i cannot 351 | 352 | [CariJodoh] 353 | say=Yang bagaimana? 354 | say=MMmmm... Sebaiknya bukan dengan saya menyampaikannya 355 | say=Sebaiknya anda bergaul dengan manusia, bukan dengan bot seperti saya 356 | say=Sulit juga 357 | 358 | [CariJodohKriteria] 359 | say=Sepertinya ada 360 | say=Ada sihh... tapi susah juga sepertinya 361 | say=Bukannya banyak di sekitar Anda ? 362 | 363 | [TanyaPasanganSeseorang] 364 | say=Saya belum kenal 365 | say=Kurang tau juga 366 | say=Oohh... sudah punya yaaa.. 367 | say=Saya cari tahu dulu yaa... 368 | 369 | [Nikah] 370 | say=Kalau sudah ada calonnya 371 | say=Kalau sudah ada jodohnya 372 | say=dia sudah yakin? 373 | say=Mesti pikir-pikir dulu 374 | 375 | [Lulus] 376 | say=Kalau sudah waktunya 377 | say=Kurang tahu juga 378 | say=Kurang ingat 379 | say=Saya kurang yakin 380 | 381 | [Kencan] 382 | say=Apa bisa? 383 | say=Yakin? 384 | 385 | [HalTerlarang] 386 | say=Maaf, kami tidak membicarakan hal tersebut di sini 387 | say=Sebaiknya tidak 388 | 389 | [KeadaanBaik] 390 | say=Syukurlah 391 | say=Selalu semangat 392 | say=Semangat selalu 393 | 394 | [KeadaanBuruk] 395 | say=Mesti semangat 396 | say=Harus semangat selalu 397 | say=Harus jaga kondisi selalu 398 | say=Jaga kesehatan 399 | say=jaga diri baik2 400 | say=jaga kesehatanmu 401 | say=semangat yaa 402 | say=mesti semangat 403 | 404 | 405 | [Menghibur] 406 | say=iya, terima kasih 407 | say=tetep semangat kok 408 | say=masih berusaha yang terbaik 409 | 410 | [TidakPunyaSesuatu] 411 | say=Sebaiknya segera dipunyai 412 | say=Sayang sekali 413 | say=Anda lebih tau kebutuhan anda sendiri 414 | 415 | [EmailBuat] 416 | say=Maaf, saya belum bisa 417 | say=Maaf, coba hubungi technical support anda saja 418 | say=Mohon maaf, belum bisa 419 | say=Sayang sekali belum bisa membantu Anda 420 | 421 | [MakanBuat] 422 | say=Maaf, saya belum bisa 423 | say=Mohon maaf, belum bisa 424 | say=Sayang sekali belum bisa membantu Anda 425 | 426 | [MakanBeli] 427 | say=Maaf, saya belum bisa 428 | say=Mohon maaf, belum bisa 429 | say=Sayang sekali belum bisa membantu Anda 430 | say=Sebaiknya anda pesan melalui jasa layanan yang sudah ada. 431 | say=Maaf, belum bisa melayani pembelian makanan 432 | 433 | [PulsaBeli] 434 | say=Maaf, saya belum bisa 435 | say=Mohon maaf, belum bisa 436 | say=Sayang sekali belum bisa membantu Anda 437 | say=Sebaiknya anda pesan melalui jasa layanan yang sudah ada. 438 | say=Maaf, belum bisa melayani pembelian pulsa 439 | 440 | [PembantuCari] 441 | say=cari pembantu yaa? 442 | 443 | [LoremIpsum] 444 | say=seperti biasa: Lorem ipsum dolor sit amet, consectetur adipiscing elit. De quibus cupio scire quid sentias. Parvi enim primo ortu sic iacent, tamquam omnino sine animo sint. Cupiditates non Epicuri divisione finiebat, sed sua satietate. Duo Reges: constructio interrete. Explanetur igitur. Sumenda potius quam expetenda. 445 | say=jawaban standard: Lorem ipsum dolor sit amet, consectetur adipiscing elit. De quibus cupio scire quid sentias. Parvi enim primo ortu sic iacent, tamquam omnino sine animo sint. Cupiditates non Epicuri divisione finiebat, sed sua satietate. Duo Reges: constructio interrete. Explanetur igitur. Sumenda potius quam expetenda. 446 | say=anda sudah pasti tau jawabannya apa 447 | 448 | [Hadir] 449 | say=yaa.. hadir 450 | say=hai, salam jumpa 451 | say=iya.. apa kabar... 452 | say=hehehheee... 453 | 454 | [telolet] 455 | say=telotelotelotelooooooleeettt... 456 | say=teeeetttt.... 457 | say=telolet telolet let let let 458 | 459 | [PropertyWithDetail] 460 | say=asdad 461 | 462 | -------------------------------------------------------------------------------- /source/example/webservice/public_html/files/nlp/index.html: -------------------------------------------------------------------------------- 1 | http://www.fastplaz.com 2 | -------------------------------------------------------------------------------- /source/example/webservice/public_html/modules/index.html: -------------------------------------------------------------------------------- 1 | http://www.fastplaz.com 2 | -------------------------------------------------------------------------------- /source/example/webservice/public_html/ztemp/.htaccess: -------------------------------------------------------------------------------- 1 | deny from all 2 | <FilesMatch "\.(css|js|png|gif|jpg|ico|swf|flv|eot|woff|ttf|svg)$"> 3 | order allow,deny 4 | allow from all 5 | </filesmatch> 6 | -------------------------------------------------------------------------------- /source/example/webservice/public_html/ztemp/cache/index.html: -------------------------------------------------------------------------------- 1 | http://www.fastplaz.com 2 | -------------------------------------------------------------------------------- /source/example/webservice/public_html/ztemp/index.html: -------------------------------------------------------------------------------- 1 | http://www.fastplaz.com 2 | -------------------------------------------------------------------------------- /source/example/webservice/public_html/ztemp/logs/index.html: -------------------------------------------------------------------------------- 1 | http://www.fastplaz.com 2 | -------------------------------------------------------------------------------- /source/example/webservice/public_html/ztemp/sessions/index.html: -------------------------------------------------------------------------------- 1 | http://www.fastplaz.com 2 | -------------------------------------------------------------------------------- /source/example/webservice/source/nlp/build.sh: -------------------------------------------------------------------------------- 1 | mkdir lib 2 | fpc nlp.lpr @extra.cfg 3 | 4 | -------------------------------------------------------------------------------- /source/example/webservice/source/nlp/clean.bat: -------------------------------------------------------------------------------- 1 | @echo off 2 | del *~ 3 | rem del *.rst 4 | rem del *.lrt 5 | rem del *.lps 6 | del /s *.or 7 | del /s *.bak 8 | del /s *.exe 9 | del /s *.ppu 10 | del /s *.o 11 | del *.compiled 12 | del /s /q lib\* 13 | rmdir /s /q lib\ 14 | mkdir lib 15 | type "" > lib/empty 16 | rmdir /s /q backup\ 17 | rmdir /s /q src\backup 18 | rmdir /s /q src\controller\backup 19 | 20 | rmdir /s /q src\lib\ 21 | 22 | timeout /t 3 23 | -------------------------------------------------------------------------------- /source/example/webservice/source/nlp/extra.cfg: -------------------------------------------------------------------------------- 1 | #Language 2 | #-FrC:/lazarus-1.2.6/fpc/2.6.4/msg 3 | 4 | #SimpleAI & SimpleBOT Package 5 | -Fu../../../../package/src/ 6 | -Fu../../../../package/src/controller/ 7 | 8 | #-FUlib/$FPCTARGET/ 9 | -FUlib/ 10 | -Fu. 11 | -Fu.. 12 | -Fucontroller 13 | 14 | -Fu../../../../../../../vendors/fastplaz/FastPlaz 15 | -Fu../../../../../../../vendors/fastplaz/FastPlaz/src/systems 16 | -Fu../../../../../../../vendors/fastplaz/FastPlaz/src/library 17 | -Fu../../../../../../../vendors/fastplaz/FastPlaz/src/model 18 | -Fu../../../../../../../vendors/fastplaz/FastPlaz/src/integration 19 | -Fu../../../../../../../vendors/fastplaz/FastPlaz/src/cms/controller 20 | -Fu../../../../../../../vendors/fastplaz/FastPlaz/src/cms/model 21 | -Fu../../../../../../../vendors/fastplaz/FastPlaz/src/cms/util 22 | -Fu../../../../../../../vendors/fastplaz/FastPlaz/src/vendor/dcrypt 23 | 24 | -O3 25 | 26 | #-dLCL -dLCLwin32 27 | 28 | -dUseCThreads 29 | 30 | -Ficonfig/ 31 | 32 | -o../../public_html/nlp.bin 33 | 34 | 35 | -------------------------------------------------------------------------------- /source/example/webservice/source/nlp/lib/empty: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/luridarmawan/SimpleAI/e928d0c29b972c7c58ac15986f6985d002aa93bf/source/example/webservice/source/nlp/lib/empty -------------------------------------------------------------------------------- /source/example/webservice/source/nlp/main.pas: -------------------------------------------------------------------------------- 1 | { 2 | This file is part of the SimpleAI package. 3 | (c) Luri Darmawan <luri@carik.id> 4 | 5 | For the full copyright and license information, please view the LICENSE 6 | file that was distributed with this source code. 7 | } 8 | unit main; 9 | 10 | {$mode objfpc}{$H+} 11 | 12 | interface 13 | 14 | uses 15 | simpleai_controller, 16 | Classes, SysUtils, fpcgi, HTTPDefs, fastplaz_handler, database_lib; 17 | 18 | const 19 | BOTNAME = 'YourBotName'; 20 | NLP_FILE_ENTITIES = 'files/nlp/ai-entities.txt'; 21 | NLP_FILE_INTENTS = 'files/nlp/ai-intents.txt'; 22 | NLP_FILE_RESPONSES = 'files/nlp/ai-response.txt'; 23 | 24 | ERR_DEFAULT = 9; 25 | 26 | type 27 | 28 | { TMainModule } 29 | 30 | TMainModule = class(TMyCustomWebModule) 31 | private 32 | procedure beforeRequestHandler(Sender: TObject; ARequest: TRequest); 33 | public 34 | NLP: TSimpleAI; 35 | constructor CreateNew(AOwner: TComponent; CreateMode: integer); override; 36 | destructor Destroy; override; 37 | 38 | procedure Get; override; 39 | procedure Post; override; 40 | end; 41 | 42 | implementation 43 | 44 | uses common; 45 | 46 | constructor TMainModule.CreateNew(AOwner: TComponent; CreateMode: integer); 47 | begin 48 | inherited CreateNew(AOwner, CreateMode); 49 | BeforeRequest := @BeforeRequestHandler; 50 | NLP := TSimpleAI.Create; 51 | //NLP.Debug := True; 52 | NLP.AIName := BOTNAME; 53 | 54 | NLP.AddEntitiesFromFile(NLP_FILE_ENTITIES); 55 | NLP.AddIntentFromFile(NLP_FILE_INTENTS); 56 | NLP.AddResponFromFile(NLP_FILE_RESPONSES); 57 | 58 | end; 59 | 60 | destructor TMainModule.Destroy; 61 | begin 62 | NLP.Free; 63 | inherited Destroy; 64 | end; 65 | 66 | // Init First 67 | procedure TMainModule.beforeRequestHandler(Sender: TObject; ARequest: TRequest); 68 | begin 69 | Response.ContentType := 'application/json'; 70 | end; 71 | 72 | // GET Method Handler 73 | // how to access: 74 | // http://youraddress/?text=hai apa kabar? 75 | // 76 | // more better if you use POST method 77 | procedure TMainModule.Get; 78 | var 79 | Text, authstring: string; 80 | begin 81 | authstring := Header['Authorization']; 82 | //TODO: you can add more security check from here 83 | 84 | Response.Content := '{"code" : "' + i2s(ERR_DEFAULT) + '"}'; 85 | Text := _GET['text']; 86 | if Text = '' then 87 | Exit; 88 | 89 | NLP.Stemming := False; 90 | if not NLP.Exec(Text) then // if sentence not found in pattern 91 | begin 92 | //using default reponse message 93 | 94 | //save to DB/Log 95 | 96 | end; 97 | 98 | Response.Content := NLP.ResponseJson; 99 | end; 100 | 101 | // POST Method Handler 102 | procedure TMainModule.Post; 103 | begin 104 | Response.Content := '{}'; 105 | end; 106 | 107 | 108 | 109 | end. 110 | 111 | 112 | 113 | -------------------------------------------------------------------------------- /source/example/webservice/source/nlp/nlp.lpi: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="UTF-8"?> 2 | <CONFIG> 3 | <ProjectOptions> 4 | <Version Value="10"/> 5 | <PathDelim Value="\"/> 6 | <General> 7 | <Flags> 8 | <MainUnitHasCreateFormStatements Value="False"/> 9 | </Flags> 10 | <SessionStorage Value="InProjectDir"/> 11 | <MainUnit Value="0"/> 12 | <Title Value="NLP with SimpleAI"/> 13 | <UseAppBundle Value="False"/> 14 | <ResourceType Value="res"/> 15 | </General> 16 | <i18n> 17 | <EnableI18N LFM="False"/> 18 | </i18n> 19 | <VersionInfo> 20 | <UseVersionInfo Value="True"/> 21 | <AutoIncrementBuild Value="True"/> 22 | <BuildNr Value="2"/> 23 | <StringTable OriginalFilename="nlp.bin" ProductName="NLP with SimpleAI" ProductVersion=""/> 24 | </VersionInfo> 25 | <BuildModes Count="1"> 26 | <Item1 Name="Default" Default="True"/> 27 | </BuildModes> 28 | <PublishOptions> 29 | <Version Value="2"/> 30 | </PublishOptions> 31 | <RunParams> 32 | <local> 33 | <FormatVersion Value="1"/> 34 | </local> 35 | </RunParams> 36 | <RequiredPackages Count="2"> 37 | <Item1> 38 | <PackageName Value="simpleai_package"/> 39 | </Item1> 40 | <Item2> 41 | <PackageName Value="LCL"/> 42 | </Item2> 43 | </RequiredPackages> 44 | <Units Count="3"> 45 | <Unit0> 46 | <Filename Value="nlp.lpr"/> 47 | <IsPartOfProject Value="True"/> 48 | </Unit0> 49 | <Unit1> 50 | <Filename Value="routes.pas"/> 51 | <IsPartOfProject Value="True"/> 52 | </Unit1> 53 | <Unit2> 54 | <Filename Value="main.pas"/> 55 | <IsPartOfProject Value="True"/> 56 | </Unit2> 57 | </Units> 58 | </ProjectOptions> 59 | <CompilerOptions> 60 | <Version Value="11"/> 61 | <PathDelim Value="\"/> 62 | <Target> 63 | <Filename Value="..\..\public_html\nlp.bin" ApplyConventions="False"/> 64 | </Target> 65 | <SearchPaths> 66 | <IncludeFiles Value="$(ProjOutDir)"/> 67 | <UnitOutputDirectory Value="lib\$(TargetCPU)-$(TargetOS)"/> 68 | </SearchPaths> 69 | <Other> 70 | <ConfigFile> 71 | <ConfigFilePath Value="extra.cfg"/> 72 | </ConfigFile> 73 | </Other> 74 | </CompilerOptions> 75 | <Debugging> 76 | <Exceptions Count="3"> 77 | <Item1> 78 | <Name Value="EAbort"/> 79 | </Item1> 80 | <Item2> 81 | <Name Value="ECodetoolError"/> 82 | </Item2> 83 | <Item3> 84 | <Name Value="EFOpenError"/> 85 | </Item3> 86 | </Exceptions> 87 | </Debugging> 88 | </CONFIG> 89 | -------------------------------------------------------------------------------- /source/example/webservice/source/nlp/nlp.lpr: -------------------------------------------------------------------------------- 1 | program nlp; 2 | 3 | {$mode objfpc}{$H+} 4 | 5 | uses 6 | {$IFNDEF Windows}cthreads, {$ENDIF} 7 | fpcgi, sysutils, fastplaz_handler, common, main, routes; 8 | 9 | {$R *.res} 10 | 11 | begin 12 | Application.Title:='NLP with SimpleAI'; 13 | Application.Email := string( Config.GetValue(_SYSTEM_WEBMASTER_EMAIL, 14 | UTF8Decode('webmaster@' + GetEnvironmentVariable('SERVER_NAME')))); 15 | Application.DefaultModuleName := string( Config.GetValue( 16 | _SYSTEM_MODULE_DEFAULT, 'main')); 17 | Application.ModuleVariable := string( Config.GetValue( 18 | _SYSTEM_MODULE_VARIABLE, 'mod')); 19 | Application.AllowDefaultModule := True; 20 | Application.RedirectOnErrorURL := string( Config.GetValue(_SYSTEM_ERROR_URL, 21 | '/')); 22 | Application.RedirectOnError:= Config.GetValue( _SYSTEM_ERROR_REDIRECT, false); 23 | 24 | Application.OnGetModule := @FastPlasAppandler.OnGetModule; 25 | Application.PreferModuleName := True; 26 | 27 | Application.Initialize; 28 | Application.Run; 29 | end. 30 | -------------------------------------------------------------------------------- /source/example/webservice/source/nlp/nlp.res: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/luridarmawan/SimpleAI/e928d0c29b972c7c58ac15986f6985d002aa93bf/source/example/webservice/source/nlp/nlp.res -------------------------------------------------------------------------------- /source/example/webservice/source/nlp/routes.pas: -------------------------------------------------------------------------------- 1 | { 2 | This file is part of the SimpleAI package. 3 | (c) Luri Darmawan <luri@carik.id> 4 | 5 | For the full copyright and license information, please view the LICENSE 6 | file that was distributed with this source code. 7 | } 8 | unit routes; 9 | 10 | {$mode objfpc}{$H+} 11 | 12 | interface 13 | 14 | uses 15 | Classes, SysUtils, fastplaz_handler; 16 | 17 | implementation 18 | 19 | uses info_controller, main; 20 | 21 | initialization 22 | Route.Add( 'main', TMainModule); 23 | Route.Add( 'info', TInfoModule); 24 | 25 | end. 26 | 27 | -------------------------------------------------------------------------------- /source/lib/index.html: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/luridarmawan/SimpleAI/e928d0c29b972c7c58ac15986f6985d002aa93bf/source/lib/index.html -------------------------------------------------------------------------------- /source/package/clean.bat: -------------------------------------------------------------------------------- 1 | @echo off 2 | del *~ 3 | rem del *.rst 4 | rem del *.lrt 5 | rem del *.lps 6 | del /s *.or 7 | del /s *.bak 8 | del /s *.exe 9 | del /s *.ppu 10 | del /s *.o 11 | del *.compiled 12 | del /s /q lib\* 13 | rmdir /s /q lib\ 14 | mkdir lib 15 | type "" > lib/empty 16 | rmdir /s /q backup\ 17 | rmdir /s /q src\backup 18 | rmdir /s /q src\controller\backup 19 | 20 | rmdir /s /q src\lib\ 21 | 22 | timeout /t 3 23 | -------------------------------------------------------------------------------- /source/package/clean.sh: -------------------------------------------------------------------------------- 1 | rm -rf .DS_Store 2 | rm -rf *.or 3 | rm -rf *.bak 4 | rm -rf *.exe 5 | rm -rf *.ppu 6 | rm -rf *.o 7 | rm -rf *.compiled 8 | rm -rf lib/* 9 | 10 | find . -type f -name *.~ -delete 11 | find . -type f -name *.o -delete 12 | find . -type f -name *.oe -delete 13 | find . -type f -name *.rst -delete 14 | find . -type f -name *.bak -delete 15 | find . -type f -name *.ppu -delete 16 | find . -type f -name *.compiled -delete 17 | find . -type d -name backup -exec rm -rf "{}" + 18 | 19 | rm -rf lib 20 | mkdir lib 21 | touch lib/empty 22 | 23 | -------------------------------------------------------------------------------- /source/package/extra.cfg: -------------------------------------------------------------------------------- 1 | -dUseCThreads 2 | 3 | -------------------------------------------------------------------------------- /source/package/lib/empty: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/luridarmawan/SimpleAI/e928d0c29b972c7c58ac15986f6985d002aa93bf/source/package/lib/empty -------------------------------------------------------------------------------- /source/package/simpleai_package.lpk: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="UTF-8"?> 2 | <CONFIG> 3 | <Package Version="4"> 4 | <Name Value="simpleai_package"/> 5 | <Type Value="RunAndDesignTime"/> 6 | <Author Value="Luri Darmawan"/> 7 | <CompilerOptions> 8 | <Version Value="11"/> 9 | <SearchPaths> 10 | <OtherUnitFiles Value=".;src"/> 11 | <UnitOutputDirectory Value="lib/$(TargetCPU)-$(TargetOS)"/> 12 | </SearchPaths> 13 | </CompilerOptions> 14 | <Description Value="Simple NLP package"/> 15 | <Files Count="4"> 16 | <Item1> 17 | <Filename Value="src/entities_lib.pas"/> 18 | <UnitName Value="entities_lib"/> 19 | </Item1> 20 | <Item2> 21 | <Filename Value="src/intents_lib.pas"/> 22 | <UnitName Value="intents_lib"/> 23 | </Item2> 24 | <Item3> 25 | <Filename Value="src/simpleai_controller.pas"/> 26 | <UnitName Value="simpleai_controller"/> 27 | </Item3> 28 | <Item4> 29 | <Filename Value="src/simpleai_lib.pas"/> 30 | <UnitName Value="simpleai_lib"/> 31 | </Item4> 32 | </Files> 33 | <i18n> 34 | <EnableI18N Value="True"/> 35 | <OutDir Value="locale"/> 36 | </i18n> 37 | <RequiredPkgs Count="2"> 38 | <Item1> 39 | <PackageName Value="fastplaz_runtime"/> 40 | </Item1> 41 | <Item2> 42 | <PackageName Value="FCL"/> 43 | </Item2> 44 | </RequiredPkgs> 45 | <UsageOptions> 46 | <UnitPath Value="$(PkgOutDir)"/> 47 | </UsageOptions> 48 | <PublishOptions> 49 | <Version Value="2"/> 50 | </PublishOptions> 51 | <CustomOptions Items="ExternHelp" Version="2"> 52 | <_ExternHelp Items="Count"/> 53 | </CustomOptions> 54 | </Package> 55 | </CONFIG> 56 | -------------------------------------------------------------------------------- /source/package/simpleai_package.pas: -------------------------------------------------------------------------------- 1 | { This file was automatically created by Lazarus. Do not edit! 2 | This source is only used to compile and install the package. 3 | } 4 | 5 | unit simpleai_package; 6 | 7 | interface 8 | 9 | uses 10 | entities_lib, intents_lib, simpleai_controller, simpleai_lib, 11 | LazarusPackageIntf; 12 | 13 | implementation 14 | 15 | procedure Register; 16 | begin 17 | end; 18 | 19 | initialization 20 | RegisterPackage('simpleai_package', @Register); 21 | end. 22 | -------------------------------------------------------------------------------- /source/package/simplebot_package.lpk: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="UTF-8"?> 2 | <CONFIG> 3 | <Package Version="4"> 4 | <Name Value="simplebot_package"/> 5 | <Type Value="RunAndDesignTime"/> 6 | <Author Value="Luri Darmawan"/> 7 | <CompilerOptions> 8 | <Version Value="11"/> 9 | <SearchPaths> 10 | <OtherUnitFiles Value="src;src/controller"/> 11 | <UnitOutputDirectory Value="lib/$(TargetCPU)-$(TargetOS)"/> 12 | </SearchPaths> 13 | </CompilerOptions> 14 | <Description Value="SimpleBOT package"/> 15 | <Files Count="8"> 16 | <Item1> 17 | <Filename Value="src/simplebot_controller.pas"/> 18 | <UnitName Value="simplebot_controller"/> 19 | </Item1> 20 | <Item2> 21 | <Filename Value="src/simpleairedis_controller.pas"/> 22 | <UnitName Value="simpleairedis_controller"/> 23 | </Item2> 24 | <Item3> 25 | <Filename Value="src/suggestion_controller.pas"/> 26 | <UnitName Value="suggestion_controller"/> 27 | </Item3> 28 | <Item4> 29 | <Filename Value="src/controller/domainwhois_controller.pas"/> 30 | <UnitName Value="domainwhois_controller"/> 31 | </Item4> 32 | <Item5> 33 | <Filename Value="src/controller/kamus_controller.pas"/> 34 | <UnitName Value="kamus_controller"/> 35 | </Item5> 36 | <Item6> 37 | <Filename Value="src/controller/carik_controller.pas"/> 38 | <UnitName Value="carik_controller"/> 39 | </Item6> 40 | <Item7> 41 | <Filename Value="src/controller/movie_controller.pas"/> 42 | <UnitName Value="movie_controller"/> 43 | </Item7> 44 | <Item8> 45 | <Filename Value="src/controller/jadwalsholat_controller.pas"/> 46 | <UnitName Value="jadwalsholat_controller"/> 47 | </Item8> 48 | </Files> 49 | <i18n> 50 | <EnableI18N Value="True"/> 51 | <OutDir Value="locale"/> 52 | </i18n> 53 | <RequiredPkgs Count="4"> 54 | <Item1> 55 | <PackageName Value="fastplaz_integration"/> 56 | </Item1> 57 | <Item2> 58 | <PackageName Value="fastplaz_runtime"/> 59 | </Item2> 60 | <Item3> 61 | <PackageName Value="simpleai_package"/> 62 | </Item3> 63 | <Item4> 64 | <PackageName Value="FCL"/> 65 | </Item4> 66 | </RequiredPkgs> 67 | <UsageOptions> 68 | <UnitPath Value="$(PkgOutDir)"/> 69 | </UsageOptions> 70 | <PublishOptions> 71 | <Version Value="2"/> 72 | </PublishOptions> 73 | <CustomOptions Items="ExternHelp" Version="2"> 74 | <_ExternHelp Items="Count"/> 75 | </CustomOptions> 76 | </Package> 77 | </CONFIG> 78 | -------------------------------------------------------------------------------- /source/package/simplebot_package.pas: -------------------------------------------------------------------------------- 1 | { This file was automatically created by Lazarus. Do not edit! 2 | This source is only used to compile and install the package. 3 | } 4 | 5 | unit simplebot_package; 6 | 7 | interface 8 | 9 | uses 10 | simplebot_controller, simpleairedis_controller, suggestion_controller, 11 | domainwhois_controller, kamus_controller, carik_controller, 12 | movie_controller, jadwalsholat_controller, LazarusPackageIntf; 13 | 14 | implementation 15 | 16 | procedure Register; 17 | begin 18 | end; 19 | 20 | initialization 21 | RegisterPackage('simplebot_package', @Register); 22 | end. 23 | -------------------------------------------------------------------------------- /source/package/src/controller/carik_controller.pas: -------------------------------------------------------------------------------- 1 | { 2 | This file is part of the SimpleBOT package. 3 | (c) Luri Darmawan <luri@fastplaz.com> 4 | 5 | For the full copyright and license information, please view the LICENSE 6 | file that was distributed with this source code. 7 | } 8 | unit carik_controller; 9 | 10 | { 11 | Chat Recorder 12 | 13 | 14 | Carik := TCarikController.Create; 15 | Carik.UserName := 'usernamethatsendmessage'; 16 | Carik.GroupName := 'thisgroupname'; 17 | . 18 | . 19 | Carik.Start; 20 | . 21 | . 22 | . 23 | if Carik.Recording then 24 | Carik.RecordTelegramMessage(Request.Content); 25 | 26 | . 27 | . 28 | Carik.Free; 29 | } 30 | 31 | {$mode objfpc}{$H+} 32 | 33 | interface 34 | 35 | uses 36 | common, fastplaz_handler, telegram_integration, logutil_lib, mailer_lib, 37 | simpleai_controller, 38 | IniFiles, fpjson, Classes, SysUtils; 39 | 40 | const 41 | _GROUP_MEMBERBARU_ABAIKAN = 'group_memberbaru_abaikan'; 42 | 43 | type 44 | 45 | { TCarikController } 46 | 47 | TCarikController = class 48 | private 49 | DataFile: TextFile; 50 | FFullName: string; 51 | FGroupChatID: string; 52 | FIsGroup: boolean; 53 | FUserID: string; 54 | FUserPrefix: string; 55 | Telegram: TTelegramIntegration; 56 | FGroupName: string; 57 | FGroupNameOri: string; 58 | FPath: string; 59 | FReady: boolean; 60 | FData: TIniFile; 61 | FGroupData: TIniFile; 62 | FRecordNumber: integer; 63 | FUserName: string; 64 | function getCustomMessage(const KeyName: string): string; 65 | function getIsPermiited: boolean; 66 | function getIsRecording: boolean; 67 | function SaveToFile(Text: string): boolean; 68 | function SaveToFileCSV(Text: string): boolean; 69 | function getDirPath(IndexRecording: integer): string; 70 | function getSafeGroupName(AGroupChatID: string): string; 71 | function downloadFile(FileID: string): string; 72 | procedure setCustomMessage(const KeyName: string; AValue: string); 73 | procedure setGroupName(AValue: string); 74 | procedure setPath(AValue: string); 75 | function openFile(FileName: string): string; 76 | function isValidCommand(CommandString: string): boolean; 77 | function getGroupInfo(GroupNameID: string; ADetail: boolean = False): string; 78 | function getGroupAdminList(GroupNameID: string): string; 79 | public 80 | constructor Create; 81 | destructor Destroy; override; 82 | function StartHandler(const IntentName: string; Params: TStrings): string; 83 | function StopHandler(const IntentName: string; Params: TStrings): string; 84 | function CheckHandler(const IntentName: string; Params: TStrings): string; 85 | function TopicHandler(const IntentName: string; Params: TStrings): string; 86 | function SendHandler(const IntentName: string; Params: TStrings): string; 87 | function GroupInfoHandler(const IntentName: string; Params: TStrings): string; 88 | function isSapaMemberBaru: boolean; 89 | function MemberBaruAbaikanHandler(const IntentName: string; 90 | Params: TStrings): string; 91 | function MemberBaruSapaHandler(const IntentName: string; Params: TStrings): string; 92 | function Start: boolean; 93 | function Stop: boolean; 94 | function Send: boolean; 95 | procedure RecordTelegramMessage(Message: string); 96 | function EnableBot: boolean; 97 | function DisableBot: boolean; 98 | function IsDisabled: boolean; 99 | function IsImageRecognitionDisabled: boolean; 100 | procedure ImageRecognitionCounting; 101 | 102 | property Data: TIniFile read FData write FData; 103 | property Ready: boolean read FReady; 104 | property Path: string read FPath write setPath; 105 | property UserID: string read FUserID write FUserID; 106 | property UserPrefix: string read FUserPrefix write FUserPrefix; 107 | property UserName: string read FUserName write FUserName; 108 | property FullName: string read FFullName write FFullName; 109 | property GroupName: string read FGroupName write setGroupName; 110 | property GroupChatID: string read FGroupChatID write FGroupChatID; 111 | property IsRecording: boolean read getIsRecording; 112 | property RecordNumber: integer read FRecordNumber; 113 | property IsGroup: boolean read FIsGroup write FIsGroup; 114 | property IsPermitted: boolean read getIsPermiited; 115 | property CustomMessage[const KeyName: string]: string 116 | read getCustomMessage write setCustomMessage; 117 | 118 | function IsCommand(Text: string): boolean; 119 | function ExecCommand(Text: string): string; 120 | 121 | function AdminAdd(ValidUserName: string): boolean; 122 | function AdminDel(ValidUserName: string): boolean; 123 | function GroupInfo: string; 124 | procedure Invited; 125 | end; 126 | 127 | 128 | implementation 129 | 130 | const 131 | _NOTULEN_CONFIG_GROUPS = 'carik/groups/'; 132 | _NOTULEN_CONFIG_PATH = 'carik/path'; 133 | _NOTULEN_PATH_DEFAULT = 'files/carik/'; 134 | _NOTULEN_PATH_DOCS = 'docs/%s/'; 135 | _NOTULEN_DATA_FILE = 'carik.dat'; 136 | _NOTULEN_GROUP_DATA_FILE = 'carik-group.dat'; 137 | _NOTULEN_FILE_EXTENSION = '.html'; 138 | _NOTULEN_NAME = 'name'; 139 | _NOTULEN_DISABLE = 'disable'; 140 | _NOTULEN_RECORDING = 'recording'; 141 | _NOTULEN_COUNT = 'count'; 142 | _NOTULEN_TOPIC = 'topic'; 143 | _NOTULEN_INVITEDBY_ID = 'invitedby_id'; 144 | _NOTULEN_INVITEDBY_NAME = 'invitedby_name'; 145 | _NOTULEN_INVITEDBY_USERNAME = 'invitedby_username'; 146 | _NOTULEN_INVITEDBY_DATE = 'invitedby_date'; 147 | _NOTULEN_GROUP_ID = 'id'; 148 | //_NOTULEN_DIR_PREFIX = 'group-'; 149 | _NOTULEN_ADMIN_PREFIX = 'admin-'; 150 | _NOTULEN_IMAGERECOGNITION_COUNTING = 'image_recognition'; 151 | _NOTULEN_IMAGERECOGNITION_DISABLED = 'image_recognition_disabled'; 152 | 153 | _NOTULEN_SECTION_GROUP_LIST = 'GroupList'; 154 | 155 | _NOTULEN_MSG_START = 'Ok, saya mulai mencatat ... ✍ ...'; 156 | _NOTULEN_MSG_RECORDNUMBER = '\nini notulen ke %d'; 157 | _NOTULEN_MSG_CANNOT_START = 'Maaf, sepertinya saya tidak bisa mencatat diskusi ini'; 158 | _NOTULEN_MSG_NOTPERMITTED = 'Sepertinya anda belum masuk sebagai admin'; 159 | _NOTULEN_MSG_SECRET = 'rahasia ...'; 160 | _NOTULEN_MSG_NORECORDING = 'saat ini tidak ada yang dicatat di sini.'; 161 | _NOTULEN_MSG_RECORDING = 'Sekarang sedang mencatat diskusi:'; 162 | _NOTULEN_MSG_TERKIRIM = '🎁 terkirim ... '; 163 | _NOTULEN_MSG_NOTFOUND = 'Catatan tidak tersedia'; 164 | 165 | _NOTULEN_HTML_STYLE = 166 | '<style>body{font-family:Tahoma,"Lucida Grande","Trebuchet MS"}span.username{border-bottom:1px solid #c2d1f0;font-size:small;display:block;background:#e6f5ff;padding:2px 2px 2px 5px}span.message{padding:0 0 0 10px}table{min-width:300px}table,td,th{border:1px solid #00134d}td{border:0;border-bottom:1px solid #668cff}</style>' + '<style>span {white-space: pre;font-family: monospace;display: block;unicode-bidi: embed}</style>'; 167 | _NOTULEN_HTML_USERNAME = '<span class="username">%s, %s</span>'; 168 | _NOTULEN_HTML_MESSAGE = '<span class="message">%s</span>'; 169 | //_NOTULEN_HTML_DOCUMENT = '<a href="%s">document</a>'; 170 | _NOTULEN_HTML_PHOTO = '<img src="%s">'; 171 | _NOTULEN_HTML_VIDEO = '<video controls><source src="%s" type="video/mp4"></video>'; 172 | 173 | _NOTULEN_SUPERADMIN = 'luridarmawan'; 174 | 175 | //_NOTULEN_MIME_VIDEO = 'video/mp4'; 176 | 177 | { TCarikController } 178 | 179 | function TCarikController.getIsRecording: boolean; 180 | begin 181 | Result := False; 182 | if FGroupData.ReadString(FGroupName, _NOTULEN_RECORDING, '0') = '1' then 183 | Result := True; 184 | end; 185 | 186 | function TCarikController.getIsPermiited: boolean; 187 | var 188 | s, _admin: string; 189 | begin 190 | Result := False; 191 | s := 'carik/groups/' + FGroupName + '/admin'; 192 | _admin := Config[s]; 193 | if _admin = '' then 194 | _admin := _NOTULEN_SUPERADMIN; 195 | 196 | if pos(FUserName, _admin) > 0 then 197 | Result := True; 198 | 199 | if FGroupData.ReadInteger(FGroupName, _NOTULEN_ADMIN_PREFIX + FUserName, 0) > 0 then 200 | Result := True; 201 | end; 202 | 203 | function TCarikController.SaveToFile(Text: string): boolean; 204 | var 205 | i: integer; 206 | fileName, dir: string; 207 | begin 208 | Result := False; 209 | i := FGroupData.ReadInteger(FGroupName, _NOTULEN_COUNT, 0); 210 | dir := getDirPath(i); 211 | fileName := dir + 'index' + _NOTULEN_FILE_EXTENSION; 212 | 213 | AssignFile(DataFile, fileName); 214 | { $I+} 215 | try 216 | if not FileExists(fileName) then 217 | Rewrite(DataFile) 218 | else 219 | Append(DataFile); 220 | WriteLn(DataFile, Text); 221 | CloseFile(DataFile); 222 | Result := True; 223 | except 224 | end; 225 | end; 226 | 227 | function TCarikController.SaveToFileCSV(Text: string): boolean; 228 | var 229 | i: integer; 230 | fileName, dir: string; 231 | begin 232 | Result := False; 233 | i := FGroupData.ReadInteger(FGroupName, _NOTULEN_COUNT, 0); 234 | dir := getDirPath(i); 235 | fileName := dir + LowerCase(FGroupName) + '.csv'; 236 | 237 | AssignFile(DataFile, fileName); 238 | { $I+} 239 | try 240 | if not FileExists(fileName) then 241 | Rewrite(DataFile) 242 | else 243 | Append(DataFile); 244 | WriteLn(DataFile, Text); 245 | CloseFile(DataFile); 246 | Result := True; 247 | except 248 | end; 249 | end; 250 | 251 | function TCarikController.getDirPath(IndexRecording: integer): string; 252 | var 253 | _safeNAme: string; 254 | begin 255 | _safeNAme := getSafeGroupName(FGroupChatID) + '-' + FGroupChatID; 256 | Result := FPath + 'groups' + DirectorySeparator + _safeNAme + '-' + 257 | i2s(IndexRecording) + DirectorySeparator; 258 | end; 259 | 260 | function TCarikController.getSafeGroupName(AGroupChatID: string): string; 261 | begin 262 | Result := FData.ReadString(_NOTULEN_SECTION_GROUP_LIST, AGroupChatID, ''); 263 | end; 264 | 265 | function TCarikController.downloadFile(FileID: string): string; 266 | var 267 | filePath, targetFile: string; 268 | begin 269 | Result := ''; 270 | Telegram := TTelegramIntegration.Create; 271 | Telegram.Token := Config['telegram/default/token']; 272 | if Telegram.Token = '' then 273 | Exit; 274 | 275 | FRecordNumber := FGroupData.ReadInteger(FGroupName, _NOTULEN_COUNT, 0); 276 | 277 | filePath := Telegram.GetFilePath(FileID); 278 | targetFile := getDirPath(FRecordNumber) + filePath; 279 | if Telegram.DownloadFile(filePath, targetFile) then 280 | begin 281 | Result := filePath; 282 | end; 283 | Telegram.Free; 284 | end; 285 | 286 | function TCarikController.getCustomMessage(const KeyName: string): string; 287 | begin 288 | Result := FGroupData.ReadString(FGroupName, 'MSG_' + KeyName, ''); 289 | end; 290 | 291 | procedure TCarikController.setCustomMessage(const KeyName: string; AValue: string); 292 | begin 293 | FGroupData.WriteString(FGroupName, 'MSG_' + KeyName, AValue); 294 | end; 295 | 296 | procedure TCarikController.setGroupName(AValue: string); 297 | begin 298 | FGroupName := getSafeGroupName(FGroupChatID); 299 | if FGroupName <> '' then 300 | Exit; 301 | FGroupName := AValue; 302 | FGroupNameOri := AValue; 303 | //FGroupName:= SafeText( AValue); 304 | FGroupName := StringReplace(FGroupName, ' ', '', [rfReplaceAll]); 305 | FGroupName := StringReplace(FGroupName, '(', '', [rfReplaceAll]); 306 | FGroupName := StringReplace(FGroupName, ')', '', [rfReplaceAll]); 307 | FGroupName := StringReplace(FGroupName, '@', '', [rfReplaceAll]); 308 | FGroupName := StringReplace(FGroupName, '-', '', [rfReplaceAll]); 309 | FGroupName := StringReplace(FGroupName, '_', '', [rfReplaceAll]); 310 | FGroupName := StringReplace(FGroupName, '"', '', [rfReplaceAll]); 311 | FGroupName := StringReplace(FGroupName, '''', '', [rfReplaceAll]); 312 | FGroupName := StringReplace(FGroupName, '&', '', [rfReplaceAll]); 313 | end; 314 | 315 | procedure TCarikController.setPath(AValue: string); 316 | begin 317 | if FPath = AValue then 318 | Exit; 319 | FPath := AValue; 320 | FReady := DirectoryIsWritable(AValue); 321 | end; 322 | 323 | function TCarikController.openFile(FileName: string): string; 324 | var 325 | _note: TStringList; 326 | begin 327 | Result := ''; 328 | FileName := Trim(FileName); 329 | if FileExists(FileName) then 330 | begin 331 | _note := TStringList.Create; 332 | try 333 | _note.LoadFromFile(FileName); 334 | Result := _note.Text; 335 | Result := StringReplace(Result, #13, '\n', [rfReplaceAll]); 336 | Result := StringReplace(Result, #10, '\n', [rfReplaceAll]); 337 | Result := StringReplace(Result, '===', #13, [rfReplaceAll]); // page break 338 | except 339 | on E: Exception do 340 | begin 341 | end; 342 | end; 343 | _note.Free; 344 | end; 345 | end; 346 | 347 | constructor TCarikController.Create; 348 | begin 349 | FReady := False; 350 | FIsGroup := False; 351 | Path := Config[_NOTULEN_CONFIG_PATH]; 352 | if Path = '' then 353 | Path := _NOTULEN_PATH_DEFAULT; 354 | 355 | FGroupData := TIniFile.Create(FPath + _NOTULEN_GROUP_DATA_FILE); 356 | FData := TIniFile.Create(FPath + _NOTULEN_DATA_FILE); 357 | FUserPrefix := ''; 358 | end; 359 | 360 | destructor TCarikController.Destroy; 361 | begin 362 | FData.Free; 363 | FGroupData.Free; 364 | end; 365 | 366 | function TCarikController.StartHandler(const IntentName: string; 367 | Params: TStrings): string; 368 | begin 369 | Result := _NOTULEN_MSG_CANNOT_START; 370 | if FGroupName = '' then 371 | Exit; 372 | 373 | if not IsPermitted then 374 | Exit; 375 | 376 | LogUtil.Add('starting ... ', 'carik'); 377 | if Start then 378 | begin 379 | LogUtil.Add('--- ' + FGroupName + ' recorded', 'carik'); 380 | Result := _NOTULEN_MSG_START + format(_NOTULEN_MSG_RECORDNUMBER, [FRecordNumber]); 381 | end 382 | else 383 | begin 384 | Result := _NOTULEN_MSG_CANNOT_START; 385 | end; 386 | end; 387 | 388 | function TCarikController.StopHandler(const IntentName: string; 389 | Params: TStrings): string; 390 | begin 391 | Result := ''; 392 | if not IsPermitted then 393 | Exit; 394 | Stop; 395 | Result := '... catetan sudah dihentikan.'; 396 | end; 397 | 398 | function TCarikController.CheckHandler(const IntentName: string; 399 | Params: TStrings): string; 400 | var 401 | i, _recordStatus, _recordNumber: integer; 402 | s, _recordName, _groupName, _groupTopic: string; 403 | lst: TStringList; 404 | begin 405 | Result := _NOTULEN_MSG_SECRET; 406 | 407 | if not IsPermitted then 408 | Exit; 409 | 410 | lst := TStringList.Create; 411 | FGroupData.ReadSections(lst); 412 | 413 | s := ''; 414 | for i := 0 to lst.Count - 1 do 415 | begin 416 | _groupName := lst[i]; 417 | if FIsGroup then 418 | begin 419 | if _groupName <> FGroupName then 420 | Continue; 421 | end; 422 | _recordStatus := FGroupData.ReadInteger(_groupName, _NOTULEN_RECORDING, 0); 423 | if _recordStatus = 1 then 424 | begin 425 | _recordName := FGroupData.ReadString(_groupName, _NOTULEN_NAME, _groupName); 426 | _groupTopic := FGroupData.ReadString(_groupName, _NOTULEN_TOPIC, ''); 427 | _recordNumber := FGroupData.ReadInteger(_groupName, _NOTULEN_COUNT, 0); 428 | 429 | s := s + '\n- ' + _recordName + ' (#' + i2s(_recordNumber) + ')'; 430 | if _groupTopic <> '' then 431 | s := s + ', topic: ' + _groupTopic; 432 | end; 433 | end; 434 | if s = '' then 435 | s := _NOTULEN_MSG_NORECORDING 436 | else 437 | s := _NOTULEN_MSG_RECORDING + s; 438 | 439 | Result := s; 440 | lst.Free; 441 | end; 442 | 443 | function TCarikController.TopicHandler(const IntentName: string; 444 | Params: TStrings): string; 445 | var 446 | _topic: string; 447 | begin 448 | Result := ''; 449 | 450 | if not IsPermitted then 451 | Exit; 452 | 453 | _topic := Params.Values['topic_value']; 454 | _topic := StringReplace(_topic, '"', '', [rfReplaceAll]); 455 | FGroupData.WriteString(FGroupName, _NOTULEN_TOPIC, _topic); 456 | FGroupData.WriteString(FGroupName, _NOTULEN_GROUP_ID, FGroupChatID); 457 | 458 | if IsRecording then 459 | begin 460 | // TODO: direct save to file 461 | end; 462 | 463 | Result := 'Baik, topik saat ini *"' + ucwords(_topic) + '"*'; 464 | end; 465 | 466 | function TCarikController.SendHandler(const IntentName: string; 467 | Params: TStrings): string; 468 | var 469 | i: integer; 470 | _dir, _fileTarget: string; 471 | begin 472 | Result := _NOTULEN_MSG_NOTPERMITTED; 473 | if FGroupName = '' then 474 | Exit; 475 | if not IsPermitted then 476 | Exit; 477 | 478 | i := FGroupData.ReadInteger(FGroupName, _NOTULEN_COUNT, 0); 479 | if i = 0 then 480 | begin 481 | Result := _NOTULEN_MSG_NOTFOUND; 482 | Exit; 483 | end; 484 | 485 | _dir := getDirPath(i); 486 | if not DirectoryExists(_dir) then 487 | begin 488 | Result := _NOTULEN_MSG_NOTFOUND + ' ...'; 489 | Exit; 490 | end; 491 | 492 | _fileTarget := Copy(_dir, 0, Length(_dir) - 1) + '.zip'; 493 | Result := 'sepertinya gagal kirim nihh... '; 494 | if ZipFolder(_dir, _fileTarget) then 495 | begin 496 | Telegram := TTelegramIntegration.Create; 497 | Telegram.Token := Config['telegram/default/token']; 498 | Result := '. . .'; 499 | if Telegram.Token <> '' then 500 | begin 501 | Result := 'Catatan ' + FGroupName; 502 | if FGroupData.ReadString(FGroupName, _NOTULEN_TOPIC, '') <> '' then 503 | Result := Result + ', Topik: ' + FGroupData.ReadString(FGroupName, 504 | _NOTULEN_TOPIC, ''); 505 | Telegram.SendDocument(UserID, _fileTarget, Result); 506 | Result := _NOTULEN_MSG_TERKIRIM; 507 | end; 508 | Telegram.Free; 509 | end; 510 | 511 | { 512 | if Send then 513 | begin 514 | Result := 'terkirim ...'; 515 | end; 516 | } 517 | end; 518 | 519 | function TCarikController.GroupInfoHandler(const IntentName: string; 520 | Params: TStrings): string; 521 | begin 522 | Result := GroupInfo; 523 | end; 524 | 525 | function TCarikController.isSapaMemberBaru: boolean; 526 | begin 527 | Result := False; 528 | if FGroupData.ReadString(FGroupName, _GROUP_MEMBERBARU_ABAIKAN, '0') <> '1' then 529 | Result := True; 530 | end; 531 | 532 | function TCarikController.MemberBaruAbaikanHandler(const IntentName: string; 533 | Params: TStrings): string; 534 | begin 535 | Result := _NOTULEN_MSG_NOTPERMITTED; 536 | if FGroupName = '' then 537 | Exit; 538 | if not IsPermitted then 539 | Exit; 540 | 541 | FGroupData.WriteString(FGroupName, _GROUP_MEMBERBARU_ABAIKAN, '1'); 542 | 543 | Result := 'OK'; 544 | end; 545 | 546 | function TCarikController.MemberBaruSapaHandler(const IntentName: string; 547 | Params: TStrings): string; 548 | begin 549 | Result := _NOTULEN_MSG_NOTPERMITTED; 550 | if FGroupName = '' then 551 | Exit; 552 | if not IsPermitted then 553 | Exit; 554 | 555 | FGroupData.WriteString(FGroupName, _GROUP_MEMBERBARU_ABAIKAN, '0'); 556 | 557 | Result := 'OK'; 558 | end; 559 | 560 | 561 | function TCarikController.Start: boolean; 562 | var 563 | i: integer; 564 | s, fileName, dir, _topic: string; 565 | begin 566 | Result := False; 567 | if not FReady then 568 | Exit; 569 | 570 | i := FGroupData.ReadInteger(FGroupName, _NOTULEN_RECORDING, 0); 571 | FRecordNumber := FGroupData.ReadInteger(FGroupName, _NOTULEN_COUNT, 0); 572 | if i = 1 then 573 | begin 574 | Result := True; 575 | Exit; 576 | end; 577 | 578 | s := _NOTULEN_CONFIG_GROUPS + FGroupName + '/admin'; 579 | s := Config[s]; 580 | if s <> '' then 581 | begin 582 | if Pos(FUserName, s) = 0 then 583 | Exit; 584 | end; 585 | 586 | i := FGroupData.ReadInteger(FGroupName, _NOTULEN_COUNT, 0) + 1; 587 | FRecordNumber := i; 588 | FGroupData.WriteString(FGroupName, _NOTULEN_NAME, FGroupNameOri); 589 | FGroupData.WriteString(FGroupName, _NOTULEN_GROUP_ID, FGroupChatID); 590 | FGroupData.WriteString(FGroupName, _NOTULEN_RECORDING, '1'); 591 | FGroupData.WriteInteger(FGroupName, _NOTULEN_COUNT, i); 592 | 593 | dir := getDirPath(i); 594 | try 595 | if not DirectoryExists(dir) then 596 | begin 597 | ForceDirectories(dir); 598 | ForceDirectories(dir + 'files'); 599 | ForceDirectories(dir + 'photos'); 600 | ForceDirectories(dir + 'documents'); 601 | end; 602 | except 603 | on E: Exception do 604 | begin 605 | end; 606 | end; 607 | 608 | // save index.html 609 | fileName := dir + 'index' + _NOTULEN_FILE_EXTENSION; 610 | if not FileExists(fileName) then 611 | begin 612 | _topic := FGroupData.ReadString(FGroupName, _NOTULEN_TOPIC, ''); 613 | if _topic = '' then 614 | _topic := '%topic%'; 615 | s := _NOTULEN_HTML_STYLE + #13'<h1>' + FGroupName + ' #' + 616 | i2s(FRecordNumber) + '</h1>'; 617 | s := s + #13'<h3>Topic: ' + _topic + '</h3>'; 618 | s := s + #13'<b>Level: -</b>'; 619 | s := s + #13'<br>Tanggal: ' + FormatDateTime('dd-mm-yyyy hh:nn', now) + 620 | ' - Generated by CarikBot'; 621 | s := s + #13'<table>'; 622 | SaveToFile(s); 623 | end; 624 | 625 | Result := True; 626 | end; 627 | 628 | function TCarikController.Stop: boolean; 629 | begin 630 | Result := False; 631 | FGroupData.WriteString(FGroupName, _NOTULEN_RECORDING, '0'); 632 | //FGroupData.WriteString(FGroupName, _NOTULEN_TOPIC, ''); 633 | Result := True; 634 | end; 635 | 636 | function TCarikController.Send: boolean; 637 | var 638 | _mail: TMailer; 639 | begin 640 | Result := False; 641 | _mail := TMailer.Create(); // TODO: sent email 642 | 643 | _mail.AddTo('me', 'luri@kioss.com'); 644 | _mail.Message.Add('test'); 645 | 646 | // ... ... 647 | 648 | Result := _mail.Send; 649 | _mail.Free; 650 | end; 651 | 652 | procedure TCarikController.RecordTelegramMessage(Message: string); 653 | var 654 | s: string; 655 | html: TStringList; 656 | jsonData: TJSONData; 657 | csv, msg, Caption, photo, _doc, _mime: string; 658 | begin 659 | html := TStringList.Create; 660 | try 661 | jsonData := GetJSON(Message); 662 | except 663 | end; 664 | 665 | try 666 | msg := jsonData.GetPath('message.text').AsString; 667 | except 668 | end; 669 | 670 | // photo 671 | try 672 | try 673 | photo := jsonData.GetPath('message.photo[2].file_id').AsString; 674 | except 675 | try 676 | photo := jsonData.GetPath('message.photo[1].file_id').AsString; 677 | except 678 | try 679 | photo := jsonData.GetPath('message.photo[0].file_id').AsString; 680 | except 681 | on e: Exception do 682 | begin 683 | end; 684 | end; 685 | end; 686 | end; 687 | Caption := jsonData.GetPath('message.caption').AsString; 688 | except 689 | end; 690 | 691 | // document 692 | _mime := ''; 693 | try 694 | _doc := jsonData.GetPath('message.document.file_id').AsString; 695 | _mime := jsonData.GetPath('message.document.mime_type').AsString; 696 | Caption := jsonData.GetPath('message.caption').AsString; 697 | except 698 | end; 699 | 700 | msg := msg + Caption; 701 | if photo <> '' then 702 | begin 703 | s := downloadFile(photo); 704 | photo := format(_NOTULEN_HTML_PHOTO, [s]); 705 | msg := photo + #13#10'<br>' + msg; 706 | end; 707 | if _doc <> '' then 708 | begin 709 | s := downloadFile(_doc); 710 | photo := format(_NOTULEN_HTML_VIDEO, [s]); 711 | msg := photo + #13#10'<br>' + msg; 712 | end; 713 | csv := StringReplace(msg, #13#10, #13, [rfReplaceAll]); 714 | csv := StringReplace(csv, #13, '\n', [rfReplaceAll]); 715 | csv := StringReplace(csv, '<br>', '\n', [rfReplaceAll]); 716 | 717 | html.Add('<tr>'); 718 | html.Add('<td> </td>'); 719 | html.Add('<td>'); 720 | s := FormatDateTime('dd-mm-yyyy hh:nn:ss', now); 721 | csv := s + '|' + FFullName + '|' + csv; 722 | html.Add(Format(_NOTULEN_HTML_USERNAME, [FFullName, s])); 723 | 724 | html.Add(Format(_NOTULEN_HTML_MESSAGE, [msg])); 725 | 726 | html.Add('<td>'); 727 | html.Add('</tr>'); 728 | 729 | SaveToFile(html.Text); 730 | SaveToFileCSV(csv); 731 | html.Free; 732 | end; 733 | 734 | function TCarikController.EnableBot: boolean; 735 | begin 736 | Result := False; 737 | if FGroupName = '' then 738 | Exit; 739 | if not IsPermitted then 740 | Exit; 741 | 742 | FGroupData.WriteString(FGroupName, _NOTULEN_DISABLE, '0'); 743 | Result := True; 744 | end; 745 | 746 | function TCarikController.DisableBot: boolean; 747 | begin 748 | Result := False; 749 | if FGroupName = '' then 750 | Exit; 751 | if not IsPermitted then 752 | Exit; 753 | 754 | FGroupData.WriteString(FGroupName, _NOTULEN_DISABLE, '1'); 755 | Result := True; 756 | end; 757 | 758 | function TCarikController.IsDisabled: boolean; 759 | begin 760 | Result := False; 761 | if FGroupData.ReadString(FGroupName, _NOTULEN_DISABLE, '0') = '1' then 762 | Result := True; 763 | end; 764 | 765 | function TCarikController.IsImageRecognitionDisabled: boolean; 766 | begin 767 | Result := FGroupData.ReadBool(FGroupName, _NOTULEN_IMAGERECOGNITION_DISABLED, False); 768 | end; 769 | 770 | procedure TCarikController.ImageRecognitionCounting; 771 | var 772 | i: integer; 773 | begin 774 | i := FGroupData.ReadInteger(FGroupName, _NOTULEN_IMAGERECOGNITION_COUNTING, 0) + 1; 775 | FGroupData.WriteInteger(FGroupName, _NOTULEN_IMAGERECOGNITION_COUNTING, i); 776 | end; 777 | 778 | function TCarikController.isValidCommand(CommandString: string): boolean; 779 | var 780 | s: string; 781 | begin 782 | Result := False; 783 | for s in CommandList do 784 | begin 785 | if CommandString = s then 786 | Exit(True); 787 | end; 788 | end; 789 | 790 | function TCarikController.IsCommand(Text: string): boolean; 791 | var 792 | lst: TStrings; 793 | begin 794 | Result := False; 795 | if Text = '' then 796 | Exit; 797 | lst := Explode(Text, ':'); 798 | if lst.Count = 1 then 799 | Exit; 800 | if isValidCommand(lst[0]) then 801 | Result := True; 802 | lst.Free; 803 | end; 804 | 805 | function TCarikController.ExecCommand(Text: string): string; 806 | var 807 | s, _dir: string; 808 | lst: TStrings; 809 | 810 | begin 811 | Result := ''; 812 | 813 | _dir := _NOTULEN_PATH_DEFAULT + _NOTULEN_PATH_DOCS; 814 | _dir := Format(_dir, [FGroupName]); 815 | _dir := StringReplace(_dir, '//', '/', [rfReplaceAll]); 816 | 817 | lst := Explode(Text, ':'); 818 | case lst[0] of 819 | _AI_CMD_OPENFILE: 820 | begin 821 | s := trim(_dir + lst[1]); 822 | s := StringReplace(s, '\n', '', [rfReplaceAll]); 823 | Result := openFile(s); 824 | end; 825 | end; 826 | 827 | lst.Free; 828 | end; 829 | 830 | function TCarikController.AdminAdd(ValidUserName: string): boolean; 831 | begin 832 | Result := False; 833 | if FGroupName = '' then 834 | Exit; 835 | if not IsPermitted then 836 | Exit; 837 | if ValidUserName = '' then 838 | Exit; 839 | ValidUserName := StringReplace(ValidUserName, '@', '', [rfReplaceAll]); 840 | 841 | FGroupData.WriteInteger(FGroupName, _NOTULEN_ADMIN_PREFIX + ValidUserName, 1); 842 | Result := True; 843 | end; 844 | 845 | function TCarikController.AdminDel(ValidUserName: string): boolean; 846 | begin 847 | Result := False; 848 | if FGroupName = '' then 849 | Exit; 850 | if not IsPermitted then 851 | Exit; 852 | if ValidUserName = '' then 853 | Exit; 854 | ValidUserName := StringReplace(ValidUserName, '@', '', [rfReplaceAll]); 855 | 856 | //FGroupData.DeleteKey(FGroupName, _NOTULEN_ADMIN_PREFIX + ValidUserName); 857 | FGroupData.WriteInteger(FGroupName, _NOTULEN_ADMIN_PREFIX + ValidUserName, 0); 858 | Result := True; 859 | end; 860 | 861 | function TCarikController.getGroupInfo(GroupNameID: string; ADetail: boolean): string; 862 | var 863 | i: integer; 864 | s, _groupname, gid: string; 865 | begin 866 | _groupname := FGroupData.ReadString(GroupNameID, 'name', ''); 867 | gid := FGroupData.ReadString(GroupNameID, 'id', ''); 868 | if _groupname = '' then 869 | _groupname := GroupNameID; 870 | 871 | s := ''; 872 | if FGroupData.ReadString(GroupNameID, _NOTULEN_DISABLE, '0') = '0' then 873 | Result := '*' + _groupname + '*' 874 | else 875 | Result := '' + _groupname + ''; 876 | 877 | s := ''; 878 | if FGroupData.ReadString(GroupNameID, _NOTULEN_RECORDING, '0') = '1' then 879 | begin 880 | s := ' recording(' + FGroupData.ReadString(GroupNameID, _NOTULEN_COUNT, '0') + ')'; 881 | if FGroupData.ReadString(GroupNameID, _NOTULEN_TOPIC, '') <> '' then 882 | s := s + '\n- topic: ' + FGroupData.ReadString(GroupNameID, _NOTULEN_TOPIC, ''); 883 | end; 884 | Result := Result + s; 885 | 886 | { 887 | if FGroupData.ReadString(GroupNameID, _NOTULEN_IMAGERECOGNITION_COUNTING, '0') <> '0' then 888 | s := s + ' img(' + FGroupData.ReadString(GroupNameID, 889 | _NOTULEN_IMAGERECOGNITION_COUNTING, '0') + ')'; 890 | } 891 | 892 | s := getGroupAdminList(GroupNameID); 893 | if s <> '' then 894 | begin 895 | if ADetail then 896 | begin 897 | s := ' ├ @' + StringReplace(s, ', ', #10' ├ @', [rfReplaceAll]); 898 | Result := Result + #10'👤 Lurah:'#10 + s; 899 | end 900 | else 901 | Result := Result + '\n - lurah: ' + s; 902 | end; 903 | 904 | // detail group - admin list etc 905 | if ADetail then 906 | begin 907 | Telegram := TTelegramIntegration.Create; 908 | Telegram.Token := Config['telegram/default/token']; 909 | if Telegram.Token = '' then 910 | Exit; 911 | s := Telegram.GroupAdminList(gid); 912 | if s <> '' then 913 | begin 914 | s := ' ├ ' + StringReplace(s, ',', #10' ├ ', [rfReplaceAll]); 915 | Result := Result + #10'👮 Admin:'#10 + s; 916 | end; 917 | i := Telegram.GroupMemberCount(gid); 918 | Result := Result + #10'👥 ada ' + i2s(i) + ' anggota'; 919 | Telegram.Free; 920 | end; // detail group 921 | 922 | //Result := StringReplace(Result, #10, '\n', [rfReplaceAll]); 923 | end; 924 | 925 | function TCarikController.getGroupAdminList(GroupNameID: string): string; 926 | var 927 | i: integer; 928 | s: string; 929 | lst: TStrings; 930 | begin 931 | Result := ''; 932 | lst := TStringList.Create; 933 | 934 | FGroupData.ReadSectionValues(GroupNameID, lst); 935 | s := ''; 936 | for i := 0 to lst.Count - 1 do 937 | begin 938 | if Pos('admin-', lst[i]) > 0 then 939 | begin 940 | s := copy(lst[i], 7); 941 | s := copy(s, 1, pos('=', s) - 1); 942 | Result := Result + ' ' + s; 943 | end; 944 | end; 945 | 946 | Result := trim(Result); 947 | Result := StringReplace(Result, ' ', ', ', [rfReplaceAll]); 948 | lst.Free; 949 | end; 950 | 951 | 952 | function TCarikController.GroupInfo: string; 953 | var 954 | i: integer; 955 | lastGroup: string; 956 | lst, return: TStrings; 957 | begin 958 | if not IsPermitted then 959 | Exit; 960 | lst := TStringList.Create; 961 | return := TStringList.Create; 962 | 963 | FGroupData.ReadSections(lst); 964 | 965 | lastGroup := ''; 966 | if FGroupName = '' then 967 | begin 968 | lastGroup := '*20 Group Terakhir:* '; 969 | for i := lst.Count - 20 to lst.Count - 1 do 970 | begin 971 | if i < lst.Count - 1 then 972 | lastGroup := lastGroup + #10'├ ' + i2s(i) + '. ' + (lst[i]) 973 | else 974 | lastGroup := lastGroup + #10'└ ' + i2s(i) + '. ' + (lst[i]); 975 | end; 976 | end; 977 | (lst as TStringList).Sort; 978 | 979 | for i := 0 to lst.Count - 1 do 980 | begin 981 | if FGroupName <> '' then 982 | begin 983 | if lst[i] = FGroupName then 984 | begin 985 | return.Add(getGroupInfo(lst[i], True)); 986 | end; 987 | end 988 | else 989 | begin 990 | if i < lst.Count - 1 then 991 | return.Add('├ ' + i2s(i + 1) + '. ' + getGroupInfo(lst[i])) 992 | else 993 | return.Add('└ ' + i2s(i + 1) + '. ' + getGroupInfo(lst[i])); 994 | end; 995 | end; 996 | 997 | Result := lastGroup + ' '; 998 | if FGroupName <> '' then 999 | Result := lastGroup + #10#10'*Group Info:*'#10 + return.Text; 1000 | Result := StringReplace(Result, #13, '\n', [rfReplaceAll]); 1001 | Result := StringReplace(Result, #10, '\n', [rfReplaceAll]); 1002 | Result := StringReplace(Result, '_', '\_', [rfReplaceAll]); 1003 | 1004 | return.Free; 1005 | lst.Free; 1006 | end; 1007 | 1008 | procedure TCarikController.Invited; 1009 | begin 1010 | FData.WriteString(_NOTULEN_SECTION_GROUP_LIST, FGroupChatID, FGroupName); 1011 | 1012 | FGroupData.WriteString(FGroupName, _NOTULEN_GROUP_ID, FGroupChatID); 1013 | FGroupData.WriteString(FGroupName, _NOTULEN_INVITEDBY_ID, FUserID); 1014 | FGroupData.WriteString(FGroupName, _NOTULEN_INVITEDBY_NAME, FFullName); 1015 | FGroupData.WriteString(FGroupName, _NOTULEN_INVITEDBY_USERNAME, FUserName); 1016 | FGroupData.WriteString(FGroupName, _NOTULEN_INVITEDBY_DATE, 1017 | FormatDateTime('yyyy/mm/dd hh:nn', now)); 1018 | LogUtil.Add('invited to ' + FGroupChatID + ' ' + FGroupName, 'INVITATION'); 1019 | end; 1020 | 1021 | end. 1022 | -------------------------------------------------------------------------------- /source/package/src/controller/domainwhois_controller.pas: -------------------------------------------------------------------------------- 1 | unit domainwhois_controller; 2 | 3 | {$mode objfpc}{$H+} 4 | 5 | interface 6 | 7 | uses 8 | whois_integration, dateutils, common, RegExpr, fpjson, 9 | Classes, SysUtils; 10 | 11 | type 12 | 13 | { TDomainWhoisController } 14 | 15 | TDomainWhoisController = class 16 | private 17 | FCache: boolean; 18 | Whois: TWhoisIntegration; 19 | public 20 | constructor Create; 21 | destructor Destroy; 22 | 23 | property Cache: boolean read FCache write FCache; 24 | function Find(DomainName, Option: string): string; 25 | end; 26 | 27 | implementation 28 | 29 | const 30 | _WHOIS_CACHE_PATH = 'ztemp/cache/domains/'; 31 | _WHOIS_CACHE_EXTENSION = '.txt'; 32 | 33 | { TDomainWhoisController } 34 | 35 | constructor TDomainWhoisController.Create; 36 | begin 37 | FCache := True; 38 | end; 39 | 40 | destructor TDomainWhoisController.Destroy; 41 | begin 42 | end; 43 | 44 | function TDomainWhoisController.Find(DomainName, Option: string): string; 45 | var 46 | cacheFile: string; 47 | forceWhois: boolean; 48 | i: integer; 49 | begin 50 | if not isDomain(DomainName) then 51 | begin 52 | Result := 'sepertinya nama domain tidak valid'; 53 | Exit; 54 | end; 55 | 56 | DomainName := StringReplace( DomainName, 'http://', '', [rfReplaceAll]); 57 | DomainName := StringReplace( DomainName, 'https://', '', [rfReplaceAll]); 58 | DomainName := StringReplace( DomainName, 'www.', '', [rfReplaceAll]); 59 | Result := 'finding ' + domainName; 60 | 61 | cacheFile := _WHOIS_CACHE_PATH + domainName + _WHOIS_CACHE_EXTENSION; 62 | 63 | Whois := TWhoisIntegration.Create; 64 | if not Whois.LoadServerList then 65 | begin 66 | Exit; 67 | end; 68 | try 69 | forceWhois := False; 70 | if FileExists(cacheFile) then 71 | begin 72 | i := HoursBetween(FileDateToDateTime(FileAge(cacheFile)), now); 73 | if i = 0 then 74 | Whois.Data.LoadFromFile(cacheFile) 75 | else 76 | forceWhois := True; 77 | end 78 | else 79 | forceWhois := True; 80 | 81 | if forceWhois then 82 | begin 83 | if not Whois.Find(DomainName) then 84 | begin 85 | Result := 'Informasi whois domain ' + DomainName + ' tidak ditemukan'; 86 | Exit; 87 | end; 88 | if FCache then 89 | Whois.Data.SaveToFile(cacheFile); 90 | end; 91 | 92 | Result := 'Domain: ' + UpperCase(domainName) 93 | + '\nRegistrar: ' + Whois.Registrar 94 | + '\nRegistrant: ' + Whois.Registrant 95 | + '\nStatus: ' + Whois.Status 96 | + '\nUpdated Date: ' + Whois.UpdatedDate 97 | + '\nCreation Date: ' + Whois.CreationDate 98 | + '\nExpiration Date: ' + Whois.ExpiredDate 99 | + '\nName Server: ' + Whois.NameServer; 100 | if ((Option = 'full') or (Option = 'lengkap')) then 101 | begin 102 | Result := StringToJSONString(Whois.Data.Text); 103 | end; 104 | except 105 | on E: Exception do 106 | begin 107 | Result := 'failed: ' + E.Message; 108 | end; 109 | end; 110 | Whois.Free; 111 | end; 112 | 113 | end. 114 | 115 | 116 | 117 | 118 | 119 | 120 | 121 | 122 | 123 | 124 | 125 | 126 | 127 | -------------------------------------------------------------------------------- /source/package/src/controller/jadwalsholat_controller.pas: -------------------------------------------------------------------------------- 1 | { 2 | This file is part of the SimpleBOT package. 3 | (c) Luri Darmawan <luri@fastplaz.com> 4 | 5 | For the full copyright and license information, please view the LICENSE 6 | file that was distributed with this source code. 7 | } 8 | unit jadwalsholat_controller; 9 | 10 | {$mode objfpc}{$H+} 11 | 12 | interface 13 | 14 | uses 15 | common, http_lib, fpjson, json_lib, 16 | dateutils, Classes, SysUtils; 17 | 18 | type 19 | 20 | { TJadwalSholatController } 21 | 22 | TJadwalSholatController = class 23 | private 24 | FCache: boolean; 25 | function getJadwalSholatData(CityName: string; Day: integer): string; 26 | public 27 | constructor Create; 28 | destructor Destroy; 29 | 30 | property Cache: boolean read FCache write FCache; 31 | function Find(CityName: string; Day: integer): string; 32 | end; 33 | 34 | 35 | implementation 36 | 37 | const 38 | _JADWALSHOLAT_DEFAULT_CITY = 'jakarta'; 39 | _JADWALSHOLAT_MSG_ERROR = 'maaf... \ngagal mendapatkan informasi jadwal sholat'; 40 | _JADWALSHOLAT_LAMPUMIMPI_URL = 41 | 'http://lampumimpi.com/jadwal_sholat/kota/%city/hari/%day'; 42 | _JADWALSHOLAT_CACHE_DIR = 'ztemp/cache/jadwalsholat/'; 43 | _JADWALSHOLAT_CACHE__EXTENSION = '.txt'; 44 | 45 | // example: 46 | // http://lampumimpi.com/jadwal_sholat/kota/bandung/hari/19 47 | // result: 48 | // {"code":200,"success":true,"message":"Jadwal sholat kota bandung.","data":[{"hari":"19","shubuh":"04:26","dzuhur":"12:04","ashar":"15:28","magrib":"18:18","isya":"19:33"}]} 49 | 50 | var 51 | Response: IHTTPResponse; 52 | 53 | { TJadwalSholatController } 54 | 55 | constructor TJadwalSholatController.Create; 56 | begin 57 | FCache := True; 58 | end; 59 | 60 | destructor TJadwalSholatController.Destroy; 61 | begin 62 | end; 63 | 64 | function TJadwalSholatController.getJadwalSholatData(CityName: string; 65 | Day: integer): string; 66 | var 67 | s, return: string; 68 | json: TJSONUtil; 69 | jsonData: TJSONData; 70 | i: integer; 71 | httpClient: THTTPLib; 72 | begin 73 | Result := ''; 74 | 75 | httpClient := THTTPLib.Create; 76 | s := UrlEncode(LowerCase(CityName), False); 77 | if s = '' then 78 | s := _JADWALSHOLAT_DEFAULT_CITY; 79 | httpClient.URL := StringReplace(_JADWALSHOLAT_LAMPUMIMPI_URL, '%city', s, 80 | [rfReplaceAll]); 81 | httpClient.URL := StringReplace(httpClient.URL, '%day', format( '%.2d', [Day]), [rfReplaceAll]); 82 | 83 | Response := httpClient.Get; 84 | httpClient.Free; 85 | if Response.ResultCode <> 200 then 86 | Exit; 87 | 88 | try 89 | jsonData := GetJSON(Response.ResultText); 90 | if jsonData.GetPath('code').AsString = '200' then 91 | begin 92 | Result := Response.ResultText; 93 | end; 94 | jsonData.Free; 95 | except 96 | on E: Exception do 97 | begin 98 | end; 99 | end; 100 | 101 | end; 102 | 103 | function TJadwalSholatController.Find(CityName: string; Day: integer): string; 104 | var 105 | cacheFile, s: string; 106 | json: TJSONUtil; 107 | jsonData: TJSONData; 108 | forceGetJadwal: boolean; 109 | i: integer; 110 | cacheData: TStringList; 111 | begin 112 | Result := ''; 113 | cacheData := TStringList.Create; 114 | 115 | if CityName = '' then 116 | CityName := _JADWALSHOLAT_DEFAULT_CITY; 117 | cacheFile := _JADWALSHOLAT_CACHE_DIR + CityName + '-' + i2s(Day) + 118 | _JADWALSHOLAT_CACHE__EXTENSION; 119 | forceGetJadwal := False; 120 | if FileExists(cacheFile) then 121 | begin 122 | i := HoursBetween(FileDateToDateTime(FileAge(cacheFile)), now); 123 | if i = 0 then 124 | cacheData.LoadFromFile(cacheFile) 125 | else 126 | forceGetJadwal := True; 127 | end 128 | else 129 | forceGetJadwal := True; 130 | 131 | if forceGetJadwal then 132 | begin 133 | cacheData.Text := getJadwalSholatData(CityName, Day); 134 | if cacheData.Text = '' then 135 | begin 136 | Result := _JADWALSHOLAT_MSG_ERROR; 137 | Exit; 138 | end; 139 | if FCache then 140 | cacheData.SaveToFile(cacheFile); 141 | end; 142 | 143 | try 144 | jsonData := GetJSON(cacheData.Text); 145 | s := jsonData.GetPath('data').AsJSON; 146 | s := Copy(s, 2, length(s) - 2); // force jsonarray to jsonstring 147 | 148 | json := TJSONUtil.Create; 149 | json.LoadFromJsonString(s); 150 | s := jsonData.GetPath('message').AsString; 151 | s := s + '\nshubuh: ' + json['shubuh']; 152 | s := s + '\ndzuhur: ' + json['dzuhur']; 153 | s := s + '\nashar: ' + json['ashar']; 154 | s := s + '\nmagrib: ' + json['magrib']; 155 | s := s + '\nisya: ' + json['isya']; 156 | json.Free; 157 | 158 | Result := s; 159 | except 160 | on E: Exception do 161 | begin 162 | Result := _JADWALSHOLAT_MSG_ERROR; //e.Message; 163 | end; 164 | end; 165 | 166 | end; 167 | 168 | end. 169 | -------------------------------------------------------------------------------- /source/package/src/controller/kamus_controller.pas: -------------------------------------------------------------------------------- 1 | { 2 | This file is part of the SimpleBOT package. 3 | (c) Luri Darmawan <luri@fastplaz.com> 4 | 5 | For the full copyright and license information, please view the LICENSE 6 | file that was distributed with this source code. 7 | } 8 | unit kamus_controller; 9 | 10 | {$mode objfpc}{$H+} 11 | 12 | interface 13 | 14 | uses 15 | kamusibacor_integration, kamuskemdikbud_integration, 16 | common, http_lib, fpjson, json_lib, 17 | dateutils, Classes, SysUtils; 18 | 19 | type 20 | 21 | { TKamusController } 22 | 23 | TKamusController = class 24 | private 25 | FCache: boolean; 26 | FToken: string; 27 | function getDataKamusIbacor(Text: string): string; 28 | function getDataKamusKemdikbud(Text: string): string; 29 | function findKemdikbud(Text: string): string; 30 | function findIbacor(Text: string): string; 31 | public 32 | constructor Create; 33 | destructor Destroy; 34 | 35 | property Cache: boolean read FCache write FCache; 36 | property Token: string read FToken write FToken; 37 | function Find(Text: string): string; 38 | end; 39 | 40 | 41 | implementation 42 | 43 | const 44 | _KAMUS_CACHE_DIR = 'ztemp/cache/kamus/'; 45 | _KAMUS_CACHE_EXTENSION = '.txt'; 46 | _KAMUS_MSG_ERROR = 'Maaf, saat ini data belum bisa saya temukan'; 47 | _KAMUS_MSG_ERROR_TOKEN = 'Maaf, belum bisa akses ke database kamus'; 48 | _KAMUS_MAX_RESULT = 2; 49 | 50 | var 51 | Response: IHTTPResponse; 52 | 53 | { TKamusController } 54 | 55 | constructor TKamusController.Create; 56 | begin 57 | FCache := True; 58 | 59 | end; 60 | 61 | destructor TKamusController.Destroy; 62 | begin 63 | 64 | end; 65 | 66 | function TKamusController.getDataKamusIbacor(Text: string): string; 67 | begin 68 | Result := ''; 69 | with TKamusIbacorIntegration.Create do 70 | begin 71 | Result := Find(Text); 72 | Free; 73 | end; 74 | end; 75 | 76 | function TKamusController.getDataKamusKemdikbud(Text: string): string; 77 | begin 78 | Result := ''; 79 | with TKamusIntegration.Create do 80 | begin 81 | Result := Find(Text); 82 | Free; 83 | end; 84 | end; 85 | 86 | function TKamusController.Find(Text: string): string; 87 | var 88 | lst : TStrings; 89 | begin 90 | lst := Explode( Text, ' '); 91 | //Result := findKemdikbud( lst.ValueFromIndex[0]); 92 | Result := findKemdikbud( Text); 93 | Result := '*tentang ' + Text + ':*\n' + Result; 94 | lst.Free; 95 | end; 96 | 97 | function TKamusController.findKemdikbud(Text: string): string; 98 | var 99 | forceGetKamus: boolean; 100 | i: integer; 101 | cacheFile: string; 102 | cacheData: TStringList; 103 | begin 104 | Result := ''; 105 | cacheData := TStringList.Create; 106 | forceGetKamus := False; 107 | cacheFile := _KAMUS_CACHE_DIR + Text + _KAMUS_CACHE_EXTENSION; 108 | 109 | forceGetKamus := False; 110 | if FileExists(cacheFile) then 111 | begin 112 | i := HoursBetween(FileDateToDateTime(FileAge(cacheFile)), now); 113 | if i = 0 then 114 | cacheData.LoadFromFile(cacheFile) 115 | else 116 | forceGetKamus := True; 117 | end 118 | else 119 | forceGetKamus := True; 120 | 121 | if forceGetKamus then 122 | begin 123 | cacheData.Text := getDataKamusKemdikbud(Text); 124 | if cacheData.Text = '' then 125 | begin 126 | Result := _KAMUS_MSG_ERROR; 127 | cacheData.Free ; 128 | Exit; 129 | end; 130 | if FCache then 131 | cacheData.SaveToFile(cacheFile); 132 | end; 133 | 134 | Result := cacheData.Text; 135 | cacheData.Free; 136 | end; 137 | 138 | function TKamusController.findIbacor(Text: string): string; 139 | var 140 | s, cacheFile: string; 141 | cacheData: TStringList; 142 | forceGetKamus: boolean; 143 | i: integer; 144 | jsonData: TJSONData; 145 | begin 146 | Result := ''; 147 | Text := trim(Text); 148 | if Text = '' then 149 | Exit; 150 | if FToken = '' then 151 | begin 152 | Result := _KAMUS_MSG_ERROR_TOKEN; 153 | Exit; 154 | end; 155 | cacheData := TStringList.Create; 156 | 157 | forceGetKamus := False; 158 | cacheFile := _KAMUS_CACHE_DIR + Text + _KAMUS_CACHE_EXTENSION; 159 | if FileExists(cacheFile) then 160 | begin 161 | i := HoursBetween(FileDateToDateTime(FileAge(cacheFile)), now); 162 | if i = 0 then 163 | cacheData.LoadFromFile(cacheFile) 164 | else 165 | forceGetKamus := True; 166 | end 167 | else 168 | forceGetKamus := True; 169 | 170 | if forceGetKamus then 171 | begin 172 | cacheData.Text := getDataKamusIbacor(Text); 173 | if cacheData.Text = '' then 174 | begin 175 | Result := _KAMUS_MSG_ERROR; 176 | cacheData.Free; 177 | Exit; 178 | end; 179 | if FCache then 180 | cacheData.SaveToFile(cacheFile); 181 | end; 182 | 183 | jsonData := GetJSON(cacheData.Text); 184 | Result := UpperCase(Text) + ':'; 185 | try 186 | for i := 0 to _KAMUS_MAX_RESULT - 1 do 187 | begin 188 | s := jsonData.GetPath('kamus[0][' + i2s(i) + '].arti[0]').AsString; 189 | Result := Result + #13'-' + s; 190 | end; 191 | except 192 | end; 193 | 194 | Result := StringReplace(Result, #13, '\n', [rfReplaceAll]); 195 | cacheData.Free; 196 | end; 197 | 198 | 199 | end. 200 | -------------------------------------------------------------------------------- /source/package/src/controller/movie_controller.pas: -------------------------------------------------------------------------------- 1 | { 2 | This file is part of the SimpleBOT package. 3 | (c) Luri Darmawan <luri@fastplaz.com> 4 | 5 | For the full copyright and license information, please view the LICENSE 6 | file that was distributed with this source code. 7 | } 8 | unit movie_controller; 9 | 10 | {$mode objfpc}{$H+} 11 | 12 | interface 13 | 14 | uses 15 | ombd_integration, 16 | common, 17 | Classes, SysUtils; 18 | 19 | type 20 | 21 | { TMovieController } 22 | 23 | TMovieController = class 24 | private 25 | FCache: boolean; 26 | FKey: string; 27 | FOmdb: TOmdbIntegration; 28 | public 29 | constructor Create; 30 | destructor Destroy; override; 31 | 32 | property Cache: boolean read FCache write FCache; 33 | function Find(MovieTitle: string): string; 34 | property Key:string read FKey write FKey; 35 | end; 36 | 37 | implementation 38 | 39 | { TMovieController } 40 | 41 | constructor TMovieController.Create; 42 | begin 43 | FKey := ''; 44 | FCache := True; 45 | end; 46 | 47 | destructor TMovieController.Destroy; 48 | begin 49 | end; 50 | 51 | function TMovieController.Find(MovieTitle: string): string; 52 | var 53 | _forceGetInfo: boolean; 54 | begin 55 | Result := ''; 56 | 57 | _forceGetInfo := True; //TODO: remove 58 | if _forceGetInfo then 59 | begin 60 | FOmdb := TOmdbIntegration.Create; 61 | FOmdb.Key := FKey; 62 | Result := FOmdb.Find(MovieTitle); 63 | FOmdb.Free; 64 | end; 65 | end; 66 | 67 | end. 68 | 69 | 70 | -------------------------------------------------------------------------------- /source/package/src/entities_lib.pas: -------------------------------------------------------------------------------- 1 | { 2 | This file is part of the SimpleAI package. 3 | (c) Luri Darmawan <luri@fastplaz.com> 4 | 5 | For the full copyright and license information, please view the LICENSE 6 | file that was distributed with this source code. 7 | } 8 | unit entities_lib; 9 | 10 | {$mode objfpc}{$H+} 11 | 12 | interface 13 | 14 | uses 15 | IniFiles, RegExpr, 16 | Classes, SysUtils; 17 | 18 | const 19 | _SIMPLEAI_ENTITIES_DATA_FILENAME = 'files/entities.txt'; 20 | _SIMPLEAI_ENTITIES_SEPARATOR = '|'; 21 | 22 | type 23 | 24 | { TEntitiesFAI } 25 | 26 | TEntitiesFAI = class 27 | private 28 | FAction: string; 29 | FData: TMemIniFile; 30 | FDataAsList: TStringList; 31 | FEntityName: string; 32 | FisLoaded: boolean; 33 | FKey: string; 34 | FValue: string; 35 | 36 | public 37 | constructor Create; virtual; 38 | destructor Destroy; virtual; 39 | 40 | procedure Clear; 41 | function AddDataEntitiesFromFile(FileName: string): boolean; 42 | function LoadDataFromFile(FileName: string = 43 | _SIMPLEAI_ENTITIES_DATA_FILENAME): boolean; 44 | 45 | function GetPregString(EntityName: string; SpecificKey: string = ''): string; 46 | 47 | function GetKey(const EntityName: string; Text: string): string; 48 | function Exists(Text: string): boolean; 49 | 50 | // regex 51 | function preg_match(const RegexExpression: string; SourceString: string): boolean; 52 | function preg_replace(const RegexExpression, ReplaceString, SourceString: string; 53 | UseSubstitution: boolean): string; 54 | 55 | function SetData(List: TStrings): boolean; 56 | 57 | published 58 | property Data: TMemIniFile read FData write FData; 59 | property Action: string read FAction; 60 | property EntityName: string read FEntityName; 61 | property Key: string read FKey; 62 | property Value: string read FValue; 63 | property isLoaded: boolean read FisLoaded; 64 | end; 65 | 66 | implementation 67 | 68 | { TEntitiesFAI } 69 | 70 | function TEntitiesFAI.preg_match(const RegexExpression: string; 71 | SourceString: string): boolean; 72 | begin 73 | Result := False; 74 | try 75 | with TRegExpr.Create do 76 | begin 77 | Expression := RegexExpression; 78 | Result := Exec(SourceString); 79 | Free; 80 | end; 81 | except 82 | end; 83 | end; 84 | 85 | function TEntitiesFAI.preg_replace( 86 | const RegexExpression, ReplaceString, SourceString: string; 87 | UseSubstitution: boolean): string; 88 | begin 89 | try 90 | with TRegExpr.Create do 91 | begin 92 | Expression := RegexExpression; 93 | Result := Replace(SourceString, ReplaceString, UseSubstitution); 94 | Free; 95 | end; 96 | except 97 | Result := SourceString; 98 | end; 99 | end; 100 | 101 | constructor TEntitiesFAI.Create; 102 | begin 103 | FEntityName := ''; 104 | FKey := ''; 105 | FValue := ''; 106 | FAction := ''; 107 | FisLoaded := False; 108 | FDataAsList := TStringList.Create; 109 | 110 | end; 111 | 112 | destructor TEntitiesFAI.Destroy; 113 | begin 114 | FDataAsList.Free; 115 | 116 | if Assigned(FData) then 117 | FData.Free; 118 | end; 119 | 120 | procedure TEntitiesFAI.Clear; 121 | begin 122 | FData.Clear; 123 | end; 124 | 125 | function TEntitiesFAI.AddDataEntitiesFromFile(FileName: string): boolean; 126 | var 127 | lst: TStrings; 128 | begin 129 | Result := False; 130 | if not FileExists(FileName) then 131 | exit; 132 | ; 133 | 134 | if Assigned(FData) then 135 | FData.Free; 136 | FData := TMemIniFile.Create(''); 137 | FData.Clear; 138 | 139 | lst := TStringList.Create; 140 | with TStringList.Create do 141 | begin 142 | LoadFromFile(FileName); 143 | FDataAsList.Add(Text); 144 | 145 | lst.Text := FDataAsList.Text; 146 | FData.SetStrings(lst); 147 | 148 | FisLoaded := True; 149 | Result := True; 150 | Free; 151 | end; 152 | lst.Free; 153 | end; 154 | 155 | function TEntitiesFAI.SetData(List: TStrings): boolean; 156 | begin 157 | Result := False; 158 | if not Assigned(List) then 159 | Exit; 160 | 161 | if Assigned(FData) then 162 | FData.Free; 163 | FData := TMemIniFile.Create(''); 164 | FData.Clear; 165 | 166 | FDataAsList.Add(List.Text); 167 | FData.SetStrings(List); 168 | 169 | FisLoaded := True; 170 | Result := True; 171 | end; 172 | 173 | 174 | function TEntitiesFAI.LoadDataFromFile(FileName: string): boolean; 175 | begin 176 | Result := False; 177 | if not FileExists(FileName) then 178 | Exit; 179 | 180 | if Assigned(FData) then 181 | FData.Free; 182 | FData := TMemIniFile.Create(FileName); 183 | 184 | FisLoaded := True; 185 | Result := True; 186 | end; 187 | 188 | function TEntitiesFAI.GetPregString(EntityName: string; SpecificKey: string): string; 189 | var 190 | i: integer; 191 | str: TStrings; 192 | begin 193 | Result := ''; 194 | if not FisLoaded then 195 | Exit; 196 | 197 | if SpecificKey <> '' then 198 | begin 199 | if Pos('-', SpecificKey) <> 1 then 200 | begin 201 | Result := '(' + FData.ReadString(EntityName, SpecificKey, '') + ')'; 202 | Exit; 203 | end; 204 | end; 205 | 206 | str := TStringList.Create; 207 | FData.ReadSection(EntityName, str); 208 | 209 | Result := ''; 210 | for i := 0 to str.Count - 1 do 211 | begin 212 | if (('-' + str[i]) <> SpecificKey) then 213 | begin 214 | Result := Result + FData.ReadString(EntityName, str[i], ''); 215 | if i < str.Count - 1 then 216 | Result := Result + _SIMPLEAI_ENTITIES_SEPARATOR; 217 | end; 218 | end; 219 | if Result = '' then 220 | Result := '.*'; 221 | Result := '(' + Result + ')'; 222 | 223 | str.Free; 224 | end; 225 | 226 | function TEntitiesFAI.GetKey(const EntityName: string; Text: string): string; 227 | var 228 | i: integer; 229 | pattern: string; 230 | str: TStrings; 231 | begin 232 | Result := ''; 233 | FAction := ''; 234 | if (EntityName = '') or (Text = '') then 235 | Exit; 236 | 237 | Text := LowerCase(Text); 238 | str := TStringList.Create; 239 | 240 | FData.ReadSection(EntityName, str); 241 | for i := 0 to str.Count - 1 do 242 | begin 243 | pattern := '^(' + FData.ReadString(EntityName, str[i], '') + ')\Z'; 244 | if preg_match(pattern, Text) then 245 | begin 246 | Result := str[i]; 247 | str.Free; 248 | Exit; 249 | end; 250 | end; 251 | 252 | str.Free; 253 | end; 254 | 255 | function TEntitiesFAI.Exists(Text: string): boolean; 256 | var 257 | i: integer; 258 | s, entity_name, pattern: string; 259 | str: TStrings; 260 | begin 261 | Result := False; 262 | if Text = '' then 263 | Exit; 264 | FEntityName := ''; 265 | FKey := ''; 266 | Text := LowerCase(Text); 267 | str := TStringList.Create; 268 | 269 | FData.ReadSections(str); 270 | for i := 0 to str.Count - 1 do 271 | begin 272 | entity_name := str[i]; 273 | s := GetKey(entity_name, Text); 274 | if s <> '' then 275 | begin 276 | FKey := s; 277 | FEntityName := entity_name; 278 | str.Free; 279 | Result := True; 280 | Exit; 281 | end; 282 | end; 283 | str.Free; 284 | end; 285 | 286 | 287 | end. 288 | -------------------------------------------------------------------------------- /source/package/src/intents_lib.pas: -------------------------------------------------------------------------------- 1 | { 2 | This file is part of the SimpleAI package. 3 | (c) Luri Darmawan <luri@fastplaz.com> 4 | 5 | For the full copyright and license information, please view the LICENSE 6 | file that was distributed with this source code. 7 | } 8 | unit intents_lib; 9 | 10 | {$mode objfpc}{$H+} 11 | 12 | interface 13 | 14 | uses 15 | common, logutil_lib, 16 | entities_lib, 17 | RegExpr, IniFiles, Classes, SysUtils; 18 | 19 | const 20 | _SIMPLEAI_INTENT_DATA_FILENAME = 'files/intents.txt'; 21 | _SIMPLEAI_INTENT_ACTIONKEY = 'action'; 22 | _SIMPLEAI_OBJECT = 'object'; 23 | _SIMPLEAI_CONTEXT = 'context'; 24 | _SIMPLEAI_VARIABLE = 'var'; 25 | _SIMPLEAI_BOUNDARY = 'boundary'; 26 | _SIMPLEAI_LINK = 'link'; 27 | _AI_VARKEY = 'varkey'; 28 | _AI_LINKFROM = 'linkFrom'; 29 | 30 | type 31 | 32 | { TIntentsFAI } 33 | 34 | TIntentsFAI = class 35 | private 36 | FAction: string; 37 | FBoundary: boolean; 38 | FContext: string; 39 | FData: TMemIniFile; 40 | FDataAsList: TStringList; 41 | FDebug: boolean; 42 | FIntentKey: string; 43 | FIntentKeySpecific: string; 44 | FIntentName: string; 45 | FEntities: TEntitiesFAI; 46 | FisLoaded: boolean; 47 | FObjectName: string; 48 | FParameters: TStringList; 49 | FPattern: string; 50 | LogUtil : TLogUtil; 51 | 52 | public 53 | constructor Create; virtual; 54 | destructor Destroy; virtual; 55 | 56 | function LoadData: boolean; 57 | function LoadDataFromFile(FileName: string = 58 | _SIMPLEAI_INTENT_DATA_FILENAME): boolean; 59 | 60 | function Exec(Text: string): boolean; 61 | function Explode(Str, Delimiter: string): TStrings; 62 | 63 | procedure Clear; 64 | function AddDataIntentFromFile(FileName: string): boolean; 65 | function AddDataEntitiesFromFile(FileName: string): boolean; 66 | function SetData(List: TStrings): boolean; 67 | published 68 | property Data: TMemIniFile read FData write FData; 69 | property Entities: TEntitiesFAI read FEntities; 70 | property Action: string read FAction; 71 | property Context: string read FContext; 72 | property ObjectName: string read FObjectName; 73 | property IntentName: string read FIntentName; 74 | property IntentKey: string read FIntentKey; 75 | property IntentKeySpecific: string read FIntentKeySpecific; 76 | property Entity: TEntitiesFAI read FEntities; 77 | 78 | property isLoaded: boolean read FisLoaded; 79 | property isBoundary: boolean read FBoundary write FBoundary; 80 | property Parameters: TStringList read FParameters; 81 | property PatternString: string read FPattern; 82 | property Debug: boolean read FDebug write FDebug; 83 | end; 84 | 85 | 86 | implementation 87 | 88 | { TIntentsFAI } 89 | 90 | function TIntentsFAI.Explode(Str, Delimiter: string): TStrings; 91 | var 92 | i: integer; 93 | p: string; 94 | begin 95 | Result := TStringList.Create; 96 | while Pos(Delimiter, Str) <> 0 do 97 | begin 98 | p := ''; 99 | for i := 1 to Pos(Delimiter, Str) - 1 do 100 | p := p + Str[i]; 101 | Result.Add(p); 102 | //Delete(s,1,Pos(Delimiter,Str)); 103 | Delete(Str, 1, Pos(Delimiter, Str) + Length(Delimiter) - 1); 104 | end; 105 | //result.Add(s); 106 | if (Length(Str) <> 0) then 107 | Result.Add(Str); 108 | end; 109 | 110 | constructor TIntentsFAI.Create; 111 | begin 112 | FisLoaded := False; 113 | FEntities := TEntitiesFAI.Create; 114 | FParameters := TStringList.Create; 115 | FDataAsList := TStringList.Create; 116 | 117 | FAction := ''; 118 | FContext := ''; 119 | FObjectName := ''; 120 | FIntentName := ''; 121 | FIntentKey := ''; 122 | FDebug := False; 123 | FBoundary := True; 124 | //LogUtil := TLogUtil.Create; 125 | end; 126 | 127 | destructor TIntentsFAI.Destroy; 128 | begin 129 | if Assigned(LogUtil) then 130 | LogUtil.Free; 131 | if Assigned(FData) then 132 | FData.Free; 133 | 134 | FDataAsList.Free; 135 | FParameters.Free; 136 | FEntities.Free; 137 | end; 138 | 139 | function TIntentsFAI.Exec(Text: string): boolean; 140 | var 141 | i, j, k, v, p, match_index: integer; 142 | linkName: string; 143 | Source, s, pattern, entity_name, intent_name, key_used, section_name: string; 144 | intent_list, item_list, pattern_str: TStrings; 145 | varsIndex: TStringList; 146 | tmp: TStrings; 147 | regex: TRegExpr; 148 | begin 149 | Result := False; 150 | FIntentName := ''; 151 | FIntentKey := ''; 152 | FParameters.Clear; 153 | FIntentKeySpecific := ''; 154 | Text := Trim(Text); 155 | if Text = '' then 156 | Exit; 157 | if not Assigned(FData) then 158 | Exit; 159 | 160 | intent_list := TStringList.Create; 161 | item_list := TStringList.Create; 162 | pattern_str := TStringList.Create; 163 | varsIndex := TStringList.Create; 164 | tmp := TStringList.Create; 165 | FData.ReadSections(intent_list); 166 | for i := 0 to intent_list.Count - 1 do 167 | begin 168 | intent_name := intent_list[i]; 169 | FData.ReadSectionRaw(intent_name, item_list); 170 | 171 | FBoundary := True; 172 | linkName := ''; 173 | for j := 0 to item_list.Count - 1 do 174 | begin 175 | tmp := Explode(item_list[j], '='); 176 | if tmp[0] = _SIMPLEAI_INTENT_ACTIONKEY then 177 | Continue; 178 | if tmp[0] = _SIMPLEAI_OBJECT then 179 | Continue; 180 | if tmp[0] = _SIMPLEAI_CONTEXT then 181 | Continue; 182 | if tmp[0] = _SIMPLEAI_BOUNDARY then 183 | begin 184 | if tmp[1] = 'false' then 185 | FBoundary := False; 186 | Continue; 187 | end; 188 | if tmp[0] = _SIMPLEAI_VARIABLE then 189 | Continue; 190 | if tmp[0] = _SIMPLEAI_LINK then 191 | begin 192 | linkName := tmp[1]; 193 | Continue; 194 | end; 195 | pattern := tmp[1]; 196 | 197 | // if there are '=' in text 198 | if tmp.Count > 2 then 199 | begin 200 | pattern := ''; 201 | for k := 1 to tmp.Count - 1 do 202 | begin 203 | if k = 1 then 204 | pattern := tmp[k] 205 | else 206 | pattern := pattern + '=' + tmp[k]; 207 | end; 208 | end; 209 | 210 | FPattern := pattern; 211 | pattern_str := Explode(pattern, ' '); 212 | for k := pattern_str.Count - 1 downto 0 do 213 | begin 214 | s := pattern_str[k]; 215 | p := pos('(', s); 216 | if p = 1 then 217 | begin 218 | FParameters.Insert(0, '$' + i2s(k+1) + '='); 219 | end; 220 | p := pos('@', s); 221 | if p > 0 then 222 | begin 223 | key_used := ''; 224 | entity_name := Copy(s, p); 225 | entity_name := StringReplace(entity_name, '@', '', [rfReplaceAll]); 226 | 227 | // # parentheses handling: (@SomeIntent)someword 228 | p := Pos(')', entity_name); 229 | if p > 0 then 230 | entity_name := copy(entity_name, 0, p - 1); 231 | 232 | p := Pos(':', entity_name); 233 | if p > 0 then 234 | begin 235 | key_used := copy(entity_name, p + 1); 236 | entity_name := copy(entity_name, 0, p - 1); 237 | end; 238 | s := FEntities.GetPregString(entity_name, key_used); 239 | 240 | FParameters.Insert(0, entity_name + '='); 241 | if key_used <> '' then 242 | entity_name := entity_name + ':' + key_used; 243 | pattern := StringReplace(pattern, '@' + entity_name, s, [rfReplaceAll]); 244 | end; 245 | if k = 0 then 246 | Break; 247 | end; 248 | 249 | if FBoundary then 250 | if length(Text) > 1 then 251 | pattern := pattern + '\b'; 252 | 253 | try 254 | regex := TRegExpr.Create; 255 | regex.Expression := pattern; 256 | if regex.Exec(Text) then 257 | begin 258 | FIntentName := intent_name; 259 | FAction := FData.ReadString(FIntentName, _SIMPLEAI_INTENT_ACTIONKEY, ''); 260 | FContext := FData.ReadString(FIntentName, _SIMPLEAI_CONTEXT, ''); 261 | FObjectName := FData.ReadString(FIntentName, _SIMPLEAI_OBJECT, ''); 262 | 263 | key_used := ''; 264 | match_index := 1; 265 | varsIndex.Clear; 266 | repeat 267 | if FParameters.Count > 0 then 268 | section_name := FParameters.Names[match_index - 1]; 269 | s := regex.Match[match_index]; 270 | key_used := FEntities.GetKey(section_name, s); 271 | if key_used = '' then 272 | key_used := s; 273 | if FParameters.Count > 0 then 274 | FParameters.Values[section_name] := key_used; 275 | 276 | //FParameters.Values[ '_'+section_name + '_value'] := regex.Match[ match_index]; 277 | if trim(section_name) <> '' then 278 | FParameters.Values[section_name + '_value'] := regex.Match[match_index]; 279 | varsIndex.Values['$' + i2s(match_index)] := regex.Match[match_index]; 280 | Inc(match_index); 281 | until regex.Match[match_index] = ''; 282 | if varsIndex.Count > 0 then 283 | begin 284 | for v := 0 to varsIndex.Count - 1 do 285 | begin 286 | FParameters.Values[varsIndex.Names[v]] := varsIndex.ValueFromIndex[v]; 287 | end; 288 | end; 289 | FParameters.Sort; 290 | 291 | if FDebug then 292 | FParameters.Values['pattern'] := pattern; 293 | 294 | FIntentKey := tmp[0]; 295 | k := pos(':', FIntentKey); 296 | if k > 0 then 297 | begin 298 | FIntentKeySpecific := copy(FIntentKey, k + 1); 299 | FParameters.Add(_AI_VARKEY + '=' + FIntentKeySpecific); 300 | end; 301 | 302 | if not linkName.IsEmpty then 303 | begin 304 | FParameters.Add(_AI_LINKFROM + '=' + intent_name); 305 | FIntentName := linkName; 306 | end; 307 | 308 | regex.Free; 309 | tmp.Free; 310 | pattern_str.Free; 311 | item_list.Free; 312 | intent_list.Free; 313 | Result := True; 314 | Exit; 315 | end 316 | else 317 | begin 318 | FPattern := ''; 319 | end; 320 | 321 | except 322 | end; 323 | 324 | FParameters.Clear; 325 | regex.Free; 326 | end; 327 | 328 | end; 329 | 330 | tmp.Free; 331 | varsIndex.Free; 332 | pattern_str.Free; 333 | item_list.Free; 334 | intent_list.Free; 335 | end; 336 | 337 | procedure TIntentsFAI.Clear; 338 | begin 339 | FData.Clear; 340 | FEntities.Clear; 341 | end; 342 | 343 | function TIntentsFAI.AddDataIntentFromFile(FileName: string): boolean; 344 | var 345 | lst: TStrings; 346 | begin 347 | Result := False; 348 | if not FileExists(FileName) then 349 | exit; 350 | 351 | if Assigned(FData) then 352 | FData.Free; 353 | FData := TMemIniFile.Create(''); 354 | FData.Clear; 355 | 356 | lst := TStringList.Create; 357 | with TStringList.Create do 358 | begin 359 | LoadFromFile(FileName); 360 | FDataAsList.Add(Text); 361 | 362 | lst.Text := FDataAsList.Text; 363 | FData.SetStrings(lst); 364 | 365 | FisLoaded := True; 366 | Result := True; 367 | Free; 368 | end; 369 | lst.Free; 370 | end; 371 | 372 | function TIntentsFAI.AddDataEntitiesFromFile(FileName: string): boolean; 373 | begin 374 | Result := FEntities.AddDataEntitiesFromFile(FileName); 375 | end; 376 | 377 | function TIntentsFAI.SetData(List: TStrings): boolean; 378 | begin 379 | Result := False; 380 | if not Assigned(List) then 381 | Exit; 382 | 383 | if Assigned(FData) then 384 | FData.Free; 385 | FData := TMemIniFile.Create(''); 386 | FData.Clear; 387 | 388 | FDataAsList.Add(List.Text); 389 | FData.SetStrings(List); 390 | 391 | FisLoaded := True; 392 | Result := True; 393 | end; 394 | 395 | function TIntentsFAI.LoadData: boolean; 396 | begin 397 | FisLoaded := False; 398 | FEntities.LoadDataFromFile; 399 | LoadDataFromFile(); 400 | 401 | Result := True; 402 | end; 403 | 404 | function TIntentsFAI.LoadDataFromFile(FileName: string): boolean; 405 | begin 406 | Result := False; 407 | if not FileExists(FileName) then 408 | Exit; 409 | 410 | if Assigned(FData) then 411 | FData.Free; 412 | FData := TMemIniFile.Create(FileName); 413 | 414 | FisLoaded := True; 415 | Result := True; 416 | end; 417 | 418 | end. 419 | 420 | 421 | 422 | -------------------------------------------------------------------------------- /source/package/src/simpleai_lib.pas: -------------------------------------------------------------------------------- 1 | { 2 | This file is part of the SimpleAI package. 3 | (c) Luri Darmawan <luri@fastplaz.com> 4 | 5 | For the full copyright and license information, please view the LICENSE 6 | file that was distributed with this source code. 7 | } 8 | unit simpleai_lib; 9 | 10 | {$mode objfpc}{$H+} 11 | 12 | interface 13 | 14 | uses 15 | intents_lib, 16 | Classes, SysUtils; 17 | 18 | type 19 | 20 | { TSimpleAILib } 21 | 22 | TSimpleAILib = class 23 | private 24 | FIntents: TIntentsFAI; 25 | FisLoaded: boolean; 26 | function getAction: string; 27 | function getIntentName: string; 28 | function getParameters: TStrings; 29 | function getParameterValue(KeyName: string): string; 30 | function getPattern: string; 31 | public 32 | constructor Create; virtual; 33 | destructor Destroy; virtual; 34 | 35 | function Exec(Text: string): boolean; 36 | function LoadData: boolean; 37 | 38 | procedure Clear; 39 | function AddDataIntentFromFile(FileName: string): boolean; 40 | function AddDataEntitiesFromFile(FileName: string): boolean; 41 | 42 | property Values[KeyName: string]: string read getParameterValue; default; 43 | published 44 | property Intent: TIntentsFAI read FIntents; 45 | property Action: string read getAction; 46 | property IntentName: string read getIntentName; 47 | property Parameters: TStrings read getParameters; 48 | property Pattern: string read getPattern; 49 | property isLoaded: boolean read FisLoaded; 50 | 51 | end; 52 | 53 | 54 | implementation 55 | 56 | { TSimpleAILib } 57 | 58 | 59 | function TSimpleAILib.getIntentName: string; 60 | begin 61 | Result := FIntents.IntentName; 62 | end; 63 | 64 | function TSimpleAILib.getAction: string; 65 | begin 66 | Result := FIntents.Action; 67 | end; 68 | 69 | function TSimpleAILib.getParameters: TStrings; 70 | begin 71 | Result := FIntents.Parameters; 72 | end; 73 | 74 | function TSimpleAILib.getParameterValue(KeyName: string): string; 75 | begin 76 | Result := FIntents.Parameters.Values[KeyName]; 77 | end; 78 | 79 | function TSimpleAILib.getPattern: string; 80 | begin 81 | Result := FIntents.PatternString; 82 | end; 83 | 84 | constructor TSimpleAILib.Create; 85 | begin 86 | FisLoaded := False; 87 | FIntents := TIntentsFAI.Create; 88 | end; 89 | 90 | destructor TSimpleAILib.Destroy; 91 | begin 92 | FIntents.Free; 93 | end; 94 | 95 | function TSimpleAILib.Exec(Text: string): boolean; 96 | begin 97 | Result := FIntents.Exec(LowerCase(Trim(Text))); 98 | end; 99 | 100 | function TSimpleAILib.LoadData: boolean; 101 | begin 102 | FisLoaded := FIntents.LoadData; 103 | 104 | Result := FisLoaded; 105 | end; 106 | 107 | procedure TSimpleAILib.Clear; 108 | begin 109 | FIntents.Clear; 110 | 111 | end; 112 | 113 | function TSimpleAILib.AddDataIntentFromFile(FileName: string): boolean; 114 | begin 115 | Result := FIntents.AddDataIntentFromFile(FileName); 116 | end; 117 | 118 | function TSimpleAILib.AddDataEntitiesFromFile(FileName: string): boolean; 119 | begin 120 | Result := FIntents.AddDataEntitiesFromFile(FileName); 121 | end; 122 | 123 | 124 | 125 | end. 126 | 127 | 128 | -------------------------------------------------------------------------------- /source/package/src/simpleairedis_controller.pas: -------------------------------------------------------------------------------- 1 | unit simpleairedis_controller; 2 | 3 | {$mode objfpc}{$H+} 4 | 5 | interface 6 | 7 | uses 8 | {$IFNDEF Windows} 9 | cthreads, 10 | {$ENDIF} 11 | common, 12 | fpcgi, simpleai_controller, redis_controller, 13 | Classes, SysUtils; 14 | 15 | const 16 | _AI_COUNT__MINIMAL_ASKNAME = 5; 17 | _AI_ACTION_SEPARATOR = '|'; 18 | 19 | _AI_REDIS_ENTITIES = 'AI_ENTITIES'; 20 | _AI_REDIS_INTENTS = 'AI_INTENTS'; 21 | _AI_REDIS_RESPONSES = 'AI_RESPONSES'; 22 | 23 | type 24 | 25 | { TSimpleAIRedis } 26 | 27 | TSimpleAIRedis = class(TSimpleAI) 28 | private 29 | FUseRedis: boolean; 30 | FRedis: TRedisConstroller; 31 | public 32 | constructor Create; override; 33 | destructor Destroy; override; 34 | 35 | function RedisInit: boolean; 36 | function LoadDataFromRedis: boolean; 37 | published 38 | property UseRedis: boolean read FUseRedis write FUseRedis; 39 | end; 40 | 41 | implementation 42 | 43 | { TSimpleAIRedis } 44 | 45 | 46 | constructor TSimpleAIRedis.Create; 47 | begin 48 | inherited Create; 49 | end; 50 | 51 | destructor TSimpleAIRedis.Destroy; 52 | begin 53 | inherited Destroy; 54 | end; 55 | 56 | { 57 | constructor TSimpleAIRedis.Create; 58 | begin 59 | inherited Create; 60 | FUseRedis := False; 61 | //FRedis := TRedisConstroller.Create; 62 | end; 63 | 64 | destructor TSimpleAIRedis.Destroy; 65 | begin 66 | if Assigned( FRedis) then 67 | FRedis.Free; 68 | inherited Destroy; 69 | end; 70 | } 71 | function TSimpleAIRedis.RedisInit: boolean; 72 | var 73 | redis_text: WideString; 74 | lst: TStrings; 75 | begin 76 | Result := False; 77 | if FRedis.Ping then 78 | begin 79 | lst := TStringList.Create; 80 | 81 | SimpleAILib.Intent.Entities.Data.GetStrings(lst); 82 | redis_text := UrlEncode(lst.Text); 83 | FRedis[_AI_REDIS_ENTITIES] := redis_text; 84 | 85 | SimpleAILib.Intent.Data.GetStrings(lst); 86 | redis_text := UrlEncode(lst.Text); 87 | FRedis[_AI_REDIS_INTENTS] := redis_text; 88 | 89 | ResponData.GetStrings(lst); 90 | redis_text := UrlEncode(lst.Text); 91 | FRedis[_AI_REDIS_RESPONSES] := redis_text; 92 | 93 | lst.Free; 94 | Result := True; 95 | end; 96 | 97 | end; 98 | 99 | function TSimpleAIRedis.LoadDataFromRedis: boolean; 100 | var 101 | erri: integer; 102 | redis_text: WideString; 103 | lst: TStrings; 104 | begin 105 | Result := False; 106 | if not FRedis.Ping then 107 | Exit; 108 | 109 | erri := 0; 110 | lst := TStringList.Create; 111 | 112 | redis_text := FRedis[_AI_REDIS_ENTITIES]; 113 | lst.Text := UrlDecode(redis_text); 114 | if not SimpleAILib.Intent.Entities.SetData(lst) then 115 | erri := erri + 1; 116 | 117 | redis_text := FRedis[_AI_REDIS_INTENTS]; 118 | lst.Text := UrlDecode(redis_text); 119 | if not SimpleAILib.Intent.SetData(lst) then 120 | erri := erri + 2; 121 | 122 | redis_text := FRedis[_AI_REDIS_RESPONSES]; 123 | lst.Text := UrlDecode(redis_text); 124 | if not SetResponseData(lst) then 125 | erri := erri + 8; 126 | 127 | lst.Free; 128 | end; 129 | 130 | end. 131 | 132 | -------------------------------------------------------------------------------- /source/package/src/suggestion_controller.pas: -------------------------------------------------------------------------------- 1 | { 2 | This file is part of the SimpleBOT package. 3 | (c) Luri Darmawan <luri@fastplaz.com> 4 | 5 | For the full copyright and license information, please view the LICENSE 6 | file that was distributed with this source code. 7 | } 8 | unit suggestion_controller; 9 | 10 | { 11 | USAGE: 12 | send message with format: 13 | 14 | (suggest|saran) @answer : @question 15 | (suggest|saran) @answer: @question 16 | 17 | 18 | DATA FILE: 19 | files/suggestion.txt 20 | 21 | Better you can use your database server 22 | } 23 | 24 | {$mode objfpc}{$H+} 25 | 26 | interface 27 | 28 | uses 29 | Classes, SysUtils; 30 | 31 | type 32 | 33 | { TBotSuggestion } 34 | 35 | TBotSuggestion = class 36 | private 37 | FSuggestListFile: TextFile; 38 | FFileName: string; 39 | procedure setFileName(AValue: string); 40 | procedure AddString(Text: string); 41 | public 42 | constructor Create; virtual; 43 | destructor Destroy; virtual; 44 | function SuggestionHandler(const IntentName: string; Params: TStrings): string; 45 | property FileName: string read FFileName write setFileName; 46 | 47 | end; 48 | 49 | implementation 50 | 51 | { TBotSuggestion } 52 | 53 | procedure TBotSuggestion.setFileName(AValue: string); 54 | begin 55 | if FFileName = AValue then 56 | Exit; 57 | FFileName := AValue; 58 | end; 59 | 60 | procedure TBotSuggestion.AddString(Text: string); 61 | var 62 | s: string; 63 | begin 64 | 65 | end; 66 | 67 | constructor TBotSuggestion.Create; 68 | begin 69 | 70 | end; 71 | 72 | destructor TBotSuggestion.Destroy; 73 | begin 74 | 75 | end; 76 | 77 | function TBotSuggestion.SuggestionHandler(const IntentName: string; 78 | Params: TStrings): string; 79 | var 80 | s: string; 81 | begin 82 | s := trim(Params.Values['question_value']) + '=' + 83 | trim(Params.Values['answer_value']); 84 | AddString(s); 85 | 86 | try 87 | AssignFile(FSuggestListFile, FileName); 88 | { $I+} 89 | if not FileExists(FileName) then 90 | Rewrite(FSuggestListFile) 91 | else 92 | Append(FSuggestListFile); 93 | //WriteLn(FSuggestListFile, FormatDateTime('YYYY-mm-dd hh:nn:ss', now) + ' | ' + s); 94 | WriteLn(FSuggestListFile, s); 95 | CloseFile(FSuggestListFile); 96 | except 97 | on E: Exception do 98 | begin 99 | s := E.Message; 100 | end; 101 | end; 102 | 103 | Result := ''; 104 | end; 105 | 106 | end. 107 | --------------------------------------------------------------------------------