diff --git a/Gemfile b/Gemfile index fac4f97..15fb00c 100644 --- a/Gemfile +++ b/Gemfile @@ -1,66 +1,68 @@ source 'https://rubygems.org' git_source(:github) { |repo| "https://github.com/#{repo}.git" } ruby '2.5.5' # Bundle edge Rails instead: gem 'rails', github: 'rails/rails' gem 'rails', '~> 5.2.3' # Use sqlite3 as the database for Active Record gem 'pg' # Use Puma as the app server gem 'puma', '~> 3.11' # Use SCSS for stylesheets gem 'sass-rails', '~> 5.0' # Use Uglifier as compressor for JavaScript assets gem 'uglifier', '>= 1.3.0' # See https://github.com/rails/execjs#readme for more supported runtimes # gem 'mini_racer', platforms: :ruby -gem 'crono' gem "chartkick" gem 'groupdate' gem "sentry-raven" gem 'telegram-bot' +gem 'sidekiq' +gem 'sidekiq-scheduler' +gem 'rails-assets-sweetalert2', '~> 5.1.1', source: 'https://rails-assets.org' # Use CoffeeScript for .coffee assets and views gem 'coffee-rails', '~> 4.2' # Turbolinks makes navigating your web application faster. Read more: https://github.com/turbolinks/turbolinks gem 'turbolinks', '~> 5' # Build JSON APIs with ease. Read more: https://github.com/rails/jbuilder gem 'jbuilder', '~> 2.5' # Use Redis adapter to run Action Cable in production # gem 'redis', '~> 4.0' # Use ActiveModel has_secure_password # gem 'bcrypt', '~> 3.1.7' # Use ActiveStorage variant # gem 'mini_magick', '~> 4.8' # Use Capistrano for deployment # gem 'capistrano-rails', group: :development # Reduces boot times through caching; required in config/boot.rb gem 'bootsnap', '>= 1.1.0', require: false group :development, :test do # Call 'byebug' anywhere in the code to stop execution and get a debugger console gem 'byebug', platforms: [:mri, :mingw, :x64_mingw] end group :development do # Access an interactive console on exception pages or by calling 'console' anywhere in the code. gem 'web-console', '>= 3.3.0' gem 'listen', '>= 3.0.5', '< 3.2' # Spring speeds up development by keeping your application running in the background. Read more: https://github.com/rails/spring gem 'spring' gem 'spring-watcher-listen', '~> 2.0.0' end group :test do # Adds support for Capybara system testing and selenium driver gem 'capybara', '>= 2.15' gem 'selenium-webdriver' # Easy installation and use of chromedriver to run system tests with Chrome gem 'chromedriver-helper' end # Windows does not include zoneinfo files, so bundle the tzinfo-data gem gem 'tzinfo-data', platforms: [:mingw, :mswin, :x64_mingw, :jruby] diff --git a/Gemfile.lock b/Gemfile.lock index 8ff9785..9bc4c6e 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -1,238 +1,263 @@ GEM remote: https://rubygems.org/ + remote: https://rails-assets.org/ specs: actioncable (5.2.3) actionpack (= 5.2.3) nio4r (~> 2.0) websocket-driver (>= 0.6.1) actionmailer (5.2.3) actionpack (= 5.2.3) actionview (= 5.2.3) activejob (= 5.2.3) mail (~> 2.5, >= 2.5.4) rails-dom-testing (~> 2.0) actionpack (5.2.3) actionview (= 5.2.3) activesupport (= 5.2.3) rack (~> 2.0) rack-test (>= 0.6.3) rails-dom-testing (~> 2.0) rails-html-sanitizer (~> 1.0, >= 1.0.2) actionview (5.2.3) activesupport (= 5.2.3) builder (~> 3.1) erubi (~> 1.4) rails-dom-testing (~> 2.0) rails-html-sanitizer (~> 1.0, >= 1.0.3) activejob (5.2.3) activesupport (= 5.2.3) globalid (>= 0.3.6) activemodel (5.2.3) activesupport (= 5.2.3) activerecord (5.2.3) activemodel (= 5.2.3) activesupport (= 5.2.3) arel (>= 9.0) activestorage (5.2.3) actionpack (= 5.2.3) activerecord (= 5.2.3) marcel (~> 0.3.1) activesupport (5.2.3) concurrent-ruby (~> 1.0, >= 1.0.2) i18n (>= 0.7, < 2) minitest (~> 5.1) tzinfo (~> 1.1) addressable (2.6.0) public_suffix (>= 2.0.2, < 4.0) archive-zip (0.12.0) io-like (~> 0.3.0) arel (9.0.0) bindex (0.8.1) bootsnap (1.4.4) msgpack (~> 1.0) builder (3.2.3) byebug (11.0.1) capybara (3.28.0) addressable mini_mime (>= 0.1.3) nokogiri (~> 1.8) rack (>= 1.6.0) rack-test (>= 0.6.3) regexp_parser (~> 1.5) xpath (~> 3.2) chartkick (3.2.1) childprocess (1.0.1) rake (< 13.0) chromedriver-helper (2.1.1) archive-zip (~> 0.10) nokogiri (~> 1.8) coffee-rails (4.2.2) coffee-script (>= 2.2.0) railties (>= 4.0.0) coffee-script (2.4.1) coffee-script-source execjs coffee-script-source (1.12.2) concurrent-ruby (1.1.5) + connection_pool (2.2.2) crass (1.0.4) - crono (1.1.2) - activerecord (>= 4.0) - activesupport (>= 4.0) erubi (1.8.0) + et-orbi (1.2.2) + tzinfo execjs (2.7.0) faraday (0.15.4) multipart-post (>= 1.2, < 3) ffi (1.11.1) + fugit (1.3.2) + et-orbi (~> 1.1, >= 1.1.8) + raabro (~> 1.1) globalid (0.4.2) activesupport (>= 4.2.0) groupdate (4.1.2) activesupport (>= 4.2) httpclient (2.8.3) i18n (1.6.0) concurrent-ruby (~> 1.0) io-like (0.3.0) jbuilder (2.9.1) activesupport (>= 4.2.0) listen (3.1.5) rb-fsevent (~> 0.9, >= 0.9.4) rb-inotify (~> 0.9, >= 0.9.7) ruby_dep (~> 1.2) loofah (2.2.3) crass (~> 1.0.2) nokogiri (>= 1.5.9) mail (2.7.1) mini_mime (>= 0.1.1) marcel (0.3.3) mimemagic (~> 0.3.2) method_source (0.9.2) mimemagic (0.3.3) mini_mime (1.0.2) mini_portile2 (2.4.0) minitest (5.11.3) msgpack (1.3.1) multipart-post (2.1.1) nio4r (2.4.0) nokogiri (1.10.3) mini_portile2 (~> 2.4.0) pg (1.1.4) public_suffix (3.1.1) puma (3.12.1) + raabro (1.1.6) rack (2.0.7) + rack-protection (2.0.5) + rack rack-test (1.1.0) rack (>= 1.0, < 3) rails (5.2.3) actioncable (= 5.2.3) actionmailer (= 5.2.3) actionpack (= 5.2.3) actionview (= 5.2.3) activejob (= 5.2.3) activemodel (= 5.2.3) activerecord (= 5.2.3) activestorage (= 5.2.3) activesupport (= 5.2.3) bundler (>= 1.3.0) railties (= 5.2.3) sprockets-rails (>= 2.0.0) + rails-assets-es6-promise (4.2.4) + rails-assets-sweetalert2 (5.1.1) + rails-assets-es6-promise rails-dom-testing (2.0.3) activesupport (>= 4.2.0) nokogiri (>= 1.6) rails-html-sanitizer (1.2.0) loofah (~> 2.2, >= 2.2.2) railties (5.2.3) actionpack (= 5.2.3) activesupport (= 5.2.3) method_source rake (>= 0.8.7) thor (>= 0.19.0, < 2.0) rake (12.3.3) rb-fsevent (0.10.3) rb-inotify (0.10.0) ffi (~> 1.0) + redis (4.1.2) regexp_parser (1.6.0) ruby_dep (1.5.0) rubyzip (1.2.3) + rufus-scheduler (3.6.0) + fugit (~> 1.1, >= 1.1.6) sass (3.7.4) sass-listen (~> 4.0.0) sass-listen (4.0.0) rb-fsevent (~> 0.9, >= 0.9.4) rb-inotify (~> 0.9, >= 0.9.7) sass-rails (5.0.7) railties (>= 4.0.0, < 6) sass (~> 3.1) sprockets (>= 2.8, < 4.0) sprockets-rails (>= 2.0, < 4.0) tilt (>= 1.1, < 3) selenium-webdriver (3.142.3) childprocess (>= 0.5, < 2.0) rubyzip (~> 1.2, >= 1.2.2) sentry-raven (2.11.0) faraday (>= 0.7.6, < 1.0) + sidekiq (5.2.7) + connection_pool (~> 2.2, >= 2.2.2) + rack (>= 1.5.0) + rack-protection (>= 1.5.0) + redis (>= 3.3.5, < 5) + sidekiq-scheduler (3.0.0) + redis (>= 3, < 5) + rufus-scheduler (~> 3.2) + sidekiq (>= 3) + tilt (>= 1.4.0) spring (2.1.0) spring-watcher-listen (2.0.1) listen (>= 2.7, < 4.0) spring (>= 1.2, < 3.0) sprockets (3.7.2) concurrent-ruby (~> 1.0) rack (> 1, < 3) sprockets-rails (3.2.1) actionpack (>= 4.0) activesupport (>= 4.0) sprockets (>= 3.0.0) telegram-bot (0.14.2) actionpack (>= 4.0, < 6.0) activesupport (>= 4.0, < 6.0) httpclient (~> 2.7) thor (0.20.3) thread_safe (0.3.6) tilt (2.0.9) turbolinks (5.2.0) turbolinks-source (~> 5.2) turbolinks-source (5.2.0) tzinfo (1.2.5) thread_safe (~> 0.1) uglifier (4.1.20) execjs (>= 0.3.0, < 3) web-console (3.7.0) actionview (>= 5.0) activemodel (>= 5.0) bindex (>= 0.4.0) railties (>= 5.0) websocket-driver (0.7.1) websocket-extensions (>= 0.1.0) websocket-extensions (0.1.4) xpath (3.2.0) nokogiri (~> 1.8) PLATFORMS ruby DEPENDENCIES bootsnap (>= 1.1.0) byebug capybara (>= 2.15) chartkick chromedriver-helper coffee-rails (~> 4.2) - crono groupdate jbuilder (~> 2.5) listen (>= 3.0.5, < 3.2) pg puma (~> 3.11) rails (~> 5.2.3) + rails-assets-sweetalert2 (~> 5.1.1)! sass-rails (~> 5.0) selenium-webdriver sentry-raven + sidekiq + sidekiq-scheduler spring spring-watcher-listen (~> 2.0.0) telegram-bot turbolinks (~> 5) tzinfo-data uglifier (>= 1.3.0) web-console (>= 3.3.0) RUBY VERSION ruby 2.5.5p157 BUNDLED WITH 2.0.2 diff --git a/README.md b/README.md index f2b7e72..f6f6342 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,9 @@ # README Crea un bellissimo bot che conta gli ASD. ENV variabili richieste: DOMAIN (abbastanza ovvio, il dominio) e BOT_API_KEY, la vostra api key telegram per il bot, BOT_USERNAME -Inoltre, amici, vi ricordo che dovete avere un certificato SSL ed impostare il webhook telegram. \ No newline at end of file +Inoltre, amici, vi ricordo che dovete avere un certificato SSL ed impostare il webhook telegram. + +Schedulare in qualche modo il job, io uso Heroku Scheduler con `echo 'SendAsdCountJob.perform_now' | bundle exec rails c` \ No newline at end of file diff --git a/app/assets/javascripts/application.js b/app/assets/javascripts/application.js index 4f7aac4..2d5abb6 100644 --- a/app/assets/javascripts/application.js +++ b/app/assets/javascripts/application.js @@ -1,18 +1,83 @@ // This is a manifest file that'll be compiled into application.js, which will include all the files // listed below. // // Any JavaScript/Coffee file within this directory, lib/assets/javascripts, or any plugin's // vendor/assets/javascripts directory can be referenced here using a relative path. // // It's not advisable to add code directly here, but if you do, it'll appear at the bottom of the // compiled file. JavaScript code in this file should be added after the last require_* statement. // // Read Sprockets README (https://github.com/rails/sprockets#sprockets-directives) for details // about supported directives. // //= require rails-ujs //= require activestorage //= require turbolinks //= require chartkick //= require Chart.bundle //= require_tree . + +function getAllUrlParams(url) { + + // get query string from url (optional) or window + var queryString = url ? url.split('?')[1] : window.location.search.slice(1); + + // we'll store the parameters here + var obj = {}; + + // if query string exists + if (queryString) { + + // stuff after # is not part of query string, so get rid of it + queryString = queryString.split('#')[0]; + + // split our query string into its component parts + var arr = queryString.split('&'); + + for (var i = 0; i < arr.length; i++) { + // separate the keys and the values + var a = arr[i].split('='); + + // set parameter name and value (use 'true' if empty) + var paramName = a[0]; + var paramValue = typeof (a[1]) === 'undefined' ? true : a[1]; + + // (optional) keep case consistent + paramName = paramName.toLowerCase(); + if (typeof paramValue === 'string') paramValue = paramValue.toLowerCase(); + + // if the paramName ends with square brackets, e.g. colors[] or colors[2] + if (paramName.match(/\[(\d+)?\]$/)) { + + // create key if it doesn't exist + var key = paramName.replace(/\[(\d+)?\]/, ''); + if (!obj[key]) obj[key] = []; + + // if it's an indexed array e.g. colors[2] + if (paramName.match(/\[\d+\]$/)) { + // get the index value and add the entry at the appropriate position + var index = /\[(\d+)\]/.exec(paramName)[1]; + obj[key][index] = paramValue; + } else { + // otherwise add the value to the end of the array + obj[key].push(paramValue); + } + } else { + // we're dealing with a string + if (!obj[paramName]) { + // if it doesn't exist, create property + obj[paramName] = paramValue; + } else if (obj[paramName] && typeof obj[paramName] === 'string'){ + // if property does exist and it's a string, convert it to an array + obj[paramName] = [obj[paramName]]; + obj[paramName].push(paramValue); + } else { + // otherwise add the property + obj[paramName].push(paramValue); + } + } + } + } + + return obj; +} \ No newline at end of file diff --git a/app/assets/stylesheets/standardpage.scss b/app/assets/stylesheets/standardpage.scss index f1c3473..3b41528 100644 --- a/app/assets/stylesheets/standardpage.scss +++ b/app/assets/stylesheets/standardpage.scss @@ -1,3 +1,15 @@ // Place all the styles related to the standardpage controller here. // They will automatically be included in application.css. // You can use Sass (SCSS) here: http://sass-lang.com/ +.button { + padding: .9em 2.1875em; + border: 0; + border-radius: .1875em; + background-color: #3085d6; + box-shadow: none; + color: #fff; + font-size: 1.125em; + font-weight: 500; + white-space: nowrap; + cursor: pointer; +} \ No newline at end of file diff --git a/app/controllers/message_controller.rb b/app/controllers/message_controller.rb index 0701d78..bf1508c 100644 --- a/app/controllers/message_controller.rb +++ b/app/controllers/message_controller.rb @@ -1,158 +1,296 @@ class MessageController < ActionController::API def message_process - message = params[:message] - return if message.nil? || message[:chat].nil? - unless message[:text].nil? - text = message[:text] - else - text = message[:caption] - end - if text.split('@').count == 2 - if text.split('@')[1] == ENV['BOT_USERNAME'] - text = text.split('@')[0] - end - end - type = message[:chat][:type] - id = message[:chat][:id] - username = message[:chat][:username] - update_id = params[:update_id] - fromid = message[:from][:id] - fromusername = message[:from][:username] - - unless Group.find_by(chat_id: id) - @group = Group.create(chat_id: id, username: username) - else - @group = Group.find_by(chat_id: id) - end + begin + message = params[:message] + return if message.nil? || message[:chat].nil? || message[:text].nil? + unless message[:text].nil? + text = message[:text] + else + text = message[:caption] + end + if text.split('@').count == 2 + if text.split('@')[1] == ENV['BOT_USERNAME'] + text = text.split('@')[0] + end + end + type = message[:chat][:type] + id = message[:chat][:id] + username = message[:chat][:username] + update_id = params[:update_id] + fromid = message[:from][:id] + fromusername = message[:from][:username] + + unless Group.find_by(chat_id: id) && (type == 'group' || type == 'supergroup') + @group = Group.create(chat_id: id, username: username, title: message[:chat][:title]) if id < 0 + else + @group = Group.find_by(chat_id: id) + title = message[:chat][:title] + if @group.title.nil? || @group.title != title + @group.update_attribute(:title, title) + end + + if @group.username != message[:chat][:username] + @group.update_attribute(:username, message[:chat][:username]) + end + end + + unless @group.nil? + unless @group.welcomesent + Telegram.bot.send_message(chat_id: @group.chat_id, text: "Bella zio! Sono il bot asdoso creato da Ferdinando Traversa (ferdinando.me) da idea di Valerio Bozzolan, asd! Digita /grafico per ricevere il link ad un grafico, anche in privato per averne uno personale, asd o /classifica per scoprire cose interessanti. L'impostazione automaticaè che io invii il conto degli ASD alla fine della serata, così però ti perdi cose belle e non è più così funny. Per modificare questa impostazione, basta digitare /nightsend ed invierò il messaggio di conteggio appena invii un asd. Se vuoi che il bot non parli, ma veda e senta, usa /silent. Ti prego! Non togliere il bot, lascialo per fini statistici. Il gruppo ufficiale è @asdfest, entra lì per suggerire nuove funzionalità o per asdare insieme.") + @group.update_attribute(:welcomesent, true) + end + + @admins = Telegram.bot.get_chat_administrators(chat_id: @group.chat_id) + @admins['result'].each do |result| + unless result.nil? + unless result['user'].nil? + unless result['user']['username'].nil? + if result['user']['username'].downcase == ENV['BOT_USERNAME'].downcase + @adminok = true + end + end + end + + end + end + if @adminok + @group.update_attribute(:admin, true) + else + @group.update_attribute(:admin, false) + end + end - unless @group.nil? - unless @group.welcomesent - Telegram.bot.send_message(chat_id: @group.chat_id, text: "Bella zio! Sono il bot asdoso creato da Ferdinando Traversa (ferdinando.me) da idea di Valerio Bozzolan, asd! Digita /grafico per ricevere il link ad un grafico, anche in privato per averne uno personale, asd o /classifca per scoprire cose interessanti. L'impostazione automaticaè che io invii il conto degli ASD alla fine della serata, così però ti perdi cose belle come la faccina dell'ASD di mezzanotte. Per modificare questa impostazione, basta digitare /nightsend ed invierò il messaggio di conteggio appena invii un asd.") - @group.update_attribute(:welcomesent, true) - end - end + unless Sender.find_by(chat_id: fromid) + first_name = message[:from][:first_name] + last_name = message[:from][:last_name] + totalname = "#{first_name} #{last_name}" + @sender = Sender.create(chat_id: fromid, username: fromusername, name: totalname) + else + @sender = Sender.find_by(chat_id: fromid) + first_name = message[:from][:first_name] + last_name = message[:from][:last_name] + totalname = "#{first_name} #{last_name}" + if @sender.name.nil? || @sender.name != totalname + @sender.update_attribute(:name, totalname) + end + + if @sender.username != message[:from][:username] + @sender.update_attribute(:username, message[:from][:username]) + end + + end + + if type == 'group' || type == 'supergroup' + if text =~ /asd/i + multiplevalue = text.scan(/asd/i).count + defmultiplevalue = multiplevalue - 1 + precedenteconto = @group.asds.totalcount + @asd = Asd.create(group: @group, sender: @sender, text: text, update_id: update_id, multiple_times: defmultiplevalue) + + unless Asd.find_by(sender: @sender) + unless @group.classifica + Telegram.bot.send_message(chat_id: @group.chat_id, text: "Ciao amico, questo gruppo ha la classifica privata. È la prima volta che ti vedo e quindi imposto la classifica privata anche per te, non sarai visto in classifica! Se vai invece fiero della tua asdosità, manda il comando /fuoriclassifica in privato e riattiverò la tua presenza in classifica. Puoi anche dare /classifica per vedere questa classifica di cui tutti parlano o /grafico per il tuo grafico personal personal.") + @sender.update_attribute(classifica: false) + end + end + asdcount = @group.asds.count + case @group.asds.totalcount + when 100 + addtext = 'IL CENTESIMO ASD, ASD! COMPLIMENTS CONGRATULATIONS AUF WIDERSHEN' + SpecialEvent.create(text: addtext, group: @group, asd: @asd) + when 1000 + addtext = '1000 asd, wow! Questo gruppo, così asdoso, asd' + SpecialEvent.create(text: addtext, group: @group, asd: @asd) + when 10000 + addtext = '10000è un record mondiale, asd' + SpecialEvent.create(text: addtext, group: @group, asd: @asd) + when 100000 + addtext = '100000, sei il campione degli asd.' + SpecialEvent.create(text: addtext, group: @group, asd: @asd) + end + if SpecialEvent.find_by(asd: @asd) && !@group.silent + Telegram.bot.send_photo(chat_id: @group.chat_id, photo: 'http://www.lanciano.it/faccine/asdone.gif', caption: "Così asdoso, asd. #{SpecialEvent.find_by(asd: @asd).text}") + SpecialEvent.find_by(asd: @asd).destroy + end - unless Sender.find_by(chat_id: fromid) - @sender = Sender.create(chat_id: fromid, username: fromusername) - else - @sender = Sender.find_by(chat_id: fromid) - end + unless @group.nightsend || @group.silent + position = Group.all.sort_by{|group| group.asds.totalcount}.pluck(:id).reverse.find_index(@group.id) + 1 + altdef = " (+#{defmultiplevalue})" if defmultiplevalue > 0 + altdef = "" if defmultiplevalue == 0 + Telegram.bot.send_message(chat_id: @group.chat_id, text: "Il contasd conta ben #{precedenteconto + 1}#{altdef}, asd. Sei il #{position}º gruppo per ASD inviati.") + end + unless @asd.created_at.nil? + if @asd.created_at.strftime('%H:%M') == '00:00' + Telegram.bot.send_message(chat_id: @group.chat_id, text: "Asd di mezzanotte 🌚") + end + end + end + + if @group.eliminazione && text.match?(/asd/i) == false + Telegram.bot.delete_message(chat_id: @group.chat_id, message_id: message[:message_id]) + end - first_name = message[:from][:first_name] - last_name = message[:from][:last_name] - totalname = "#{first_name} #{last_name}" - - if @sender.name.nil? || @sender.name != totalname - @sender.update_attribute(:name, totalname) - end + end + + if text == '/start' && (type == 'group' || type == 'supergroup') + unless Group.find_by(chat_id: id) + @group = Group.create(chat_id: id, username: username) if id < 0 + else + @group = Group.find_by(chat_id: id) + end + Telegram.bot.send_message(chat_id: @group.chat_id, text: "Bella zio! Sono il bot asdoso creato da Ferdinando Traversa (ferdinando.me) da idea di Valerio Bozzolan, asd! Digita /grafico per ricevere il link ad un grafico, anche in privato per averne uno personale, asd o /classifica per scoprire cose interessanti. L'impostazione automaticaè che io invii il conto degli ASD alla fine della serata, così però ti perdi cose belle e non è più così funny. Per modificare questa impostazione, basta digitare /nightsend ed invierò il messaggio di conteggio appena invii un asd. Se vuoi che il bot non parli, ma veda e senta, usa /silent. Ti prego! Non togliere il bot, lascialo per fini statistici. Il gruppo ufficiale è @asdfest, entra lì per suggerire nuove funzionalità o per asdare insieme.") + @group.update_attribute(:welcomesent, true) + end - if @sender.username != message[:from][:username] - @sender.update_attribute(:username, message[:from][:username]) - end + if text == '/classifica' + Telegram.bot.send_message(chat_id: id, text: "Vai su #{ENV['DOMAIN']}/classifica per vedere la classifica.") + end + + if text == '/start' && type == 'private' + Telegram.bot.send_message(chat_id: id, text: "Bella zio! Sono il bot asdoso creato da Ferdinando Traversa (ferdinando.me @ferdi2005) da idea di Valerio Bozzolan, asd! Aggiungimi ad un bel gruppo e conterò gli asd, altrimenti digita /grafico per il tuo grafico personal personal. Il gruppo ufficiale è @asdfest, entra lì per suggerire nuove funzionalità o per asdare insieme.") + end - title = message[:chat][:title] - if @group.title.nil? || @group.title != title - @group.update_attribute(:title, title) - end + if text == '/grafico' && type == 'private' + unless Sender.find_by(chat_id: fromid) + Telegram.bot.send_message(chat_id: id, text: 'Non ho ancora un grafico per te, sei nuovo per me, non ti conosco. Iscriviti in qualche gruppo con questo bot e manda asd a ripetizione, poi torna da me.') + else + @sender = Sender.find_by(chat_id: fromid) + position = Sender.all.sort_by{|sender| sender.asds.totalcount}.pluck(:id).reverse.find_index(@sender.id) + 1 if Sender.count > 0 + Telegram.bot.send_message(chat_id: id, text: "Guarda il tuo grafico personalizzato per il gruppo su #{ENV['DOMAIN']}/grafico?s=#{@sender.chat_id} Inoltre sappi che sei il #{position}º inviatore di asd nel mondo!") + end + end + + if text == '/grafico' && (type == 'group' || type == 'supergroup') + unless Group.find_by(chat_id: id) + Telegram.bot.send_message(chat_id: id, text: 'Non ho ancora un grafico per te, sei nuovo per me, non ti conosco. Invia qualche asd e prova questo comando.') + else + @group = Group.find_by(chat_id: id) + Telegram.bot.send_message(chat_id: id, text: "Guarda il tuo grafico personalizzato per il gruppo su #{ENV['DOMAIN']}/grafico?g=#{@group.chat_id}") + end + end - if @group.username != message[:chat][:username] - @group.update_attribute(:username, message[:chat][:username]) - end + if text == '/nightsend' && (type == 'group' || type == 'supergroup') + unless Group.find_by(chat_id: id) + Telegram.bot.send_message(chat_id: id, text: "Non conosco questo gruppo.") + else + @group = Group.find_by(chat_id: id) + if @group.nightsend + Telegram.bot.send_message(chat_id: id, text: "Ok, l'impostazione predefinita è che l'invio del conto degli asd avvenga a mezzanotte, ma con questo comando la modifico. Procedo, ora avrai un messaggio ogni asd, asd.") + @group.update_attribute(:nightsend, false) + else + Telegram.bot.send_message(chat_id: id, text: "Sei una persona triste, asd. Vuoi che il conteggio venga inviato a mezzanotte. Bozzolan dice sì, Ferdi dice no. Tu dici sì, allora conteggio a mezzanotte sia, asd") + @group.update_attribute(:nightsend, true) + end + end + end - if type == 'group' || type == 'supergroup' - if text =~ /asd/i - multiplevalue = text.scan(/asd/i).count - defmultiplevalue = multiplevalue - 1 - @asd = Asd.create(group: @group, sender: @sender, text: text, update_id: update_id, multiple_times: defmultiplevalue) - defmultiplevalue.times do - Asd.create(group: @group, sender: @sender, text: text) + if text == '/silent' && (type == 'group' || type == 'supergroup') + unless Group.find_by(chat_id: id) + Telegram.bot.send_message(chat_id: id, text: "Non conosco questo gruppo.") + else + @group = Group.find_by(chat_id: id) + if @group.silent + Telegram.bot.send_message(chat_id: id, text: "Oh grazie, sei tornato nella luce, pensavo di dover rimanere muto per sempre! Ora, il tuo gruppo ha l'invio del conto notturno degli asd impostato a #{@group.nightsend ? 'attivo' : 'disattivo'}. Se vuoi che invii il conto degli asd la notte attivalo, altrimenti se vuoi un messaggio ogni asd disattivalo. Lo fai col comando /nightsend") + @group.update_attribute(:silent, false) + else + Telegram.bot.send_message(chat_id: id, text: "Se vuoi che me ne rimanga zitto zitto nelle tenebre allora usa questo comando, per far che ritorni a parlare digitalo di nuovo.") + @group.update_attribute(:silent, true) + end end + end - asdcount = @group.asds.count - case asdcount - when 1 - addtext = 'Il primo asd. Benvenuto nella grande famiglia di asdbot' - SpecialEvent.create(text: addtext, group: @group, asd: @asd) - when 10 - addtext = 'Il decimo asd! Complimenti, asd.' - SpecialEvent.create(text: addtext, group: @group, asd: @asd) - when 100 - addtext = 'IL CENTESIMO ASD, ASD! COMPLIMENTS CONGRATULATIONS AUF WIDERSHEN' - SpecialEvent.create(text: addtext, group: @group, asd: @asd) - when 1000 - addtext = '1000 asd, wow! Questo gruppo, così asdoso, asd' - SpecialEvent.create(text: addtext, group: @group, asd: @asd) - when 10000 - addtext = '10000è un record mondiale, asd' - SpecialEvent.create(text: addtext, group: @group, asd: @asd) + if text == '/fuoriclassifica' && (type == 'group' || type == 'supergroup') + unless Group.find_by(chat_id: id) + Telegram.bot.send_message(chat_id: id, text: "Non conosco questo gruppo.") + else + @group = Group.find_by(chat_id: id) + if @group.classifica + Telegram.bot.send_message(chat_id: id, text: "Siete delle persone tristi e/o poco competitive? Amate la privasi anche se Google sa tutto di voi, anche come vi siete vestiti ieri, asd? Allora questo è il comando per voi. Da oggi siete fuori dalla classifica, per scelta. Datelo di nuovo per riattivare (sicuramente avete sbagliato, vero?)") + @group.update_attribute(:classifica, false) + else + Telegram.bot.send_message(chat_id: id, text: "Bravo! Hai fatto la scelta giusta, fai ritornare il tuo gruppo nella classifica pubblica con questo semplice comandino") + @group.update_attribute(:classifica, true) end - - unless @group.nightsend - if SpecialEvent.find_by(asd: @asd) - Telegram.bot.send_photo(chat_id: @group.chat_id, photo: 'http://www.lanciano.it/faccine/asdone.gif', caption: "Così asdoso, asd. #{SpecialEvent.find_by(asd: @asd).text}") - SpecialEvent.find_by(asd: @asd).destroy + end + end + if text == '/statistiche' && (type == 'group' || type == 'supergroup') + unless Group.find_by(chat_id: id) + Telegram.bot.send_message(chat_id: id, text: "Non conosco questo gruppo.") + else + @group = Group.find_by(chat_id: id) + Telegram.bot.send_message(chat_id: id, text: "Asd inviati: #{@group.asds.count}") + end + end + + if text == '/eliminazione' && (type == 'group' || type == 'supergroup') + unless Group.find_by(chat_id: id) + Telegram.bot.send_message(chat_id: id, text: "Non conosco questo gruppo.") + else + @group = Group.find_by(chat_id: id) + if @group.admin && @group.eliminazione + Telegram.bot.send_message(chat_id: id, text: "Ora basta eliminare tutti i messaggi insieme bot.") + @group.update_attribute(:eliminazione, false) + elsif !@group.eliminazione + Telegram.bot.send_message(chat_id: id, text: "Da ora eliminerò tutti i messaggi che non sono asd, perché questo è il gruppo @asdfest o una sua imitazione scrausa!") + @group.update_attribute(:eliminazione, true) + elsif !@group.admin + Telegram.bot.send_message(chat_id: id, text: "Non mi hai messo admin!") + end + end + end + + if text == '/fuoriclassifica' && type == 'private' + unless Sender.find_by(chat_id: id) + Telegram.bot.send_message(chat_id: id, text: "Non ti conosco, asd.") + else + @group = Sender.find_by(chat_id: id) + if @group.classifica + Telegram.bot.send_message(chat_id: id, text: "Sei una persona triste o poco competitiva? Questo è il comando giusto per te. Da oggi non apparirai più nella classifica pubblica.") + @group.update_attribute(:classifica, false) + else + Telegram.bot.send_message(chat_id: id, text: "Bravo! Hai fatto la scelta giusta, ritorna nella classifica pubblica con questo semplice comandino") + @group.update_attribute(:classifica, true) end - position = Group.all.sort_by{|group| group.asds.count}.pluck(:id).reverse.find_index(@group.id) + 1 - Telegram.bot.send_message(chat_id: @group.chat_id, text: "Il contasd conta ben #{asdcount} (+ #{defmultiplevalue}), asd. Sei il #{position}º gruppo per ASD inviati.") - if @asd.created_at.strftime('%H:%M') == '00:00' - Telegram.bot.send_message(chat_id: @group.chat_id, text: "Asd di mezzanotte %F0%9F%8C%9A") + end + end + + comandi = ["/fuoriclassifica", "/classifica", "/start", "/grafico", "/nightsend", "/annuncio", "/todo"] + admins = [82247861, 55632382] + if !text.in?(comandi) && type == 'private' + Telegram.bot.send_message(chat_id: id, text: "Cos…? asd") + end + + if text.match?(/\/annunciogruppo/) && admins.include?(fromid) + annuncio = text.split('/annunciogruppo')[1].strip + Group.all.each do |group| + begin + Telegram.bot.send_message(chat_id: group.chat_id, text: annuncio) + rescue => e + Telegram.bot.send_message(chat_id: 82247861, text: e.to_s) end end end - end - - if text == '/start' && (type == 'group' || type == 'supergroup') - unless Group.find_by(chat_id: id) - @group = Group.create(chat_id: id, username: username) - else - @group = Group.find_by(chat_id: id) - end - Telegram.bot.send_message(chat_id: @group.chat_id, text: "Bella zio! Sono il bot asdoso creato da Ferdinando Traversa (ferdinando.me) da idea di Valerio Bozzolan, asd! Digita /grafico per ricevere il link ad un grafico, anche in privato per averne uno personale, asd o /classifca per scoprire cose interessanti. L'impostazione automaticaè che io invii il conto degli ASD alla fine della serata, così però ti perdi cose belle come la faccina dell'ASD di mezzanotte. Per modificare questa impostazione, basta digitare /nightsend ed invierò il messaggio di conteggio appena invii un asd.") - @group.update_attribute(:welcomesent, true) - end - if text == '/classifica' - Telegram.bot.send_message(chat_id: id, text: "Vai su #{ENV['DOMAIN']}/classifica per vedere la classifica. Ci sono #{Group.count} che usano questo bot, comunque.") - end - - if text == '/start' && type == 'private' - Telegram.bot.send_message(chat_id: id, text: "Bella zio! Sono il bot asdoso creato da Ferdinando Traversa (ferdinando.me @ferdi2005) da idea di Valerio Bozzolan, asd! Aggiungimi ad un bel gruppo e conterò gli asd, altrimenti digita /grafico per il tuo grafico personal personal.") - end + if text.match?(/\/annuncioprivato/) && admins.include?(fromid) + annuncio = text.split('/annuncioprivato')[1].strip + Sender.all.each do |group| + begin + Telegram.bot.send_message(chat_id: group.chat_id, text: annuncio) + rescue => e + Telegram.bot.send_message(chat_id: 82247861, text: e.to_s) + end + end + end - if text == '/grafico' && type == 'private' - unless Sender.find_by(chat_id: fromid) - Telegram.bot.send_message(chat_id: id, text: 'Non ho ancora un grafico per te, sei nuovo per me, non ti conosco. Iscriviti in qualche gruppo con questo bot e manda asd a ripetizione, poi torna da me.') - else - @sender = Sender.find_by(chat_id: fromid) - position = Sender.all.sort_by{|sender| sender.asds.count}.pluck(:id).reverse.find_index(@sender.id) + 1 if Sender.count > 0 - Telegram.bot.send_message(chat_id: id, text: "Guarda il tuo grafico personalizzato per il gruppo su #{ENV['DOMAIN']}/grafico?s=#{@sender.chat_id} Inoltre sappi che sei il #{position}º inviatore di asd nel mondo!") - end - end - - if text == '/grafico' && (type == 'group' || type == 'supergroup') - unless Group.find_by(chat_id: id) - Telegram.bot.send_message(chat_id: id, text: 'Non ho ancora un grafico per te, sei nuovo per me, non ti conosco. Invia qualche asd e prova questo comando.') - else - @group = Group.find_by(chat_id: id) - Telegram.bot.send_message(chat_id: id, text: "Guarda il tuo grafico personalizzato per il gruppo su #{ENV['DOMAIN']}/grafico?g=#{@group.chat_id}") - end - end + if text == '/todo' + Telegram.bot.send_message(chat_id: id, text: 'Invia una mail a todo@ferdinando.me') + end - if text == '/nightsend' && (type == 'group' || type == 'supergroup') - unless Group.find_by(chat_id: id) - Telegram.bot.send_message(chat_id: id, text: "Ok, l'impostazione predefinitaè che l'invio del conto degli asd avvenga a mezzanotte, ma con questo comando la modifico. Procedo, asd.") - @group.update_attribute(:nightsend, false) - else - @group = Group.find_by(chat_id: id) - if @group.nightsend - Telegram.bot.send_message(chat_id: id, text: "Ok, l'impostazione predefinitaè che l'invio del conto degli asd avvenga a mezzanotte, ma con questo comando la modifico. Procedo, ora avrai un messaggio ogni asd, asd.") - @group.update_attribute(:nightsend, false) - else - Telegram.bot.send_message(chat_id: id, text: "Sei una persona triste, asd. Vuoi che il conteggio venga inviato a mezzanotte. Bozzolan dice sì, Ferdi dice no. Tu dici sì, allora conteggio a mezzanotte sia, asd") - @group.update_attribute(:nightsend, true) + if text == '/gruppoufficiale' + Telegram.bot.send_message(chat_id: id, text: 'Entra nel gruppo ufficiale del nostro bot, dove solo asd sono ammessi: @asdfest') end + rescue => e + Telegram.bot.send_message(chat_id: 82247861, text: e.to_s) end - end - render nothing: true end -end +end \ No newline at end of file diff --git a/app/controllers/standardpage_controller.rb b/app/controllers/standardpage_controller.rb index 300ad91..aa08644 100644 --- a/app/controllers/standardpage_controller.rb +++ b/app/controllers/standardpage_controller.rb @@ -1,17 +1,39 @@ class StandardpageController < ApplicationController def classifica - @groups = Group.all.sort_by{|sender| sender.asds.count}.reverse - @senders = Sender.all.sort_by{|sender| sender.asds.count}.reverse + @groups = Group.all.sort_by{|sender| sender.asds.totalcount}.reverse + @senders = Sender.all.sort_by{|sender| sender.asds.totalcount}.reverse end + def usernametoid + if params[:username].split('@').count == 2 + params[:username] = params[:username].split('@')[1] + end + if Group.where('lower(username) LIKE lower(?)', "#{params[:username]}").any? + @group = Group.where('lower(username) LIKE lower(?)', "#{params[:username]}").first + respond_to do |format| + format.json { render json: {status: '200', chat_id: @group.chat_id} } + end + elsif Sender.where('lower(username) LIKE lower(?)', "#{params[:username]}").any? + @sender = Sender.where('lower(username) LIKE lower(?)', "#{params[:username]}").first + respond_to do |format| + format.json { render json: {status: '201', chat_id: @sender.chat_id} } + end + else + respond_to do |format| + error = { status: '404' } + format.json { render json: error, status: :not_found} + end + end + end + def grafico if !params[:s].nil? @sender = Sender.find_by(chat_id: params[:s]) elsif !params[:g].nil? @group = Group.find_by(chat_id: params[:g]) end end def home end end diff --git a/app/jobs/send_asd_count_job.rb b/app/jobs/send_asd_count_job.rb index c3538b2..248bdc9 100644 --- a/app/jobs/send_asd_count_job.rb +++ b/app/jobs/send_asd_count_job.rb @@ -1,18 +1,20 @@ class SendAsdCountJob < ApplicationJob queue_as :default def perform(*args) Group.where(nightsend: true).each do |group| + begin @group = group date = Date.yesterday @asds = Asd.where(created_at: date.midnight..date.end_of_day, group: group) - if SpecialEvent.find_by(group: @group) - Telegram.bot.send_photo(chat_id: @group.chat_id, photo: "http://www.lanciano.it/faccine/asdone.gif", caption: "Così asdoso, asd. #{SpecialEvent.find_by(group: @group).text}") - SpecialEvent.find_by(group: @group).destroy - end - position = Group.all.sort_by{|gp| gp.asds.count}.pluck(:id).reverse.find_index(@group.id) + 1 + position = Group.all.sort_by{|gp| gp.asds.totalcount}.pluck(:id).reverse.find_index(@group.id) + 1 defmultipletimes = @asds.pluck(:multiple_times).sum - Telegram.bot.send_message(chat_id: @group.chat_id, text: "È mezzanotte, ora di sapere! Il contasd di ieri conta ben #{@asds.count}, asd. Sei il #{position}º gruppo per ASD inviati. (compresi quelli multipli, che sono #{defmultipletimes})") + if @asds.count > 0 && !@group.silent + Telegram.bot.send_message(chat_id: @group.chat_id, text: "È mezzanotte, ora di sapere! Il contasd di ieri conta ben #{@asds.count} (+#{defmultipletimes} multipli) per un totale di #{@asds.totalcount} asds, asd. Sei il #{position}º gruppo per ASD inviati. (Digita /silent per disattivarmi, non togliermi!)") + end + rescue => e + puts e + end end end end diff --git a/app/models/asd.rb b/app/models/asd.rb index f68ac0a..8463c5a 100644 --- a/app/models/asd.rb +++ b/app/models/asd.rb @@ -1,10 +1,13 @@ class Asd < ApplicationRecord belongs_to :group belongs_to :sender - validates :update_id, uniqueness: true + validates :update_id, uniqueness: true, presence: false has_many :special_events before_create :default_values def default_values self.multiple_times = multiple_times.presence || 0 end + def self.totalcount + self.count + pluck(:multiple_times).sum + end end diff --git a/app/models/group.rb b/app/models/group.rb index 0dbb19f..8b8fa4e 100644 --- a/app/models/group.rb +++ b/app/models/group.rb @@ -1,4 +1,6 @@ class Group < ApplicationRecord has_many :asds has_many :special_events + validates :chat_id, uniqueness: true + validates :chat_id, :numericality => {:less_than_or_equal_to => 0 } end diff --git a/app/models/sender.rb b/app/models/sender.rb index 138310d..aa00841 100644 --- a/app/models/sender.rb +++ b/app/models/sender.rb @@ -1,3 +1,5 @@ class Sender < ApplicationRecord has_many :asds + validates :chat_id, uniqueness: true + validates :chat_id, :numericality => { :greater_than_or_equal_to => 0 } end diff --git a/app/views/layouts/application.html.erb b/app/views/layouts/application.html.erb index e820bae..bb5193e 100644 --- a/app/views/layouts/application.html.erb +++ b/app/views/layouts/application.html.erb @@ -1,20 +1,22 @@ Asdbot <%= csrf_meta_tags %> <%= csp_meta_tag %> <%= stylesheet_link_tag 'application', media: 'all', 'data-turbolinks-track': 'reload' %> <%= javascript_include_tag 'application', 'data-turbolinks-track': 'reload' %> + + <%= yield %>
Sviluppato con cuore da Ferdinando Traversa - Blog - Github - Basato su Rails 5
Aggiungilo ai tuoi gruppi --> AsdCounterBot
diff --git a/app/views/standardpage/classifica.html.erb b/app/views/standardpage/classifica.html.erb index b5ef3f5..4de0b59 100644 --- a/app/views/standardpage/classifica.html.erb +++ b/app/views/standardpage/classifica.html.erb @@ -1,19 +1,36 @@

