Break code into modules.
Use ocamlbuild command to build cheesebot.
This commit is contained in:
		
							parent
							
								
									7732fdf877
								
							
						
					
					
						commit
						ff69981a5c
					
				
					 7 changed files with 95 additions and 47 deletions
				
			
		
							
								
								
									
										2
									
								
								.gitignore
									
										
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								.gitignore
									
										
									
									
										vendored
									
									
								
							| 
						 | 
					@ -13,3 +13,5 @@ cabal-dev
 | 
				
			||||||
# OCaml
 | 
					# OCaml
 | 
				
			||||||
*.cmo
 | 
					*.cmo
 | 
				
			||||||
*.cmi
 | 
					*.cmi
 | 
				
			||||||
 | 
					_build
 | 
				
			||||||
 | 
					*.native
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										1
									
								
								ocaml/_tags
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								ocaml/_tags
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1 @@
 | 
				
			||||||
 | 
					true: package(ssl,netclient,netstring,equeue-ssl)
 | 
				
			||||||
| 
						 | 
					@ -1,4 +0,0 @@
 | 
				
			||||||
ocamlfind ocamlc -o cheesebot -linkpkg \
 | 
					 | 
				
			||||||
  -package netclient,ssl,equeue-ssl,netstring \
 | 
					 | 
				
			||||||
  str.cma \
 | 
					 | 
				
			||||||
  main.ml
 | 
					 | 
				
			||||||
| 
						 | 
					@ -1,43 +0,0 @@
 | 
				
			||||||
open Str
 | 
					 | 
				
			||||||
open Ssl
 | 
					 | 
				
			||||||
open Http_client.Convenience
 | 
					 | 
				
			||||||
open Https_client;;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
Ssl.init();
 | 
					 | 
				
			||||||
Http_client.Convenience.configure_pipeline
 | 
					 | 
				
			||||||
(fun p ->
 | 
					 | 
				
			||||||
  let ctx = Ssl.create_context Ssl.TLSv1 Ssl.Client_context in
 | 
					 | 
				
			||||||
  let tct = Https_client.https_transport_channel_type ctx in
 | 
					 | 
				
			||||||
  p # configure_transport Http_client.https_cb_id tct
 | 
					 | 
				
			||||||
)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
(* Regexp required here *)
 | 
					 | 
				
			||||||
let is_youtube_url url =
 | 
					 | 
				
			||||||
  let regexp = Str.regexp "\\(https?\\://\\)?\\(www\\.\\)?\\(youtube\\.com\\)\\|\\(youtu\\.be\\)/.+" in
 | 
					 | 
				
			||||||
  Str.string_match regexp url 0
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
let get_body url =
 | 
					 | 
				
			||||||
  try Http_client.Convenience.http_get url with
 | 
					 | 
				
			||||||
  | Http_client.Http_error e -> "http error /o\\"
 | 
					 | 
				
			||||||
  | Failure f -> "http fail lol"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
(* Maybe have a list of functions and
 | 
					 | 
				
			||||||
 * iter on all the items in the list *)
 | 
					 | 
				
			||||||
let evaluate str =
 | 
					 | 
				
			||||||
  match str with
 | 
					 | 
				
			||||||
  | str when is_youtube_url str -> get_body str
 | 
					 | 
				
			||||||
  | _ -> str;;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
try
 | 
					 | 
				
			||||||
  while true do
 | 
					 | 
				
			||||||
    print_string "> ";
 | 
					 | 
				
			||||||
    let line = read_line () in
 | 
					 | 
				
			||||||
    let answer = evaluate line in
 | 
					 | 
				
			||||||
    print_endline answer
 | 
					 | 
				
			||||||
  done
 | 
					 | 
				
			||||||
