muffinista / chatterbot Goto Github PK
View Code? Open in Web Editor NEWA straightforward ruby-based Twitter Bot Framework, using OAuth to authenticate.
Home Page: http://muffinlabs.com/
License: MIT License
A straightforward ruby-based Twitter Bot Framework, using OAuth to authenticate.
Home Page: http://muffinlabs.com/
License: MIT License
Can the bot follow and unfollow user?
Thanks.
It looks to me like reply tweets must start with an @ mention. This had me stuck for quite some time, so I created a small PR to update the examples documentation to clarify this point.
Thank you for this incredible gem.
Users/buzz/.rvm/gems/ruby-2.2.0/gems/chatterbot-1.0.1/lib/chatterbot/tweet.rb:29:in
reply': [DEPRECATION] #[:id] is deprecated. Use #id to fetch the value.`
I'm using streaming with the reply functionality. I would love to take a stab at fixing it.. where should i look?
I’m hoping to only retweet users that my account is following. Is there anything akin to only_interact_with_following
?
More details: I’ll search for phrases and then retweet results, but I only want my results to have accounts that I’m following (I don’t care if they’re following me).
Thanks.
I think I'm doing this wrong. When I include skip_retweets, I still get retweets in the results. My function is a "search and reply"
hypothetical example:
search("'lovely bones'", :skip_retweets => "true") do |tweet|
reply "#USER# Lovely bones is a great book", tweet
end
I also tried:
skip_retweets:true
and
:skip_retweets => true
Can you explain how to correctly skip retweets?
2nd issue: That search will bring up things like, "it is a lovely day today. my bones feel great."
Is there a way to only search the EXACT phrase?
Thanks.
after pasting the API Key
and API Secret
i get a raise on this line:
/Users/vincentcavallo/.rvm/gems/ruby-2.3.0/gems/oauth-0.5.0/lib/oauth/consumer.rb:217:in
token_request': 401 Authorization Required (OAuth::Unauthorized)`
I tried setting up a yml
file following the manual instructions and then running a bot command (tweet
, for instance) but that route also fails with this:
/Users/vincentcavallo/.rvm/gems/ruby-2.3.0/gems/twitter-5.14.0/lib/twitter/rest/response/raise_error.rb:15:in
on_complete': Could not authenticate you. (Twitter::Error::Unauthorized)`
I feel like I've followed all the different auth strategies offered by the documentation and nothing has worked. Any suggestions?
Getting this error when trying to run home_timeline on 0.9.3. Twitter is 5.8.0 and Ruby 2.2.0.
Here is the error:
check for home_timeline tweets since 0
/Users/jack.turnbull/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/twitter-5.8.0/lib/twitter/rest/response/raise_error.rb:17:in `on_complete': since_id parameter is invalid. (Twitter::Error::BadRequest)
from /Users/jack.turnbull/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/faraday-0.9.1/lib/faraday/response.rb:9:in `block in call'
from /Users/jack.turnbull/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/faraday-0.9.1/lib/faraday/response.rb:57:in `on_complete'
from /Users/jack.turnbull/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/faraday-0.9.1/lib/faraday/response.rb:8:in `call'
from /Users/jack.turnbull/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/faraday-0.9.1/lib/faraday/request/url_encoded.rb:15:in `call'
from /Users/jack.turnbull/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/faraday-0.9.1/lib/faraday/request/multipart.rb:14:in `call'
from /Users/jack.turnbull/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/twitter-5.8.0/lib/twitter/rest/request/multipart_with_file.rb:18:in `call'
from /Users/jack.turnbull/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/faraday-0.9.1/lib/faraday/rack_builder.rb:139:in `build_response'
from /Users/jack.turnbull/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/faraday-0.9.1/lib/faraday/connection.rb:377:in `run_request'
from /Users/jack.turnbull/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/faraday-0.9.1/lib/faraday/connection.rb:140:in `get'
from /Users/jack.turnbull/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/twitter-5.8.0/lib/twitter/rest/client.rb:92:in `request'
from /Users/jack.turnbull/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/twitter-5.8.0/lib/twitter/rest/client.rb:63:in `get'
from /Users/jack.turnbull/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/twitter-5.8.0/lib/twitter/request.rb:22:in `perform'
from /Users/jack.turnbull/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/twitter-5.8.0/lib/twitter/request.rb:42:in `perform_with_objects'
from /Users/jack.turnbull/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/twitter-5.8.0/lib/twitter/rest/utils.rb:48:in `perform_with_objects'
from /Users/jack.turnbull/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/twitter-5.8.0/lib/twitter/rest/timelines.rb:115:in `home_timeline'
from /Users/jack.turnbull/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/chatterbot-0.9.3/lib/chatterbot/home_timeline.rb:18:in `home_timeline'
from /Users/jack.turnbull/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/chatterbot-0.9.3/lib/chatterbot/dsl.rb:43:in `home_timeline'
from ./bot.rb:26:in `<main>'
And my code:
#!/usr/bin/env ruby
require 'rubygems'
require 'chatterbot/dsl'
consumer_key KEY
consumer_secret KEY
secret KEY
token KEY
# remove this to send out tweets
debug_mode
# remove this to update the db
no_update
# remove this to get less output when running
verbose
home_timeline do |tweet|
puts tweet
end
Not trying to do anything too difficult I don't think. Any ideas?
I found the streaming_tweets in dsl.rb however was not possible to generate a keyword (list) based stream.
Is that possible in the current version?
I setup the chatterbot search in a loop.
require 'chatterbot/dsl'
loop do
puts "Polling ... #{Time.now}"
search("'cloudfoundry'") do |tweet|
$stdout.puts tweet.inspect
end
sleep 60
end
But it always gets the same duplicate result. How to filter it out coz if I store it in DB, then the duplicate is aslo stored.
{:created_at=>"Wed, 07 Dec 2011 07:34:39 +0000", :from_user=>"UDCPStatus", :from_user_id=>425676094, :from_user_id_str=>"425676094", :from_user_name=>"UDCP Status", :geo=>nil, :id=>144318892062416896, :id_str=>"144318892062416896", :iso_language_code=>"ja", :metadata=>{:result_type=>"recent"}, :profile_image_url=>"http://a3.twimg.com/sticky/default_profile_images/default_profile_4_normal.png", :source=>"<a href="http://udcp.net/status/" rel="nofollow">Kiyoshi</a>", :text=>"【From http://t.co/ADejFNda】http://t.co/iE5YTJSv WEBサーバー正常稼働中です。 16:33:24", :to_user=>nil, :to_user_id=>nil, :to_user_id_str=>nil, :to_user_name=>nil}
{:created_at=>"Wed, 07 Dec 2011 07:34:37 +0000", :from_user=>"UDCPStatus", :from_user_id=>425676094, :from_user_id_str=>"425676094", :from_user_name=>"UDCP Status", :geo=>nil, :id=>144318884042915840, :id_str=>"144318884042915840", :iso_language_code=>"ja", :metadata=>{:result_type=>"recent"}, :profile_image_url=>"http://a3.twimg.com/sticky/default_profile_images/default_profile_4_normal.png", :source=>"<a href="http://udcp.net/status/" rel="nofollow">Kiyoshi</a>", :text=>"【From http://t.co/ADejFNda】http://t.co/2VOlnibh WEBサーバー正常稼働中です。 16:33:22", :to_user=>nil, :to_user_id=>nil, :to_user_id_str=>nil, :to_user_name=>nil}
I'd like to retweet and add a comment. According to this: https://twittercommunity.com/t/method-to-retweet-with-comment/35330/4 for this to work you should include the permalink of the tweet. Is there a simple way to get the permalink? I'm not seeing that in the documentation. Thanks!
Hi Muffinista,
Thanks for this awesome gem. I just wanted to let you know that when I used 'chatterbot-register' to setup my bot, the generated .yml file had the access_token and access_token_secret incorrectly switched.
I manually switched the YAML keys and the bot started working correctly.
I'm also experiencing and issue when trying to use "use_streaming"... without it, the bot works fine. With it I get an:
gems/twitter-5.16.0/lib/twitter/streaming/response.rb:21:in 'on_headers_complete': Twitter::Error::Unauthorized
Similar to what I experienced when the yml keys were incorrectly set. Thanks for the cool gem.
If the disk is full, seems like chatterbot will write a truncated empty config file, which is really bad.
Hi, I'm getting a lot of execution expired
errors when sending tweets.
I se over at sferik/twitter-ruby#401 that the solution is to adjust the Twitter config setup, the default being…
Twitter.configure do |config|
config.connection_options = Twitter::Default:: CONNECTION_OPTIONS.merge(:request => {
:open_timeout => 5,
:timeout => 10
})
end
Is there a more DSL
way to set these connection options to make the timeout longer?
Is it possible to follow a user using chatterbot? So if someone tweets, possible to retweet and follow user?
I'm having a bit of a problem with the Search function in your Chatterbot. I just want to preface this issue with the fact that I know almost nothing about Ruby or Twitter's API, so if I've done something incredibly noobish it's because I'm a noob. Go easy on me.
I tried to do a basic search and reply using this example code in the readme:
search("'surely you must be joking'") do |tweet|
reply "@#{tweet_user(tweet)} I am serious, and don't call me Shirley!", tweet
end
But I get this error every time:
/Users/WilyKit/.rvm/gems/ruby-2.1.3/gems/twitter-5.8.0/lib/twitter/rest/response/raise_error.rb:17:in `on_complete': Missing or invalid url parameter. (Twitter::Error::Forbidden)
from /Users/WilyKit/.rvm/gems/ruby-2.1.3/gems/faraday-0.9.0/lib/faraday/response.rb:9:in `block in call'
from /Users/WilyKit/.rvm/gems/ruby-2.1.3/gems/faraday-0.9.0/lib/faraday/response.rb:57:in `on_complete'
from /Users/WilyKit/.rvm/gems/ruby-2.1.3/gems/faraday-0.9.0/lib/faraday/response.rb:8:in `call'
from /Users/WilyKit/.rvm/gems/ruby-2.1.3/gems/faraday-0.9.0/lib/faraday/request/url_encoded.rb:15:in `call'
from /Users/WilyKit/.rvm/gems/ruby-2.1.3/gems/faraday-0.9.0/lib/faraday/request/multipart.rb:14:in `call'
from /Users/WilyKit/.rvm/gems/ruby-2.1.3/gems/twitter-5.8.0/lib/twitter/rest/request/multipart_with_file.rb:18:in `call'
from /Users/WilyKit/.rvm/gems/ruby-2.1.3/gems/faraday-0.9.0/lib/faraday/rack_builder.rb:139:in `build_response'
from /Users/WilyKit/.rvm/gems/ruby-2.1.3/gems/faraday-0.9.0/lib/faraday/connection.rb:377:in `run_request'
from /Users/WilyKit/.rvm/gems/ruby-2.1.3/gems/faraday-0.9.0/lib/faraday/connection.rb:140:in `get'
from /Users/WilyKit/.rvm/gems/ruby-2.1.3/gems/twitter-5.8.0/lib/twitter/rest/client.rb:92:in `request'
from /Users/WilyKit/.rvm/gems/ruby-2.1.3/gems/twitter-5.8.0/lib/twitter/rest/client.rb:63:in `get'
from /Users/WilyKit/.rvm/gems/ruby-2.1.3/gems/twitter-5.8.0/lib/twitter/rest/search.rb:32:in `search'
from /Users/WilyKit/.rvm/gems/ruby-2.1.3/gems/chatterbot-0.9.1/lib/chatterbot/search.rb:28:in `block in search'
from /Users/WilyKit/.rvm/gems/ruby-2.1.3/gems/chatterbot-0.9.1/lib/chatterbot/search.rb:26:in `each'
from /Users/WilyKit/.rvm/gems/ruby-2.1.3/gems/chatterbot-0.9.1/lib/chatterbot/search.rb:26:in `search'
from /Users/WilyKit/.rvm/gems/ruby-2.1.3/gems/chatterbot-0.9.1/lib/chatterbot/dsl.rb:23:in `search'
Any ideas why I can't make a simple search? Posting tweets works just fine. Any help is appreciated.
The following happens every time. I've made sure all creds are correct.
****************************************
****************************************
**** API SETUP TIME! ****
****************************************
****************************************
Hey, looks like you need to get an API key from Twitter before you can get started.
Please hit enter, and I will send you to https://dev.twitter.com/apps/new to start the process.
(If it doesn't work, you can open a browser and paste the URL in manually)
Hit Enter to continue.
Paste the 'Consumer Key' here: ***
Paste the 'Consumer Secret' here: ***
****************************************
****************************************
**** BOT AUTH TIME! ****
****************************************
****************************************
You need to authorize your bot with Twitter.
Please login to Twitter under the bot's account. When you're ready, hit Enter.
Your browser will open with the following URL, where you can authorize the bot.
https://api.twitter.com/oauth/authorize?oauth_token=***
If that doesn't work, you can open the URL in your browser manually.
Hit enter to start.
Paste your PIN and hit enter when you have completed authorization.
> ***
Looks like something went wrong, better luck next time!
= (
How do I make sure the bot doesn't reply to the same tweet every time?
The following loop replies to tweets it has already replied to each time the script runs.
replies do |tweet|
reply "Hi #USER#, thanks for your interest.", tweet
end
Hi,
I cloned the repo and tried to run rspec
, I found out that there are 3 specs failing
Failures:
1) Chatterbot::Search accepts multiple searches at once
Failure/Error: bot.search_client.should_receive(:search).with("foo -include:retweets", {:result_type=>"recent"})
Mock Twitter::Client received :search with unexpected arguments
expected: ("foo -include:retweets", {:result_type=>"recent"})
got: ("foo -include:retweets", {:result_type=>"recent", :since_id=>50}), ("bar -include:retweets", {:result_type=>"recent", :since_id=>50})
# ./spec/search_spec.rb:43:in `block (2 levels) in <top (required)>'
2) Chatterbot::Search accepts extra params
Failure/Error: bot.search_client.should_receive(:search).with("foo -include:retweets", {:lang => "en", :result_type=>"recent"})
Mock Twitter::Client received :search with unexpected arguments
expected: ("foo -include:retweets", {:lang=>"en", :result_type=>"recent"})
got: ("foo -include:retweets", {:lang=>"en", :result_type=>"recent", :since_id=>50})
# ./spec/search_spec.rb:53:in `block (2 levels) in <top (required)>'
3) Chatterbot::Search accepts a single search query
Failure/Error: bot.search_client.should_receive(:search).with("foo -include:retweets", {:result_type=>"recent"})
Mock Twitter::Client received :search with unexpected arguments
expected: ("foo -include:retweets", {:result_type=>"recent"})
got: ("foo -include:retweets", {:result_type=>"recent", :since_id=>50})
# ./spec/search_spec.rb:62:in `block (2 levels) in <top (required)>'
Finished in 1.57 seconds
139 examples, 3 failures
I didn't touch the code, so I assume it happens with everyone.
Hi,
I've downloaded the docker from here:
https://hub.docker.com/r/rubygem/chatterbot/
When I run the docker it simply outputs a log stating the various command options and then ends. I don't suppose you have any ideas how I proceed?
I understand this is outside of normal issue tracking hence will not be offended if it's closed without comment :)
can we add media to tweets ? I think looking at the code this would only be achievable by changing the update method to use the client client.update_with_media method or preferably add another method around that
Any experience running this on Heroku? I'm getting the following, which doesn't happen on my local environment. It's almost like the working directory or path isn't set right. I'm new to Ruby so I'm having difficulty debugging.
2015-10-07T07:12:01.854202+00:00 heroku[slug-compiler]: Slug compilation started
2015-10-07T07:12:01.854211+00:00 heroku[slug-compiler]: Slug compilation finished
2015-10-07T07:12:02.179574+00:00 heroku[worker.1]: State changed from crashed to starting
2015-10-07T07:12:05.156281+00:00 heroku[worker.1]: Starting process with command ruby suphypebot.rb
2015-10-07T07:12:05.836093+00:00 heroku[worker.1]: State changed from starting to up
2015-10-07T07:12:07.067031+00:00 app[worker.1]: from suphypebot.rb:4:in <main>' 2015-10-07T07:12:07.067009+00:00 app[worker.1]: from /app/vendor/ruby-2.0.0/lib/ruby/2.0.0/rubygems/core_ext/kernel_require.rb:55:in
require'
2015-10-07T07:12:07.066962+00:00 app[worker.1]: /app/vendor/ruby-2.0.0/lib/ruby/2.0.0/rubygems/core_ext/kernel_require.rb:55:in `require': cannot load such file -- chatterbot/dsl (LoadError)
2015-10-07T07:12:07.882005+00:00 heroku[worker.1]: State changed from up to crashed
2015-10-07T07:12:07.870906+00:00 heroku[worker.1]: Process exited with status 1
Also, I used the ClearDB addon for mysql, and Heroku's config vars to set the corresponding db_uri. Not sure if that's correct - can't test the DB connection until this is fixed
Hello @muffinista
I have created a nested level 2 direct_messages
block. Any ideas on how I would break out of it, and return to the level 1 direct_messages
block.
Using break
I get the error message;
``block (2 levels) in
Hi,
is it possible to set a place or a location for reply or tweet?
The Bot i created needs to set a random location somewhere in the world. It's part of the joke, because it's a parody account of an game character. :)
Thanks.
replies do |tweet|
puts "It's a tweet!"
end
Even something as simple as the above code is not working.
Can someone else verify too?
Hey,
I am trying to search further back. How young do tweets have to be for them to be returned when search is called? Is it possible to make this bot search earlier?
Thanks,
The links of pictures in http://muffinista.github.io/chatterbot/setup.html aren't correct.
I looked inside the code and couldn't find any methods that does retweet.
I can search and if found any tweet, I can tweet that tweet.
But I didn't find any method that handles the retweet.
Is there any method to retweet??
I looked into the code of this script where its possible to retweet. https://github.com/remko/retjilp/blob/master/retjilp.rb#L153-171
I have only_interact_with_followers uncommented in my file, but my bot still tweets at random people when I run. Am I missing something?
Hi,
Love this project :-).
I am seeing this errors trying to stream: /.rvm/gems/ruby-2.2.1/gems/twitter-5.14.0/lib/twitter/rest/response/raise_error.rb:15:in `on_complete': Could not authenticate you. (Twitter::Error::Unauthorized)
I have done some research and I think it's due to the oauth timestamp. My system clock seems to be in sync though. Credentials must be ok since everything else is working...
Ideas? :-)
Thanks!
Assuming this isn't a priority, but I'm still using this gem and thought I'd share that token
and secret
are incorrect in the docs, and instead it should be access_token
and access_token_secret
In a separate YAML config file. Create a file named botname.yaml – the botname part must match your bot’s username EXACTLY. Put the following contents, pasting the credential values that you just generated:
---
:consumer_secret: Consumer Secret (API Secret) GOES HERE
:consumer_key: Consumer Key (API Key) GOES HERE
:access_token: Access Token GOES HERE
:access_token_secret: Access Token Secret GOES HERE
```
I'm little confused.
What should be the table name and its columns to store the configs and tweets?
I mean the structure of the schema.
And do I need to reauthorize if I've already authorized using Yml file and now I want to move to db??
Do I have to put this in the yml file or else where?
:chatterbot_config: mysql://localhost/my_bot?user=root
Hi, chatterbot-register.rb fails on line 72 trying to rename the config file that doesn't exist yet.
I don't know if it's the right way of running the script but I simply copied it into the folder where I wanted my skeleton and ran it.
Error is
chatterbot-register.rb:72:in 'rename': No such file or directory @ sys_fail2 - (/Users/xxx/Workspace/bot/tmp_bot_name.yml, /Users/xxx/Workspace/bot/accountname.yml) (Errno::ENOENT)
I solved it by making it actually write the config file before the rename, I can issue a pull request if needed.
Thanks.
Hi @muffinista, your work is much appreciated. Using it successfully @opentxtbook (beta).
My question is Chatterbot able to attach jpeg/png
to a tweet/direct message
?
After you enter the pin, I get this:
/Users/jeremyweiland/.rvm/gems/ruby-1.9.3-p194@icrter/gems/chatterbot-0.6.2/lib/chatterbot/client.rb:137:in `get_screen_name': uninitialized constant Chatterbot::Client::JSON (NameError)
from /Users/jeremyweiland/.rvm/gems/ruby-1.9.3-p194@icrter/gems/chatterbot-0.6.2/lib/chatterbot/client.rb:160:in `login'
from /Users/jeremyweiland/.rvm/gems/ruby-1.9.3-p194@icrter/gems/chatterbot-0.6.2/lib/chatterbot/client.rb:92:in `require_login'
from /Users/jeremyweiland/.rvm/gems/ruby-1.9.3-p194@icrter/gems/chatterbot-0.6.2/bin/chatterbot-register:90:in `<top (required)>'
from /Users/jeremyweiland/.rvm/gems/ruby-1.9.3-p194@icrter/bin/chatterbot-register:23:in `load'
from /Users/jeremyweiland/.rvm/gems/ruby-1.9.3-p194@icrter/bin/chatterbot-register:23:in `<main>'
/Users/jeremyweiland/.rvm/gems/ruby-1.9.3-p194@icrter/gems/chatterbot-0.6.2/lib/chatterbot/client.rb:137:in `get_screen_name': uninitialized constant Chatterbot::Client::JSON (NameError)
from /Users/jeremyweiland/.rvm/gems/ruby-1.9.3-p194@icrter/gems/chatterbot-0.6.2/lib/chatterbot/client.rb:160:in `login'
from /Users/jeremyweiland/.rvm/gems/ruby-1.9.3-p194@icrter/gems/chatterbot-0.6.2/lib/chatterbot/client.rb:92:in `require_login'
from /Users/jeremyweiland/.rvm/gems/ruby-1.9.3-p194@icrter/gems/chatterbot-0.6.2/bin/chatterbot-register:90:in `<top (required)>'
from /Users/jeremyweiland/.rvm/gems/ruby-1.9.3-p194@icrter/bin/chatterbot-register:23:in `load'
from /Users/jeremyweiland/.rvm/gems/ruby-1.9.3-p194@icrter/bin/chatterbot-register:23:in `<main>'
Since a couple of weeks I get constant "Rate limit exceeded errors".
Seems like a call to "replies" is enough to trigger this, even without actually having any replies waiting?
Edit: The code for my bot can be seen here: https://github.com/jatocode/pequenoTweeter/blob/master/pequenoTweeter.rb
@muffinista; Are there any plans/work in progress to include the Twitter Automation Experience features into Chatterbot?
My app no longer seems to work anymore. Does anyone know about this happening and how to avoid it?
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.