LA CLASSIFICA SOMMA, ASD

GRUPPI

    <% @groups.each do |group| %> - <% if group.asds.count > 0 %> -
  1. <%= group.title %> --> <%= group.asds.count %> asd
  2. + <% if group.asds.totalcount > 0 && group.classifica %> +
  3. <%= group.title %> --> <%= group.asds.totalcount %> asd
  4. <% end %> + <% unless group.classifica %> +
  5. Nascosto --> <%= group.asds.totalcount %> asd
  6. + <% end %> <% end %>

UTENTI

    <% @senders.each do |group| %> - <% if group.asds.count > 0 %> -
  1. <%= group.name %> --> <%= group.asds.count %> asd
  2. + <% if group.asds.totalcount > 0 && group.classifica %> +
  3. <%= group.name %> --> <%= group.asds.totalcount %> asd
  4. + <% end %> + + <% unless group.classifica %> +
  5. Nascosto --> <%= group.asds.totalcount %> asd
  6. <% end %> <% end %>
+
+

Statistiche magiche

+

ASD totali inviati e contati da questo bot: <%= Asd.all.totalcount %>

+

Gruppi iscritti a questo bot: <%= Group.count %>

+

Utenti iscritti a questo bot (partecipanti ai gruppi): <%= Sender.count %>

+

Media di ASD a gruppo: <%= Asd.totalcount.to_f/ Group.count.to_f %>

+

Media di ASD ad utente: <%= Asd.totalcount.to_f/ Sender.count.to_f %>

+

Media di utenti a gruppo: <%= Sender.count.to_f / Group.count.to_f %>

+

Media di asd multipli a messaggio asdsoso: <%= Asd.all.totalcount.to_f / Asd.all.count.to_f %>

+

Grazie per aver deciso di usare @asdcounterbot!


diff --git a/app/views/standardpage/grafico.html.erb b/app/views/standardpage/grafico.html.erb index dd6f09e..fabb5b1 100644 --- a/app/views/standardpage/grafico.html.erb +++ b/app/views/standardpage/grafico.html.erb @@ -1,7 +1,19 @@ <% unless @sender.nil? %> <%= line_chart Asd.where(sender: @sender).group_by_day(:created_at).count %> <% end %> <% unless @group.nil? %> <%= line_chart Asd.where(group: @group).group_by_day(:created_at).count %> -<% end %> \ No newline at end of file +<% end %> + + diff --git a/app/views/standardpage/home.html.erb b/app/views/standardpage/home.html.erb index 9bdd698..cae4c67 100644 --- a/app/views/standardpage/home.html.erb +++ b/app/views/standardpage/home.html.erb @@ -1 +1,49 @@