with
 | 
					 | 
				
			||||||
  End_of_file -> print_endline "Bye!";;
 | 
					 | 
				
			||||||
							
								
								
									
										50
									
								
								ocaml/shell.ml
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										50
									
								
								ocaml/shell.ml
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,50 @@
 | 
				
			||||||
 | 
					open Str
 | 
				
			||||||
 | 
					open String
 | 
				
			||||||
 | 
					open Printf
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					(*open SimpleHttp*)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					open Ssl
 | 
				
			||||||
 | 
					open Http_client.Convenience
 | 
				
			||||||
 | 
					open Https_client
 | 
				
			||||||
 | 
					open Nethtml
 | 
				
			||||||
 | 
					open Netchannels;;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Ssl.init();
 | 
				
			||||||
 | 
					Http_client.Convenience.configure_pipeline
 | 
				
			||||||
 | 
					(fun p ->
 | 
				
			||||||
 | 
					  let ctx = Ssl.create_context Ssl.TLSv1 Ssl.Client_context in
 | 
				
			||||||
 | 
					  let tct = Https_client.https_transport_channel_type ctx in
 | 
				
			||||||
 | 
					  p # configure_transport Http_client.https_cb_id tct
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					let is_url url =
 | 
				
			||||||
 | 
					  let regexp = Str.regexp "\\(https?\\://\\)?www\\..+\\..+" in
 | 
				
			||||||
 | 
					  Str.string_match regexp url 0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					let is_youtube_url url =
 | 
				
			||||||
 | 
					  let regexp = Str.regexp "\\(https?\\://\\)?\\(www\\.\\)?\\(youtube\\.com\\)\\|\\(youtu\\.be\\)/.+" in
 | 
				
			||||||
 | 
					  Str.string_match regexp url 0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					(* Maybe have a list of functions and
 | 
				
			||||||
 | 
					 * iter on all the items in the list *)
 | 
				
			||||||
 | 
					let evaluate str =
 | 
				
			||||||
 | 
					  match str with
 | 
				
			||||||
 | 
					  | str when is_youtube_url str -> SimpleHttp.get_http_title (SimpleHttp.get_body str); str
 | 
				
			||||||
 | 
					  | str when is_url str -> SimpleHttp.get_http_title (SimpleHttp.get_body str); str
 | 
				
			||||||
 | 
					  | _ -> str
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					let () =
 | 
				
			||||||
 | 
					  try
 | 
				
			||||||
 | 
					    while true do
 | 
				
			||||||
 | 
					      print_string "> ";
 | 
				
			||||||
 | 
					      let line = read_line () in
 | 
				
			||||||
 | 
					      let answer = evaluate line in
 | 
				
			||||||
 | 
					      print_endline answer
 | 
				
			||||||
 | 
					    done
 | 
				
			||||||
 | 
					  with
 | 
				
			||||||
 | 
					    End_of_file -> print_endline "Bye!";;
 | 
				
			||||||
							
								
								
									
										1
									
								
								ocaml/shell.native
									
										
									
									
									
										Symbolic link
									
								
							
							
						
						
									
										1
									
								
								ocaml/shell.native
									
										
									
									
									
										Symbolic link
									
								
							| 
						 | 
					@ -0,0 +1 @@
 | 
				
			||||||
 | 
					/Users/fab/Code/cheesebot/ocaml/_build/shell.native
 | 
				
			||||||
							
								
								
									
										41
									
								
								ocaml/simpleHttp.ml
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										41
									
								
								ocaml/simpleHttp.ml
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,41 @@
 | 
				
			||||||
 | 
					open Str
 | 
				
			||||||
 | 
					open String
 | 
				
			||||||
 | 
					open Printf
 | 
				
			||||||
 | 
					open Ssl
 | 
				
			||||||
 | 
					open Http_client.Convenience
 | 
				
			||||||
 | 
					open Https_client
 | 
				
			||||||
 | 
					open Nethtml
 | 
				
			||||||
 | 
					open Netchannels;;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Ssl.init();
 | 
				
			||||||
 | 
					Http_client.Convenience.configure_pipeline
 | 
				
			||||||
 | 
					(fun p ->
 | 
				
			||||||
 | 
					  let ctx = Ssl.create_context Ssl.TLSv1 Ssl.Client_context in
 | 
				
			||||||
 | 
					  let tct = Https_client.https_transport_channel_type ctx in
 | 
				
			||||||
 | 
					  p # configure_transport Http_client.https_cb_id tct
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					let extract_string_value document =
 | 
				
			||||||
 | 
					  match document with
 | 
				
			||||||
 | 
					  | Nethtml.Data(s) -> s
 | 
				
			||||||
 | 
					  | _ -> ""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					let rec get_title_element document =
 | 
				
			||||||
 | 
					  match document with
 | 
				
			||||||
 | 
					  | Nethtml.Element(e, args, sub) -> Printf.printf "%s: %s" "Element\n" e
 | 
				
			||||||
 | 
					  | Nethtml.Data(s) -> Printf.printf "%s: %s" "Data\n" s
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					let get_http_title body =
 | 
				
			||||||
 | 
					  let ch = new Netchannels.input_string body in
 | 
				
			||||||
 | 
					  let doc = Nethtml.parse ch in
 | 
				
			||||||
 | 
					  get_title_element (List.hd doc)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					(* TODO: Log errors *)
 | 
				
			||||||
 | 
					let get_body url =
 | 
				
			||||||
 | 
					  try Http_client.Convenience.http_get url with
 | 
				
			||||||
 | 
					  | Http_client.Http_error e -> "http error /o\\"
 | 
				
			||||||
 | 
					  | Failure f -> "http fail lol"
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue