CS-C2100 - Ohjelmointistudio 1, 14.09.2020-20.12.2020
This course space end date is set to 20.12.2020 Search Courses: CS-C2100
Ryhmätehtävä: Telegram Bot
Tässä tehtävässä on tarkoitus 3-4-hengen ryhmissä rakentaa oma Telegram-botti.
Botti on tavallaan automatisoitu käyttäjä jonka toimia ohjataan ohjelmalla. Esimerkki botista on vaikkapa @weatherbot jolta voi kysyä säätiedotusta. Voit kokeilla jutella weatherbot:ille Telegramissa. WeatherBot saa jakamansa tiedon ulkoisista palveluista. Tässä tehtävässä rakennettava botti kuitenkin saa kaiken syötteensä käyttäjiltä ja tarjoaa jonkin palvelun joka hyödyttää useampaa saman kanavan käyttäjää. Lisäksi botin tulee säilyttää jossain muodossa tilaa Telegram-komentojen/viestien välillä. Tehtäväpohjan esimerkeistä mm. merkkijonon kääntävä toiminto ei ole tällainen, koska kaikki informaatio tulee viestistä ja tulevat toiminnot eivät riipu edellisistä.
Esimerkki
Esimerkki tilaa säilyttävästä botista olisi vaikkapa Pizzatilauspalvelu, jossa joku kanavan käyttäjistä ehdottaa pizzan ostamista ja muut käyttäjät voivat ilmoittaa haluavansa pizzasta erilaisia osuuksia (jokin määrä paloja). Kun koko pizza on jaettu, kerrotaan paljonko kenenkin täytyy maksaa.
Aapo: /pizza
Bot: Moi Aapo, millaisen pizzan halusit jakaa
Aapo: Pepperoni
Bot: Montako palaa?
Aapo: 8
Bot: Kerrotko vielä paljonko pizza maksaa
Aapo: 12€
Bot: Kiitoksia, käyn. mainostamassa tuota muille kanavan jäsenille
Bot: Moi Jenni! Aapo on tilaamassa Pepperonipizzaa
Siitä on juuri nyt 3/8 palaa jäljellä.
Kerro montako palaa (1-8) haluat tai vastaa 0 jos et halua mukaan
Jenni: 3
Bot: Kiitos Jenni!
Bot: Moi Jenni! Koko Pepperoni-pizza on nyt jaettu.
Sinun osuutesi on 5€. Pizzan tilaaja oli Aapo.
Ehdotetut aiheet
Tarkoitus on että kunkin assarin pienryhmät tekevät Botin eri aiheesta. Isommassa ryhmässä olisi ideaalisesti kolme ihan erilaista bottia ja pienryhmät voivat vapaasti tukea toisiaan ja jutella toteutuksesta projektin aikana. Pienryhmien on tarkoitus tavata useita kertoja projektin aikana, joista osa tapahtuu luento/ryhmätyöaikana.
Lopuksi jokainen pienryhmä palauttaa oman bottinsa. Palautus tehdään git:in kautta lisäämällä omalle assarille, sekä luennoitsijalle OttoSeppälä (oseppala) projektiin Maintainer-tason oikeudet.
Vaihtoehtoiset aiheet ryhmille
tapahtumailmoittautuminen
Uuden tapahtuman lisääminen (tunnus, pidempi nimi tai kuvaus, montako paikkaa on tarjolla)
Ilmoittautuminen tapahtumaan (tunnus), jono varasijoille mikäli täynnä
ilmoittautumisen peruminen (jonon tulee myös päivittyä)) Tällöin myös 1. Varasijalla olijalle ilmoitetaan ja siirretään hänet mukaan.
Kielenharjoitteluohjelma
Kerää opeteltavien sanojen listan käyttäjältä, listaa voidaan päivittää
Kyselee näitä kunnes jokainen kysymys on vastattu oikein.
Pyytää uusia kysymyksiä kun osataan liian hyvin (ja ehkä poistaa vanhoja).
Kysely
Luo kyselyitä, joita mainostaa kanavan muille jäsenille. Kysyy kyselyn luojalta tai kanavan jäseniltä vaihtoehtoja
Kun vaihtoehdot on syötetty, voi kyselyn käynnistää
Kun vastauksia on riittävästi tai kyselyn luoja sulkee sen, näytetään kaikille tulokset
Muitakin hyviä ideoita otetaan mukaan, kunhan ne eivät ole olennaisesti helpompia kuin edellämainitut. Ottakaa tällöin yhteyttä assariinne.
Ohjelmointikirjastosta ja tehtäväpohjasta
Ohjelmointikirjasto, jota käytämme tehtävässä on telegrambot4s, joka on sittemmin vaihtanut nimeä ja jota on osin muutettu. Käytämme kirjastosta versiota 3, jonka API on kurssillemme sopivavampi.
Tarjoamme kirjaston päälle lisäksi kurssin oman ohjelmallisen rajapinnan, joka yksinkertaistaa kirjoitettavia metodeja ja pyrkii käyttämään mahdollisuuksien mukaan vain ominaisuuksia jotka on jo esitelty Ohjelmointi 1 -kurssilla. Löydät kaikki olennaiset metodit luokan BasicBot sisältä.
BasicBot:in metodeilla voidaan mm:
Vastata mihin tahansa kanavalle kirjoitettuun viestiin (** replyToMessage, replyToString**)
Tehdä jotain kun kanavalle tulee mikä tahansa viesti (mutta ei kirjoiteta kanavalle itse) (**anyMessage, anyString **)
Kirjoitetaan kanavalle kun sinne tulee uusia käyttäjiä (** joinMessage **)
Vastataan ennalta sovittuihin bottikomentoihin (** command, commandWithArguments ** )
jne.
Huomasit varmaan, että monesta komennosta oli erikseen message-versio. Siinä missä yksinkertainen metodi vain vastaa merkkijonoon merkkijonolla, on monesti mukavaa tietää kuka viestin kirjoitti, millä keskustelukanavalla jne. Kaikkeen tähän pääsee käsiksi Message-luokan metodeilla.
Näin pääset alkuun
Bottikäyttäjän luominen
Bottikäyttäjät luodaan Telegramissa keskustelemalla käyttäjän BotFather kanssa.
Botfather on itsekin botti ja demonstroi samalla kuinka boteille annettavat komennot toimivat. Voit luoda ja nimetä botillesi käyttäjän jo ennen itse ohjelmoinnin aloittamista. Kirjoittamalla /newbot BotFather aloittaa kanssasi dialogin, jossa se kysyy uuden botin nimen ja käyttäjätunnuksen. Kun olet keksinyt uniikin käyttäjätunnuksen, Botfather antaa sinulle yksilöllisen token:in. Tällä tokenilla ohjelmakoodimme liitetään mukaan palveluun. Token ei katoa telegramista mihinkään, joten voit noutaa sen ohjelmaasi varten myöhemmin.
Tehtäväpohjamme juurikansioon pitää itse kirjoittaa tiedosto bot_token.txt johon token sijoitetaan, ja josta ohjelmamme sen automaattisesti noutaa. Tämä tiedosto ei mene Git:iin
Ohjelmointityökalut
Tässä tehtävässä käytämme IntelliJ:n kautta työkalua nimeltä sbt. Tämä työkalu on ns. build tool, joka automatisoi monia ohjelmakoodin käsittelyyn, kirjastoriippuvuuksiin, julkaisemiseen, paketointiin jne. liittyviä työvaiheita. Tässä projektissa sbt noutaa projektille kaikki sen tarvitsemat kirjastot ja käynnistää haluttaessa myös botin.
Telegram-botin ja sbt:n käyttö: Alkuvalmistelut: (Yksi ryhmäläinen tekee tämän)
1) Forkkaa itsellesi projekti https://version.aalto.fi/gitlab/oseppala/botti_2020 Tämä tapahtuu painamalla k.o. projektin webisivulla nappia Fork, joka tekee projektista sinulle henkilökohtaisen kopion version.aalto.fi-palveluun.
2) Lisää projektiin muut ryhmäläiset ja oma assari vähintään Developer-oikeuksilla
jatkovaiheet: (jokainen ryhmäläinen tekee nämä)
3) Kloonaa uusi projektisi omalle koneellesi git:in avulla.
Tämä tapahtuu yksinkertaisesti IntelliJ IDEA:ssa, vailtsemalla **File->New Project->From Version control **. Ylimpään kenttään annetaan Version.aalto.fi:stä saamamme osoite.
4) Juttele BotFather:ille ja luo botti Telegramissa (jos et vielä tehnyt sitä) Jokaisella ryhmäläisellä on hyvä olla oma bot_token jotta jokainen voi testailla samanaikaisesti.
*. Avaa Telegram esim. auki nettiselaimelle https://telegram.me/ ja valitsemalla Telegram Web-version
Etsi botfather-käyttäjä Telegramin search-ikkunasta
Anna botfatherille komento /newbot
Anna nimi botille
Anna käyttäjänimi botille
Kopioi talteen saamasi token ja kirjoita se tiedostoon bot_token.txt. (samaan projektin kansioon, jossa on README.md) Älä lisää tiedostoon ylimääräisiä rivinvaihtoja tai whitespacea.
Klikkaa lopuksi BotFatherin antamaa bottiin osoittavaa linkkiä joka avaa keskusteluikkunan valmiiksi
5) Kokeillaan bottia
Paina IntelliJ:ssä sivun alalaidasta tabia sbt shell
Kirjoita selliin run
Tämän komennon suorittaminen vie ensimmäisellä kerralla jonkin aikaa, koska sbt rakentaa projektilla oman scala-suoritusympäristön ja noutaa kaikki projektin riippuvuudet. Tämä kuitenkin tehdään vain kerran.
Saat jonkin ajan kuluttua listan vaihtoehtoisia Botteja kokeiltaviksi. Valitse ReverseBot
Kun näet rivin "[info] Running s1.telegrambots.examples.ReverseBot" tms. on botti käynnissä ja voimme mennä katsomaan sitä Telegramiin.
Kirjoita jotain kanavalle - Botin pitäisi vastata tähän kääntämällä sana väärinpäin.
Kun haluat lopettaa paina Ctrl-C
6) Oma botti!
Voit nyt ryhtyä muokkaamaan jotakin annetuista boteista (esim ReverseBot.scala) sellaiseksi kuin itse haluat. Löydät botit hakemistosta src/main/scala/s1/telegrambots
Jos muutat botin koodia, käynnistä koodi uudelleen suorittamalla sbt-ikkunassa run. Muista että voit pysäyttää botin painamalla CTRL-C. Kun botti on pysäyksissä, voit myös lopettaa sbt:n kirjoittamalla ikkunaan exit.