AsdBot

+ diff --git a/config/application.rb b/config/application.rb index 7ac9437..b0246d3 100644 --- a/config/application.rb +++ b/config/application.rb @@ -1,24 +1,24 @@ require_relative 'boot' require 'rails/all' # Require the gems listed in Gemfile, including any gems # you've limited to :test, :development, or :production. Bundler.require(*Rails.groups) module Asdbot class Application < Rails::Application # Initialize configuration defaults for originally generated Rails version. config.load_defaults 5.2 # Settings in config/environments/* take precedence over those specified here. # Application configuration can go into files in config/initializers # -- all .rb files in that directory are automatically loaded after loading # the framework and any gems in your application. config.time_zone = "Rome" - + config.active_job.queue_adapter = :sidekiq Raven.configure do |config| config.dsn = 'https://0990a682fc9a4c2691cc14c1f81c6da3:99ef32af76c9457bb64bbad21305368a@sentry.io/1527516' end end end diff --git a/config/cronotab.rb b/config/cronotab.rb deleted file mode 100644 index ecdcad5..0000000 --- a/config/cronotab.rb +++ /dev/null @@ -1,16 +0,0 @@ -# cronotab.rb — Crono configuration file -# -# Here you can specify periodic jobs and schedule. -# You can use ActiveJob's jobs from `app/jobs/` -# You can use any class. The only requirement is that -# class should have a method `perform` without arguments. -# -# class TestJob -# def perform -# puts 'Test!' -# end -# end -# -# Crono.perform(TestJob).every 2.days, at: '15:30' -# -Crono.perform(SendAsdCountJob).every 1.day, at: {hour: 00, min: 00} diff --git a/config/environments/production.rb b/config/environments/production.rb index e0f832a..36214e1 100644 --- a/config/environments/production.rb +++ b/config/environments/production.rb @@ -1,94 +1,94 @@ Rails.application.configure do # Settings specified here will take precedence over those in config/application.rb. # Code is not reloaded between requests. config.cache_classes = true # Eager load code on boot. This eager loads most of Rails and # your application in memory, allowing both threaded web servers # and those relying on copy on write to perform better. # Rake tasks automatically ignore this option for performance. config.eager_load = true # Full error reports are disabled and caching is turned on. config.consider_all_requests_local = false config.action_controller.perform_caching = true # Ensures that a master key has been made available in either ENV["RAILS_MASTER_KEY"] # or in config/master.key. This key is used to decrypt credentials (and other encrypted files). # config.require_master_key = true # Disable serving static files from the `/public` folder by default since # Apache or NGINX already handles this. config.public_file_server.enabled = ENV['RAILS_SERVE_STATIC_FILES'].present? # Compress JavaScripts and CSS. config.assets.js_compressor = :uglifier # config.assets.css_compressor = :sass # Do not fallback to assets pipeline if a precompiled asset is missed. config.assets.compile = false # `config.assets.precompile` and `config.assets.version` have moved to config/initializers/assets.rb # Enable serving of images, stylesheets, and JavaScripts from an asset server. # config.action_controller.asset_host = 'http://assets.example.com' # Specifies the header that your server uses for sending files. # config.action_dispatch.x_sendfile_header = 'X-Sendfile' # for Apache # config.action_dispatch.x_sendfile_header = 'X-Accel-Redirect' # for NGINX # Store uploaded files on the local file system (see config/storage.yml for options) config.active_storage.service = :local # Mount Action Cable outside main process or domain # config.action_cable.mount_path = nil # config.action_cable.url = 'wss://example.com/cable' # config.action_cable.allowed_request_origins = [ 'http://example.com', /http:\/\/example.*/ ] # Force all access to the app over SSL, use Strict-Transport-Security, and use secure cookies. - # config.force_ssl = true + config.force_ssl = false # Use the lowest log level to ensure availability of diagnostic information # when problems arise. config.log_level = :debug # Prepend all log lines with the following tags. config.log_tags = [ :request_id ] # Use a different cache store in production. # config.cache_store = :mem_cache_store # Use a real queuing backend for Active Job (and separate queues per environment) # config.active_job.queue_adapter = :resque # config.active_job.queue_name_prefix = "asdbot_#{Rails.env}" config.action_mailer.perform_caching = false # Ignore bad email addresses and do not raise email delivery errors. # Set this to true and configure the email server for immediate delivery to raise delivery errors. # config.action_mailer.raise_delivery_errors = false # Enable locale fallbacks for I18n (makes lookups for any locale fall back to # the I18n.default_locale when a translation cannot be found). config.i18n.fallbacks = true # Send deprecation notices to registered listeners. config.active_support.deprecation = :notify # Use default logging formatter so that PID and timestamp are not suppressed. config.log_formatter = ::Logger::Formatter.new # Use a different logger for distributed setups. # require 'syslog/logger' # config.logger = ActiveSupport::TaggedLogging.new(Syslog::Logger.new 'app-name') if ENV["RAILS_LOG_TO_STDOUT"].present? logger = ActiveSupport::Logger.new(STDOUT) logger.formatter = config.log_formatter config.logger = ActiveSupport::TaggedLogging.new(logger) end # Do not dump schema after migrations. config.active_record.dump_schema_after_migration = false end diff --git a/config/routes.rb b/config/routes.rb index 72ce3ff..26e27af 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -1,6 +1,8 @@ Rails.application.routes.draw do + root 'standardpage#home' post 'message_process', to: 'message#message_process' get 'classifica', to: 'standardpage#classifica' get 'grafico', to: 'standardpage#grafico' + get 'usernametoid', to: 'standardpage#usernametoid' # For details on the DSL available within this file, see http://guides.rubyonrails.org/routing.html end diff --git a/config/sidekiq.yml b/config/sidekiq.yml new file mode 100644 index 0000000..877d967 --- /dev/null +++ b/config/sidekiq.yml @@ -0,0 +1,4 @@ +:schedule: + SendAsdCountJob: + cron: "00 00 * * *" + class: "SendAsdCountJob" diff --git a/db/migrate/20190811222510_add_classifica_to_groups.rb b/db/migrate/20190811222510_add_classifica_to_groups.rb new file mode 100644 index 0000000..2394733 --- /dev/null +++ b/db/migrate/20190811222510_add_classifica_to_groups.rb @@ -0,0 +1,5 @@ +class AddClassificaToGroups < ActiveRecord::Migration[5.2] + def change + add_column :groups, :classifica, :boolean, default: true + end +end diff --git a/db/migrate/20190811222520_add_classifica_to_senders.rb b/db/migrate/20190811222520_add_classifica_to_senders.rb new file mode 100644 index 0000000..ed62a08 --- /dev/null +++ b/db/migrate/20190811222520_add_classifica_to_senders.rb @@ -0,0 +1,5 @@ +class AddClassificaToSenders < ActiveRecord::Migration[5.2] + def change + add_column :senders, :classifica, :boolean, default: true + end +end diff --git a/db/migrate/20190814132440_add_silent_to_groups.rb b/db/migrate/20190814132440_add_silent_to_groups.rb new file mode 100644 index 0000000..3e99eec --- /dev/null +++ b/db/migrate/20190814132440_add_silent_to_groups.rb @@ -0,0 +1,5 @@ +class AddSilentToGroups < ActiveRecord::Migration[5.2] + def change + add_column :groups, :silent, :boolean, default: false + end +end diff --git a/db/migrate/20190908140055_add_admin_to_groups.rb b/db/migrate/20190908140055_add_admin_to_groups.rb new file mode 100644 index 0000000..1a99d5d --- /dev/null +++ b/db/migrate/20190908140055_add_admin_to_groups.rb @@ -0,0 +1,6 @@ +class AddAdminToGroups < ActiveRecord::Migration[5.2] + def change + add_column :groups, :admin, :boolean + add_column :groups, :deletenotasd, :boolean + end +end diff --git a/db/migrate/20190911221023_add_eliminazione_to_groups.rb b/db/migrate/20190911221023_add_eliminazione_to_groups.rb new file mode 100644 index 0000000..4584fa9 --- /dev/null +++ b/db/migrate/20190911221023_add_eliminazione_to_groups.rb @@ -0,0 +1,5 @@ +class AddEliminazioneToGroups < ActiveRecord::Migration[5.2] + def change + add_column :groups, :eliminazione, :boolean, default: false + end +end diff --git a/db/schema.rb b/db/schema.rb index 9c7153e..29287e0 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -1,71 +1,79 @@ # This file is auto-generated from the current state of the database. Instead # of editing this file, please use the migrations feature of Active Record to # incrementally modify your database, and then regenerate this schema definition. # # Note that this schema.rb definition is the authoritative source for your # database schema. If you need to create the application database on another # system, you should be using db:schema:load, not running all the migrations # from scratch. The latter is a flawed and unsustainable approach (the more migrations # you'll amass, the slower it'll run and the greater likelihood for issues). # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema.define(version: 2019_08_11_141634) do +ActiveRecord::Schema.define(version: 2019_09_11_221023) do # These are extensions that must be enabled in order to support this database enable_extension "plpgsql" create_table "asds", force: :cascade do |t| t.bigint "group_id" t.bigint "sender_id" t.integer "update_id" t.datetime "created_at", null: false t.datetime "updated_at", null: false t.string "text" t.boolean "nightsend" t.integer "multiple_times" t.index ["group_id"], name: "index_asds_on_group_id" t.index ["sender_id"], name: "index_asds_on_sender_id" end create_table "crono_jobs", force: :cascade do |t| t.string "job_id", null: false t.text "log" t.datetime "last_performed_at" t.boolean "healthy" t.datetime "created_at", null: false t.datetime "updated_at", null: false t.index ["job_id"], name: "index_crono_jobs_on_job_id", unique: true end create_table "groups", force: :cascade do |t| t.bigint "chat_id" t.string "username" t.datetime "created_at", null: false t.datetime "updated_at", null: false t.boolean "welcomesent", default: false t.boolean "nightsend" + t.string "title" + t.boolean "classifica", default: true + t.boolean "silent", default: false + t.boolean "admin" + t.boolean "deletenotasd" + t.boolean "eliminazione", default: false end create_table "senders", force: :cascade do |t| t.integer "chat_id" t.string "username" t.datetime "created_at", null: false t.datetime "updated_at", null: false + t.string "name" + t.boolean "classifica", default: true end create_table "special_events", force: :cascade do |t| t.bigint "group_id" t.string "text" t.bigint "asd_id" t.datetime "created_at", null: false t.datetime "updated_at", null: false t.index ["asd_id"], name: "index_special_events_on_asd_id" t.index ["group_id"], name: "index_special_events_on_group_id" end add_foreign_key "asds", "groups" add_foreign_key "asds", "senders" add_foreign_key "special_events", "asds" add_foreign_key "special_events", "groups" end diff --git a/yarn.lock b/yarn.lock new file mode 100644 index 0000000..fb57ccd --- /dev/null +++ b/yarn.lock @@ -0,0 +1,4 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + +