Guest User

Untitled

a guest
Mar 11th, 2018
286
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.95 KB | None | 0 0
  1. import scala.actors.Actor;
  2. import scala.collection.mutable.{HashMap, HashSet};
  3. import scala.actors.Actor._;
  4. import org.jivesoftware.smack._;
  5. import org.jivesoftware.smackx._;
  6. import org.jivesoftware.smack.packet._;
  7. import java.util.regex._;
  8.  
  9. case class Connected();
  10. case class Connect(user : String, password: String, server: String);
  11. case class Say(user : String, message: String);
  12. case class Said(user : String, message: String);
  13. case class Present(kind : Presence.Type, status : String);
  14. case class Listener(listener : Actor);
  15. case class Track(word : String);
  16. case class UnTrack(word : String);
  17. case class Tweet(tweet : String);
  18. case class Tweets();
  19. case class TweetDump(word : String, tweets : List[String]);
  20. case class Tracked(nick : String, tweet : String);
  21. case class TrackWords(trackwords : List[String]);
  22. case class UnTrackWords(trackwords : List[String]);
  23.  
  24. class Jabber extends Actor {
  25. def act = {
  26. loop {
  27. react {
  28. case Connect(user, password, server) => {
  29. val conn = new XMPPConnection(server);
  30. conn.connect()
  31. conn.login(user,password);
  32. reply(Connected());
  33. val jabber = self;
  34. conn.getChatManager().addChatListener(new ChatManagerListener() {
  35. def chatCreated(chat : Chat, createdLocally: boolean) {
  36. if(!createdLocally) {
  37. chat.addMessageListener(new MessageListener() {
  38. def processMessage(chat : Chat, message : Message) {
  39. jabber ! Said(chat.getParticipant(), message.getBody());
  40. }
  41. });
  42. }
  43. }
  44. })
  45. connectedLoop(conn, Nil)
  46. }
  47. }
  48. }
  49. }
  50. def connectedLoop(conn : XMPPConnection, listeners : List[Actor]) {
  51. loop {
  52. react {
  53. case Listener(listener) => {
  54. connectedLoop(conn, listener :: listeners);
  55. }
  56. case Said(user, message) => {
  57. if(message != null) {
  58. listeners.foreach(_ ! Said(user, message));
  59. }
  60. }
  61. case Say(user, message) => {
  62. val jabber = self;
  63. conn.getChatManager().createChat(user, new MessageListener() {
  64. def processMessage(chat : Chat, message : Message) {
  65. jabber ! Said(chat.getParticipant(), message.getBody());
  66. }
  67. }
  68. ).sendMessage(message);
  69. }
  70. case Present(kind, status) => {
  71. val presence = new Presence(kind);
  72. presence.setStatus(status);
  73. conn.sendPacket(presence);
  74. }
  75. }
  76. }
  77. }
  78. }
  79.  
  80. class TwitterWord(word : String) extends Actor {
  81. def act = {
  82. println("Starting up store for " + word);
  83. trackTweets(Nil);
  84. }
  85. def trackTweets(tweets : List[String]) {
  86. loop {
  87. react {
  88. case Tweet(tweet) => {
  89. trackTweets(tweet :: tweets);
  90. }
  91. case Tweets() => {
  92. reply(TweetDump(word, tweets));
  93. }
  94. }
  95. }
  96. }
  97. }
  98.  
  99. class TwitterTracker extends Actor {
  100. val track = Pattern.compile("\\(([^)]+)\\): (.*)", Pattern.MULTILINE | Pattern.DOTALL);
  101. val trackinglist = Pattern.compile("You are tracking: (.*)\\.", Pattern.MULTILINE | Pattern.DOTALL);
  102. val trackingnotify = Pattern.compile("You'll now receive updates matching '([^']+)'.*", Pattern.MULTILINE | Pattern.DOTALL);
  103. val trackingunnotify = Pattern.compile("You'll no longer receive updates that match '([^']+)'.*", Pattern.MULTILINE | Pattern.DOTALL);
  104. val stores = new HashMap[String, Actor];
  105.  
  106. def act = {
  107. val j = new Jabber().start
  108. j ! Listener(self);
  109. j ! Connect("trackingfeeds","biddulph","hackdiary.com")
  110. j ! Present(Presence.Type.available, "Scala");
  111. j ! Say("twitter@twitter.com", "track");
  112. react {
  113. case Connected() => {
  114. connectedAndWaitingForTrack(j);
  115. }
  116. }
  117. }
  118.  
  119. def connectedAndWaitingForTrack(jabber : Actor) {
  120. loop {
  121. react {
  122. case Said(user, message) => {
  123. processSaid(user, message);
  124. }
  125. case TrackWords(trackwords) => {
  126. trackWords(trackwords);
  127. connected(jabber);
  128. }
  129. }
  130. }
  131. }
  132.  
  133. def trackWords(trackwords : List[String]) {
  134. trackwords.foreach {
  135. word => {
  136. if(!stores.contains(word.toLowerCase)) {
  137. val store = new TwitterWord(word.toLowerCase).start
  138. stores += word.toLowerCase -> store;
  139. }
  140. }
  141. }
  142. }
  143. def unTrackWords(trackwords : List[String]) {
  144. trackwords.foreach {
  145. word => {
  146. stores -= word.toLowerCase;
  147. }
  148. }
  149. }
  150.  
  151. def connected(jabber : Actor) {
  152. loop {
  153. react {
  154. case TrackWords(trackwords) => {
  155. trackWords(trackwords);
  156. }
  157. case UnTrackWords(trackwords) => {
  158. unTrackWords(trackwords);
  159. }
  160. case Tracked(nick, tweet) => {
  161. stores.keySet.foreach {
  162. word => {
  163. if(tweet.toLowerCase.contains(word)) {
  164. stores(word) ! Tweet(nick + ": " + tweet);
  165. }
  166. }
  167. }
  168. }
  169. case Tweets() => {
  170. stores.keySet.foreach {
  171. store => stores(store) ! Tweets();
  172. }
  173. }
  174. case TweetDump(word, tweets) => {
  175. if(tweets.length > 0) {
  176. println(word + ": " + tweets);
  177. }
  178. }
  179. case UnTrack(word) => {
  180. if(stores.contains(word.toLowerCase)) {
  181. jabber ! Say("twitter@twitter.com", "track " + word.toLowerCase);
  182. println("Stopping tracking " + word);
  183. } else {
  184. println("Not tracking " + word);
  185. }
  186. }
  187. case Track(word) => {
  188. if(!stores.contains(word.toLowerCase)) {
  189. jabber ! Say("twitter@twitter.com", "track " + word.toLowerCase);
  190. println("Starting tracking " + word);
  191. } else {
  192. println("Already tracking " + word);
  193. }
  194. }
  195. case Said(user, message) => {
  196. processSaid(user, message);
  197. }
  198. }
  199. }
  200. }
  201. def processSaid(user: String, message: String) {
  202. val trackedmatch = track.matcher(message);
  203. val trackinglistmatch = trackinglist.matcher(message);
  204. val trackingnotifymatch = trackingnotify.matcher(message);
  205. val trackingunnotifymatch = trackingunnotify.matcher(message);
  206. if(trackedmatch.matches()) {
  207. self ! Tracked(trackedmatch.group(1), trackedmatch.group(2));
  208. } else if(trackinglistmatch.matches()) {
  209. self ! TrackWords(trackinglistmatch.group(1).split(", ").map { x => x.substring(1,x.length-1) }.toList)
  210. } else if(trackingnotifymatch.matches()) {
  211. self ! TrackWords(List(trackingnotifymatch.group(1)));
  212. } else if(trackingunnotifymatch.matches()) {
  213. self ! UnTrackWords(List(trackingunnotifymatch.group(1)));
  214. }
  215. }
  216. }
  217.  
  218. val t = new TwitterTracker().start
  219. while(true) {
  220. Thread.sleep(5000)
  221. t ! Tweets()
  222. }
Add Comment
Please, Sign In to add comment